Batalla Naval: Explicado código por código + DUDAS


#1

Estimados,

Comparto el código completo explicado, según mi entendimiento código por código.

Sigo con la inquetud de si esto es o no bueno, y me gustaría su opiñón sobre eso:

Por otro lado me quedaron 3 dudas que me gustaría me ayuden a responder:

  • ¿Por qué cuando asigno un valor random en por el largo de la fila y la columna tengo que colocar “-1” al final?
  • ¿Como hace Python, o que del código le dice a Python que es una lista 2d? Esto realmente no lo logro comprender! jajaja
  • Mientras el bucle for está en proceso, como es que se guarda temporalmente la información si no tengo ningún return? Esta es otra duda que me rompe la cabeza.

jaja

Espero podamos charlar al respecto.

Dejo el código:

import random #Importo la librería que me va a permitir crear valores random.

tablero = [] #creo una lista vacía llamada tablero.

for x in range(0,5): #Bucle que imprime una lista que contiene 5 listas. Desde acá podemos modificar el tamaño del tablero.  
  tablero.append(["O"] * 5) #Llamo a la lista vacía para darle contenido. 


def print_tablero(tablero): #Funcion convierte la lista en un tablero, llamando individualmente a cada fila y modificandola. 
  for fila in tablero: #Para cada fila en tablero:
    print " ".join(fila) #acá le pido que una todos los valores de la fila con una separación de un espacio.  


print u"¡Juguemos batalla naval!" #Primer print a observar
print_tablero(tablero) #Como la función ya tiene sentencia print, con solo llamarla imprime el tablero.


#En esta parte hay dos cosas que no comprendo, el valor del menos uno y como reconoce que la tabla es dos D y asigna valor a fila y colúmna, si eso alguien me lo puede explicar se agradece.
def fila_aleatoria(tablero): #Funcion aleatoria 1
  return random.randint(0,len(tablero)-1) # Le digo que para el largo de tablero, comenzando desde 0 asigne un valor aleatorio.

def columna_aleatoria(tablero):
  return random.randint(0,len(tablero[0])-1)# Le digo que para el ancho de tablero, comenzando desde 0 asigne un valor aleatorio.
  
  
#Nombro las funciones para poder llamarlas luego en los bucles. 
barco_fila = fila_aleatoria(tablero) 
barco_col = columna_aleatoria(tablero)



for turno in range(4): #Este bucle es el que va a permitir la continuidad del juego por "x" cantidad de turnos, en este caso cuatro y a su vez permite que momentaneamente se guarde la información del tablero. 
    adivina_fila = input("Adivina fila:") #Input con nombre para poder llamarla en el dato ingresado por el usuario.
    adivina_columna = input("Adivina columna:")
    print "Turno" + " " + str(turno+1) #Señala los turnos (el +1 es porque empieza a contar desde 0
    
    
    if adivina_fila == barco_fila and adivina_columna == barco_col: #Controla si el jugador acerto al los valores aleatoreos. 
      print u"¡Felicitaciones! ¡Hundiste mi barco!"
      break #En caso de haber acertado corta el bucle. 
  
  
    else: #¿que pasa si no gano en un solo tiro? 
      if (adivina_fila < 0 or adivina_fila > 4) or (adivina_columna < 0 or adivina_columna > 4): #Acá le digo que si es menor a 0 y mayor a cuatro, tanto en fila como columna, queda fuera del tablero. 
        print u"Vaya, esto ni siquiera está en el océano." #Las "u" antes de las comillas son por los carácteres únicos.


      elif(tablero[adivina_fila][adivina_columna] == "X"): #Esto nos dice que tiramos en el mismo lugar, buscando la "X"
        print "Ya dijiste esa."


      else: #Cualquier otra opción que no excede el errar, es errar al barco. já
      	print u"¡No impactaste mi barco!"
      	tablero[adivina_fila][adivina_columna] = "X"


    if turno == 3: #acá informamos que si llegamos a los tres turnos termina el juego. Recordemos que siempre empeiza contando de 0 
        print u"Terminó el juego"
    print_tablero(tablero)

#2

Hola arque, creo que la primer duda que tenés es porque esas funciones necesitan un número aleatorio entre 0 y (en este caso) 4. Pero la función len(tablero) retorna el número 5, por eso la necesidad de ese -1. ¿Podrá ser?
Yo también estoy aprendiendo y es muy útil este análisis del código.
Voy a tratar de pensar explicaciones para el resto de tus dudas.