Foro de elhacker.net

Programación => Scripting => Mensaje iniciado por: Joe Fraddy en 28 Enero 2015, 18:54 pm



Título: Batalla naval Python!!! [RESUELTO]
Publicado por: Joe Fraddy en 28 Enero 2015, 18:54 pm
Hola amigos, ahora estoy en un ejercicio de elaborar un juego llamado batalla naval, y no he entendido lo que se me pide hacer (se supone que vamos haciendo el código paso a paso).

Las instrucciones son estas:

Citar
01. Agregá una sentencia elif que verifique si la ubicación ya tiene una 'X'.
02. Si la tiene, mostrá "Ya dijiste esa."

Este es mi código:

Código:
import random

tablero = []

for x in range(0,5):
  tablero.append(["O"] * 5)

def print_tablero(tablero):
  for fila in tablero:
    print " ".join(fila)

print_tablero(tablero)

def fila_aleatoria(tablero):
  return random.randint(0,len(tablero)-1)

def columna_aleatoria(tablero):
return random.randint(0,len(tablero[0])-1)

barco_fila = fila_aleatoria(tablero)
barco_columna = columna_aleatoria(tablero)
adivina_fila = input("Adivina fila:")
adivina_columna = input("Adivina columna:")

print barco_fila
print barco_columna

# escribí tu código a continuación.
if adivina_fila == barco_fila:
    print "Felicitaciones, Hundiste mi barco!"
else:
    print "Agua, no tocaste mi barco"
    if adivina_fila not in range(5) or adivina_columna not in range(5):
        print "Huy, eso ni siquiera esta en el oceano"
    else:
        print "Aquí no ha pasado nada"
elif  board[adivina_fila][adivina_columna] == 'X':
    print "Ya dijiste esa"

Parece que lo que esta mal es la última parte:

Código:
elif  board[adivina_fila][adivina_columna] == 'X':
    print "Ya dijiste esa"

El error del interprete es:

Código:
  File "python", line 37
    elif  board[adivina_fila][adivina_columna] == 'X':
       ^
SyntaxError: invalid syntax


Título: Re: Batalla naval Python!!!
Publicado por: engel lex en 28 Enero 2015, 19:30 pm
la sintaxis está mala, primero debe ir elif que else...

es decir... lo tuyo se interpreta algo como

el compilador llega al primer if y lo salta porque no cumple, como hay else ejecuta automáticamente eso... luego se consigue con un elif que no pertenece a nadie porque no hay condiciones if sin resolverse

el doeen siempre debe ser IF -> [ELIF ]-> [ELSE]


Título: Re: Batalla naval Python!!!
Publicado por: Joe Fraddy en 28 Enero 2015, 20:40 pm
Si, ya me había percatado de eso, y he reacomodado el código:

Código:
import random

tablero = []

for x in range(0,5):
  tablero.append(["O"] * 5)

def print_tablero(tablero):
  for fila in tablero:
    print " ".join(fila)

print_tablero(tablero)

def fila_aleatoria(tablero):
  return random.randint(0,len(tablero)-1)

def columna_aleatoria(tablero):
return random.randint(0,len(tablero[0])-1)

barco_fila = fila_aleatoria(tablero)
barco_columna = columna_aleatoria(tablero)
adivina_fila = input("Adivina fila:")
adivina_columna = input("Adivina columna:")

print barco_fila
print barco_columna

if adivina_fila == barco_fila:
    print "Felicitaciones, Hundiste mi barco!"

# Codigo reacomodado
elif  board[adivina_fila][adivina_columna] == 'X':
    print "Ya dijiste esa"

else:
    print "Agua, no tocaste mi barco"
    if adivina_fila not in range(5) or adivina_columna not in range(5):
        print "Huy, eso ni siquiera esta en el oceano"
    else:
        print "Aquí no ha pasado nada"

pero creo que tengo problemas con el módulo, eso es lo que me dice el interprete:

Citar
Traceback (most recent call last):
  File "python", line 31, in <module>
NameError: name 'board' is not defined


Título: Re: Batalla naval Python!!!
Publicado por: Eleкtro en 28 Enero 2015, 20:59 pm
Citar
pero creo que tengo problemas con el módulo, eso es lo que me dice el interprete:

Citar
Traceback (most recent call last):
  File "python", line 31, in <module>
NameError: name 'board' is not defined

El error se está explicando por si mismo. No existe ningún miembro deifnido en el código con el nombre 'board', quizás quisiste decir 'tablero', que es como se llama tu lista:

Código
  1. import random
  2.  
  3. tablero = []
  4.  
  5. ...

Saludos.


Título: Re: Batalla naval Python!!!
Publicado por: Joe Fraddy en 28 Enero 2015, 21:14 pm
Si, efectivamente tenia que poner tablero, en vez de board, pensé que board era alguna función de random.

Pero ahora creo que hay un problema de conversión, que no logro entender, el depurador me saca esto:

Código:
Traceback (most recent call last):
  File "python", line 38, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 3: ordinal not in range(128)


