from Mensajes import Mensajes
import random
class TaTeTi:
def __init__(self):
self.__tamanio = 9
self.__figJugador = "X"
self.__figCompu = "O"
self.__tablero = ["1", "2", "3", "4", "5", "6", "7", "8", "9"]
def play(self):
# Human starts first
turno = self.__figJugador
ganador = 0
# Set to 1, 2, or 3 when game is over
# Keep looping until someone wins or a tie
while ganador == 0:
if turno == self.__figJugador:
self.__mueveJugador()
turno = self.__figCompu
else:
self.__mueveComputadora()
turno = self.__figJugador
ganador = self.__verificarGanador()
Mensajes.messageInfo(self.__mostrarTablero() + "\n")
# Report the winner
if ganador == 1:
Mensajes.messageInfo("El juego ha terminado en empate.")
elif ganador == 2:
Mensajes.messageInfo("Jugador, has ganado! :)")
elif ganador == 3:
Mensajes.messageInfo("La computadora ha ganado! :(")
else:
Mensajes.messageInfo("¡Aquí hay un problema de lógica!")
def __mostrarTablero(self):
res = "\n"
res += self.__tablero[0] + " | " + self.__tablero[1] + " | " + self.__tablero[2]
res += "\n-----------\n"
res += self.__tablero[3] + " | " + self.__tablero[4] + " | " + self.__tablero[5]
res += "\n-----------\n"
res += self.__tablero[6] + " | " + self.__tablero[7] + " | " + self.__tablero[8]
res += "\n"
return res
"""
Check for a winner. Return
0 if no winner or tie yet
1 if it's a tie
2 if X won
3 if O won
"""
def __verificarGanador(self):
# Check horizontal wins
for i in range(0, 7, 3):
if self.__tablero[i] == self.__figJugador and self.__tablero[i + 1] == self.__figJugador and self.__tablero[i + 2] == self.__figJugador:
return 2
if self.__tablero[i] == self.__figCompu and self.__tablero[i + 1] == self.__figCompu and self.__tablero[i + 2] == self.__figCompu:
return 3
# Check vertical wins
for i in range(0, 3):
if self.__tablero[i] == self.__figJugador and self.__tablero[i + 3] == self.__figJugador and self.__tablero[i + 6] == self.__figJugador:
return 2
if self.__tablero[i] == self.__figCompu and self.__tablero[i + 3] == self.__figCompu and self.__tablero[i + 6] == self.__figCompu:
return 3
# Check for diagonal wins
if (self.__tablero[0] == self.__figJugador and self.__tablero[4] == self.__figJugador and self.__tablero[8] == self.__figJugador) or (
self.__tablero[2] == self.__figJugador and self.__tablero[4] == self.__figJugador and self.__tablero[6] == self.__figJugador
):
return 2
if (self.__tablero[0] == self.__figCompu and self.__tablero[4] == self.__figCompu and self.__tablero[8] == self.__figCompu) or (
self.__tablero[2] == self.__figCompu and self.__tablero[4] == self.__figCompu and self.__tablero[6] == self.__figCompu
):
return 3
# Check for tie
for i in range(0, self.__tamanio):
# If we find a number, then no one has won yet
if self.__tablero[i] != self.__figJugador and self.__tablero[i] != self.__figCompu:
return 0
# If we make it through the previous loop, all places are taken, so it's a tie
return 1
def __mueveJugador(self):
mueve = -1
while mueve == -1:
try:
mueve = Mensajes.requestInt(self.__mostrarTablero() + "\n\n Ingrese su movimiento")
while (
mueve < 1
or mueve > self.__tamanio
or self.__tablero[mueve - 1] == self.__figJugador
or self.__tablero[mueve - 1] == self.__figCompu
):
if mueve < 1 or mueve > self.__tamanio:
Mensajes.messageInfo("Por favor, ingrese un movimiento entre 1 y " + str(tamanio) + ".")
else:
Mensajes.messageInfo("Ese espacio esta ocupado. Por favor escoge otro espacio.")
mueve = Mensajes.requestInt(self.__mostrarTablero() + "\n\n Ingrese su movimiento: ")
except Exception as ex:
Mensajes.messageInfo(ex)
self.__tablero[mueve - 1] = self.__figJugador
def __mueveComputadora(self):
mueve = -1
# First see if there's a move O can make to win
for i in range(0, self.__tamanio):
if self.__tablero[i] != self.__figJugador and self.__tablero[i] != self.__figCompu:
curr = self.__tablero[i]
self.__tablero[i] = self.__figCompu
if self.__verificarGanador() == 3:
Mensajes.messageInfo("La computadora esta moviendo a: " + str(i + 1))
return
else:
self.__tablero[i] = curr
# See if there's a move O can make to block X from winning
for i in range(0, self.__tamanio):
if self.__tablero[i] != self.__figJugador and self.__tablero[i] != self.__figCompu:
curr = self.__tablero[i]
self.__tablero[i] == self.__figJugador
if self.__verificarGanador() == 2:
self.__tablero[i] = self.__figCompu
Mensajes.messageInfo("La computadora esta moviendo a: " + str(i + 1))
return
else:
self.__tablero[i] = curr
# Generate random move
while True:
mueve = random.randrange(self.__tamanio)
if self.__tablero[mueve] != self.__figJugador and self.__tablero[mueve] != self.__figCompu:
break
Mensajes.messageInfo("La computadora se esta movimiento a: " + str(mueve + 1))
self.__tablero[mueve] = self.__figCompu