Python error : list index out of range

Hola, soy bastante novato en python por esos estoy tratando de hacer el juego de Tic, tac, toe para mejorar. Por supuesto todavía no esta terminado, pero obtengo un error al tratar de añadir elementos a una lista y despues escogerlos aleatoria mente con la función choice() El código:

import random

tablero = []
for fila in range(0, 3):
    tablero.append(["O"] * 3)

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

#TURNO JUGADOR
tj = input("PRIMERA JUGADA")#turno jugador

if tj == 1: tablero[0][0] = "X"
elif tj == 2: tablero[0][1] = "X"
elif tj == 3: tablero[0][2] = "X"
elif tj == 4: tablero[1][0] = "X"
elif tj == 5: tablero[1][1] = "X"
elif tj == 6: tablero[1][2] = "X"
elif tj == 7: tablero[2][0] = "X"
elif tj == 8: tablero[2][1] = "X"
elif tj == 9: tablero[2][2] = "X"
else : print u"Introduce un número entre 1 y 9"

#TURNO ORDENADOR
randoms = []
t_pc = random.choice(randoms)#EL ERROR ESTA AQUÍ

if tablero[0][0] != "X": randoms.append(1)
elif tablero[0][1] != "X": randoms.append(2)
elif tablero[0][2] != "X": randoms.append(3)
elif tablero[1][0] != "X": randoms.append(4)
elif tablero[1][1] != "X": randoms.append(5)
elif tablero[1][2] != "X": randoms.append(6)
elif tablero[2][0] != "X": randoms.append(7)
elif tablero[2][1] != "X": randoms.append(8)
elif tablero[2][2] != "X": randoms.append(9)

print t_pc
print_tab(tablero)
Ai7or21 escribió:Hola, soy bastante novato en python por esos estoy tratando de hacer el juego de Tic, tac, toe para mejorar. Por supuesto todavía no esta terminado, pero obtengo un error al tratar de añadir elementos a una lista y despues escogerlos aleatoria mente con la función choice() El código:

import random

tablero = []
for fila in range(0, 3):
    tablero.append(["O"] * 3)

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

#TURNO JUGADOR
tj = input("PRIMERA JUGADA")#turno jugador

if tj == 1: tablero[0][0] = "X"
elif tj == 2: tablero[0][1] = "X"
elif tj == 3: tablero[0][2] = "X"
elif tj == 4: tablero[1][0] = "X"
elif tj == 5: tablero[1][1] = "X"
elif tj == 6: tablero[1][2] = "X"
elif tj == 7: tablero[2][0] = "X"
elif tj == 8: tablero[2][1] = "X"
elif tj == 9: tablero[2][2] = "X"
else : print u"Introduce un número entre 1 y 9"

#TURNO ORDENADOR
randoms = []
t_pc = random.choice(randoms)#EL ERROR ESTA AQUÍ

if tablero[0][0] != "X": randoms.append(1)
elif tablero[0][1] != "X": randoms.append(2)
elif tablero[0][2] != "X": randoms.append(3)
elif tablero[1][0] != "X": randoms.append(4)
elif tablero[1][1] != "X": randoms.append(5)
elif tablero[1][2] != "X": randoms.append(6)
elif tablero[2][0] != "X": randoms.append(7)
elif tablero[2][1] != "X": randoms.append(8)
elif tablero[2][2] != "X": randoms.append(9)

print t_pc
print_tab(tablero)


Obtienes un error...¿cual?
tom_deluxe escribió:Obtienes un error...¿cual?

list index out of range.

Yo no soy un experto en Python, pero si tengo mis años en programación. Y hay algunas cosas que me llama la atención:
tablero = []
for fila in range(0, 3):
    tablero.append(["O"] * 3)
def print_tab(tablero):
    for fila in tablero:
        print " ".join(fila)
   
print_tab(tablero)

Mezclar código, declaración, invocación... No es adecuado.

