Código Python:
Ver originalfrom Humano import Humano
from Computadora import Computadora
from Estado import Estado
from Movimiento import Movimiento
from Tablero import Tablero
from Mensajes import Mensajes
class Juego:
def __init__(self):
j1, j2 = "", ""
self.__jugadores = []
opcion = -1
while opcion < 0 or opcion > 2:
opcion = Mensajes.requestInt("Elige modo de juego:\n[0. CPU vs CPU] [1. Jug. vs CPU] [2. Jug. vs Jug.]")
if opcion == 0:
self.__jugadores.append(Computadora("HAL1", "o"))
self.__jugadores.append(Computadora("HAL2", "x"))
elif opcion == 1:
j1 = Mensajes.requestAlpha("Jugador 1, ingresa tu nombre")
self.__jugadores.append(Humano(j1, "o"))
self.__jugadores.append(Computadora("HAL", "x"))
elif opcion == 2:
j1 = Mensajes.requestAlpha("Jugador 1, ingresa tu nombre")
j2 = Mensajes.requestAlpha("Jugador 2, ingresa tu nombre")
self.__jugadores.append(Humano(j1, "o"))
self.__jugadores.append(Humano(j2, "x"))
else:
Mensajes.messageInfo("ERROR: el número de usuarios debe incluirse entre 0 y 2")
caracteres = ["o", "x"]
self.__tablero = Tablero(3, caracteres)
self.__estado = Estado.ENCURSO
"""
Contiene el bucle del juego, simplemente alterna jugadores
hasta que el juego termina
"""
def play(self):
marcarTurno = 0
jugadorActual = self.__jugadores[0]
# Mientras el juego esta arrancando...
while self.__estado == Estado.ENCURSO:
# Orquesta la alternancia del jugador mencionada anteriormente
jugadorActual = self.__jugadores[marcarTurno % 2]
movimiento = Movimiento.FRACASO
"""
Bucle de retroalimentación interna que se ejecuta hasta que el
jugador finaliza con éxito su turno
"""
while movimiento == Movimiento.EXITO:
# Obtiene la elección del movimiento de los jugadores
indiceElegido = jugadorActual.hacerMovimiento(tablero)
# Intentos de hacer movimiento
movimiento = self.__tablero.aplicarMarcador(indiceElegido, jugadorActual.getCaracter())
# Imprime el tablero después de cada turno.
Mensajes.messageInfo(tablero.mostrar() + "\n" + jugadorActual.getNombre() + " escoge: " + str(indiceElegido))
"""
Informa al usuario de los resultados indeseables que
requieren una acción adicional.
"""
if movimiento == Movimiento.FUERADERANGO:
Mensajes.messageInfo("Por favor escoge un indice que esté en el rango")
elif movimiento == Movimiento.ESPACIOTOMADO:
Mensajes.messageInfo("El espacio del cuadrado " + str(indiceElegido) + " esta tomado.")
# Actualiza el estado del juego cada turno
self.actualizarEstadoJuego()
marcarTurno += 1
"""
Salió del bucle el juego, por lo que debe haber finalizado, por lo
que debemos informar a los jugadores del resultado
"""
if self.__estado == Estado.EMPATE:
Mensajes.messageInfo("Empate!")
elif self.__estado == Estado.HAYGANADOR:
Mensajes.messageInfo(jugadorActual.getNombre() + " gana el TATETI")
# Actualiza el estado global del juego
def actualizarEstadoJuego(self):
if self.__hayGanador() is True:
self.__estado = Estado.HAYGANADOR
elif self.__esGato() is True:
self.__estado = Estado.EMPATE
"""
Simplemente dice que el es un gato si el tablero está lleno
y nadie ganó todavía
"""
def __esGato(self):
cuadrados = self.__tablero.getCuadrado()
for i in range(1, len(cuadrados)):
if cuadrados[i] == '_':
return False
return self.__tablero.configuracionGanadora() is False
def __hayGanador(self):
return self.__tablero.configuracionGanadora() is True
Código Python:
Ver originalfrom abc import ABCMeta
import abc
class Jugador(metaclass=ABCMeta):
def __init__(self, xnombre, xcaracter):
self._nombre = xnombre
self._caracter = xcaracter
def getNombre(self):
return self._nombre
def setNombre(self, nombre):
self._nombre = nombre
def getCaracter(self):
return self._caracter
def setCaracter(self, caracter):
self._caracter = caracter
@abc.abstractmethod
def hacerMovimiento(self, tablero):
pass
Código Python:
Ver originalfrom Jugador import Jugador
from Mensajes import Mensajes
class Humano(Jugador):
def __init__(self, xnombre, xcaracter):
Jugador.__init__(self, xnombre, xcaracter)
def hacerMovimiento(self, tablero):
return Mensajes.requestInt(tablero.mostrar() + "\n" + self._nombre + ", por favor seleccione un cuadrado")
Código Python:
Ver originalfrom Jugador import Jugador
class Computadora(Jugador):
def __init__(self, xnombre, xcaracter):
Jugador.__init__(self, xnombre, xcaracter)
"""
Aquí es donde implementamos la IA de este sistema siguiendo el método simple
que fue escrito durante el laboratorio:
******* 1. Gana si podemos
******* 2. Bloquear si el humano puede ganar
****** 3. Horquilla si es posible
******** 4. Tome el centro si está abierto
******* 5. Si hay una esquina abierta, tómala
***** 6. Tome un cuadrado vacío 'lateral' si está disponible
************7. Toma cualquier plaza abierta
"""
def hacerMovimiento(self, tablero):
movimiento = 0
if tablero.encontrarEspacioGanador(caracter) != -1:
movimiento = tablero.encontrarEspacioGanador(caracter)
return movimiento
elif tablero.encontrarEspacioDeBloqueo(caracter) != -1:
movimiento = tablero.encontrarEspacioDeBloqueo(caracter)
return movimiento
elif tablero.encontrarBifurcacionEnEspacio(caracter) != -1:
movimiento = tablero.encontrarBifurcacionEnEspacio(caracter)
return movimiento
elif tablero.encontrarEspacioCentralAbierto() != -1:
movimiento = tablero.encontrarEspacioCentralAbierto()
return movimiento
elif tablero.encontrarEspacioDeEsquinaAbierto() != -1:
movimiento = tablero.encontrarEspacioDeEsquinaAbierto()
return movimiento
elif tablero.encontrarEspacioLateralVacio() != -1:
movimiento = tablero.encontrarEspacioLateralVacio()
return movimiento
else:
return self.__encontrarLugarVacio(tablero)
# Contenedor para el comportamiento de movimiento predeterminado del super
def __encontrarLugarVacio(self, board):
lugares = board.getCuadrado()
for i in range(1, len(lugares)):
if lugares[i] == "_":
return i
return -1
Código Python:
Ver originalfrom Juego import Juego
"""
Código de: https://github.com/EvanOman/AI_TicTacToe
9. Implementar el juego del TATETI
"""
def main():
tateti = Juego()
tateti.play()
if __name__ == "__main__":
main()
El problema parece estar en las clases Tablero y Juego pero lo que cuesta creer es que en Java anda lo más bien y en python quede en bucle infinito.
Por favor, necesito de ayuda.
Espero sus respuestas.