Título: Re: Batalla naval Python!!!
Publicado por: Eleкtro en 28 Enero 2015, 21:24 pm
Algo relacionado con problemas de codificación y su solución ya se te explicó aquí:
Problema en python [alguno me ayuda?? (http://foro.elhacker.net/buscador-t428107.0.html)

vuelve a leer atentamente :P

Pero en esta ocasión el error parece tener que ver con la codificación de la shell (no como en la otra pregunta), prueba así

Código
  1. # encoding=utf8  
  2. import sys  
  3.  
  4. reload(sys)  
  5. sys.setdefaultencoding('utf8')

saludos


Título: Re: Batalla naval Python!!!
Publicado por: Joe Fraddy en 28 Enero 2015, 21:50 pm
No parece que ese no es problema, me manda un error al correrlo:

Citar
Unknown Error: O O O O O


Título: Re: Batalla naval Python!!!
Publicado por: engel lex en 28 Enero 2015, 23:01 pm
aprende a usar un debugger :P

http://www.pythontutor.com/visualize.html (http://www.pythontutor.com/visualize.html)

más fácil que eso no hay jejeje

ahí deberias ver las fallas de codigo mejor que nada


Título: Re: Batalla naval Python!!!
Publicado por: Joe Fraddy en 28 Enero 2015, 23:10 pm
aprende a usar un debugger :P

http://www.pythontutor.com/visualize.html (http://www.pythontutor.com/visualize.html)

más fácil que eso no hay jejeje

ahí deberias ver las fallas de codigo mejor que nada

Es que el problema es que este es un interprete html y creo que no va con el código real, lo que hago son ejercicios, que a veces esta bien, pero simplemente no corren porque esta hecho en web


Título: Re: Batalla naval Python!!!
Publicado por: engel lex en 28 Enero 2015, 23:26 pm
para tu ejercicio corre bien ;)

y hasta ahora los codigos que he probado funcionan :P

intentalo


Título: Re: Batalla naval Python!!!
Publicado por: Joe Fraddy en 29 Enero 2015, 16:36 pm
Ya, creo que el error 38 era por un acento que tenia, pero ahora en la linea 31 tengo un error y no se que esta mal, este es el código:

Código:
elif  tablero[adivina_fila][adivina_columna] == "X":

tablero es una lista bacía y los dos argumentos son dos variables de entrada que almacenan dos strings.


Título: Re: Batalla naval Python!!!
Publicado por: Eleкtro en 29 Enero 2015, 17:10 pm
en la linea 31 tengo un error y no se que esta mal

¿Y cual es el mensaje de error?, no somos adivinos.



Código:
elif  tablero[adivina_fila][adivina_columna] == "X":
tablero es una lista bacía

Creo que tú mismo lo has resuelto sin darte cuenta: Estás intentando acceder a un elemento inexistente, por que la lista está vacía, así pues dará un error de índice fuera de rango.

Solo debes inicializar la lista antes de intentar usarla en la condicional que has mostrado.

Ejemplo funcional:
Código
  1. matrix = [
  2.           ["A0","B0"],
  3.           ["A1","B1"]
  4.         ]
  5.  
  6. if matrix[1][1] == 'A1':
  7.    pass; # Do Nothing.
  8.  
  9. elif matrix[1][1] == 'B1':
  10.    print "Felicitaciones, Hundiste mi barco!"

Si tienes otro tipo de error, especifíca el mensaje de error.

Saludos!


Título: Re: Batalla naval Python!!!
Publicado por: Joe Fraddy en 29 Enero 2015, 18:03 pm
Saben cual era el error???

el mensaje:

había escrito:

Código:
print 'Ya dijiste esa'

y era:

Código:
print 'Ya dijiste esa.'

Era el (.) Punto lo que no me dejaba concluir el ejercicio y como no detectaba el error del interprete ps no sabía, pero de todos modos aprendí!!! eso es lo importante xD


Título: Re: Batalla naval Python!!! [Ejercicio terminado]
Publicado por: Joe Fraddy en 29 Enero 2015, 19:23 pm
Bueno, gracias por su ayuda, les dejo el ejercicio terminado, quizá mas adelante le pueda servir a alguien:

Código
  1. import random
  2.  
  3. tablero = []
  4.  
  5. for x in range(0,5):
  6.  tablero.append(["O"] * 5)
  7.  
  8. def print_tablero(tablero):
  9.  for fila in tablero:
  10.    print " ".join(fila)
  11.  
  12. print "Juguemos as la batalla naval!"
  13. print_tablero(tablero)
  14.  
  15. def fila_aleatoria(tablero):
  16.  return random.randint(0,len(tablero)-1)
  17.  
  18. def columna_aleatoria(tablero):
  19.  return random.randint(0,len(tablero[0])-1)
  20.  
  21. barco_fila = fila_aleatoria(tablero)
  22. barco_columna = columna_aleatoria(tablero)
  23. print barco_fila
  24. print barco_columna
  25.  
  26. for turn in range(4):
  27.    adivina_fila = input("Adivina fila: ")
  28.    adivina_columna = input("Adivina columna: ")
  29.  
  30.    if adivina_fila == barco_fila and adivina_columna == barco_columna:
  31.      print "Felicitaciones! Hundiste mi barco!"
  32.    else:
  33.      if (adivina_fila < 0 or adivina_fila > 4) or (adivina_columna < 0 or adivina_columna > 4):
  34.        print "Huy, eso ni siquiera esta en el oceano."
  35.      elif(tablero[adivina_fila][adivina_columna] == "X"):
  36.        print "Ya dijiste esa."
  37.      else:
  38.       print "No tocaste mi barco!"
  39.       tablero[adivina_fila][adivina_columna] = "X"
  40.  
  41.    if turn == 3:
  42.        print 'Fin del juego'
  43.        break
  44.    print_tablero(tablero)
  45.    print 'Turno', turn+1
  46.