Separa funciones del código principal, no mezcles entre medias.

Siguiendo el código:
tj = input("PRIMERA JUGADA")#turno jugador

if tj == 1: tablero[0][0] = "X"
elif tj == 2: tablero[0][1] = "X"
elif tj == 3: tablero[0][2] = "X"
elif tj == 4: tablero[1][0] = "X"
elif tj == 5: tablero[1][1] = "X"
elif tj == 6: tablero[1][2] = "X"
elif tj == 7: tablero[2][0] = "X"
elif tj == 8: tablero[2][1] = "X"
elif tj == 9: tablero[2][2] = "X"
else : print u"Introduce un número entre 1 y 9"


Esto no es adecuado, ya que tienes un índice númerico y una matriz lo ideal sería que lo aprovecharas.

Pide dos coordenadas al usuario (x,y):
x = input("POSICIONX")#turno jugador
y = input("POSICIONY")

tablero[x][y] = "X"


Y ya llegando al error en cuestión, no entiendo porque haces una elección aleatoria y luego después examinas el campo. En todo caso sería al reves no? :-?

Te propongo la siguiente alternativa:

x = random.choice(range(0,3))
y = random.choice(range(0,3))

while tablero[x][y] == "X":
    x = random.choice(range(0,3))
    y = random.choice(range(0,3))

tablero[x][y] = "X"


La idea es la siguiente:

- Genero unas coordendas X e Y aleatorias.
- ¿La posición estaba ya ocupada? En ese caso las vuelvo a generar una y otra vez hasta que encuentre una posición libre.

Esto te debería ir.

PD: El error creo que es porque intentabas sacar un numero aleatorio de una lista vacía.
http://docs.python.org/2/library/random.html

random.choice(seq)¶
Return a random element from the non-empty sequence seq. If seq is empty, raises IndexError.
tom_deluxe escribió:http://docs.python.org/2/library/random.html

random.choice(seq)¶
Return a random element from the non-empty sequence seq. If seq is empty, raises IndexError.

Pues si, era porque intentaba sacar un número aleatorio de una lista vacia.
amchacon escribió:
tom_deluxe escribió:http://docs.python.org/2/library/random.html

random.choice(seq)¶
Return a random element from the non-empty sequence seq. If seq is empty, raises IndexError.

Pues si, era porque intentaba sacar un número aleatorio de una lista vacia.

Pues esa es la cuestión que no entiendo porque esta vacía si con esta parte del código la lleno:
randoms = []
t_pc = random.choice(randoms)#EL ERROR ESTA AQUÍ

if tablero[0][0] != "X": randoms.append(1)
elif tablero[0][1] != "X": randoms.append(2)
elif tablero[0][2] != "X": randoms.append(3)
elif tablero[1][0] != "X": randoms.append(4)
elif tablero[1][1] != "X": randoms.append(5)
elif tablero[1][2] != "X": randoms.append(6)
elif tablero[2][0] != "X": randoms.append(7)
elif tablero[2][1] != "X": randoms.append(8)
elif tablero[2][2] != "X": randoms.append(9)

PD: Gracias por tus consejos!
Olvidate de los ifs, tan solo fijate en las dos primeras lineas:
randoms = []
t_pc = random.choice(randoms)#EL ERROR ESTA AQUÍ

Creas una lista vacía y despues llamas a random.choice con ella.

Ahí está el error. Si la vas a llenar hazlo antes de llamar a la función random.choice, no después.
amchacon escribió:Olvidate de los ifs, tan solo fijate en las dos primeras lineas:
randoms = []
t_pc = random.choice(randoms)#EL ERROR ESTA AQUÍ

Creas una lista vacía y despues llamas a random.choice con ella.

Ahí está el error. Si la vas a llenar hazlo antes de llamar a la función random.choice, no después.


Gracias, no se como puedo estar tan ciego xD
7 respuestas