Ver Mensaje Individual
  #2 (permalink)  
Antiguo 07/10/2019, 12:51
Avatar de detective_jd
detective_jd
 
Fecha de Ingreso: abril-2011
Ubicación: Salto
Mensajes: 437
Antigüedad: 13 años, 7 meses
Puntos: 6
Respuesta: TATETI en Python

Código Python:
Ver original
  1. from Humano import Humano
  2. from Computadora import Computadora
  3. from Estado import Estado
  4. from Movimiento import Movimiento
  5. from Tablero import Tablero
  6. from Mensajes import Mensajes
  7.  
  8.  
  9. class Juego:
  10.     def __init__(self):
  11.         j1, j2 = "", ""
  12.         self.__jugadores = []
  13.         opcion = -1
  14.         while opcion < 0 or opcion > 2:
  15.             opcion = Mensajes.requestInt("Elige modo de juego:\n[0. CPU vs CPU] [1. Jug. vs CPU] [2. Jug. vs Jug.]")
  16.             if opcion == 0:
  17.                 self.__jugadores.append(Computadora("HAL1", "o"))
  18.                 self.__jugadores.append(Computadora("HAL2", "x"))
  19.             elif opcion == 1:
  20.                 j1 = Mensajes.requestAlpha("Jugador 1, ingresa tu nombre")
  21.                 self.__jugadores.append(Humano(j1, "o"))
  22.                 self.__jugadores.append(Computadora("HAL", "x"))
  23.             elif opcion == 2:
  24.                 j1 = Mensajes.requestAlpha("Jugador 1, ingresa tu nombre")
  25.                 j2 = Mensajes.requestAlpha("Jugador 2, ingresa tu nombre")
  26.                 self.__jugadores.append(Humano(j1, "o"))
  27.                 self.__jugadores.append(Humano(j2, "x"))
  28.             else:
  29.                 Mensajes.messageInfo("ERROR: el número de usuarios debe incluirse entre 0 y 2")
  30.         caracteres = ["o", "x"]
  31.         self.__tablero = Tablero(3, caracteres)
  32.         self.__estado = Estado.ENCURSO
  33.  
  34.     """
  35.        Contiene el bucle del juego, simplemente alterna jugadores
  36.        hasta que el juego termina
  37.    """
  38.  
  39.     def play(self):
  40.         marcarTurno = 0
  41.         jugadorActual = self.__jugadores[0]
  42.         # Mientras el juego esta arrancando...
  43.         while self.__estado == Estado.ENCURSO:
  44.             # Orquesta la alternancia del jugador mencionada anteriormente
  45.             jugadorActual = self.__jugadores[marcarTurno % 2]
  46.             movimiento = Movimiento.FRACASO
  47.             """
  48.                Bucle de retroalimentación interna que se ejecuta hasta que el
  49.                jugador finaliza con éxito su turno
  50.            """
  51.             while movimiento == Movimiento.EXITO:
  52.                 # Obtiene la elección del movimiento de los jugadores
  53.                 indiceElegido = jugadorActual.hacerMovimiento(tablero)
  54.                 # Intentos de hacer movimiento
  55.                 movimiento = self.__tablero.aplicarMarcador(indiceElegido, jugadorActual.getCaracter())
  56.                 # Imprime el tablero después de cada turno.
  57.                 Mensajes.messageInfo(tablero.mostrar() + "\n" + jugadorActual.getNombre() + " escoge: " + str(indiceElegido))
  58.                 """
  59.                    Informa al usuario de los resultados indeseables que
  60.                    requieren una acción adicional.
  61.                """
  62.                 if movimiento == Movimiento.FUERADERANGO:
  63.                     Mensajes.messageInfo("Por favor escoge un indice que esté en el rango")
  64.                 elif movimiento == Movimiento.ESPACIOTOMADO:
  65.                     Mensajes.messageInfo("El espacio del cuadrado " + str(indiceElegido) + " esta tomado.")
  66.             # Actualiza el estado del juego cada turno
  67.             self.actualizarEstadoJuego()
  68.             marcarTurno += 1
  69.         """
  70.            Salió del bucle el juego, por lo que debe haber finalizado, por lo
  71.            que debemos informar a los jugadores del resultado
  72.        """
  73.         if self.__estado == Estado.EMPATE:
  74.             Mensajes.messageInfo("Empate!")
  75.         elif self.__estado == Estado.HAYGANADOR:
  76.             Mensajes.messageInfo(jugadorActual.getNombre() + " gana el TATETI")
  77.  
  78.     # Actualiza el estado global del juego
  79.     def actualizarEstadoJuego(self):
  80.         if self.__hayGanador() is True:
  81.             self.__estado = Estado.HAYGANADOR
  82.         elif self.__esGato() is True:
  83.             self.__estado = Estado.EMPATE
  84.  
  85.     """
  86.        Simplemente dice que el es un gato si el tablero está lleno
  87.        y nadie ganó todavía
  88.    """
  89.  
  90.     def __esGato(self):
  91.         cuadrados = self.__tablero.getCuadrado()
  92.         for i in range(1, len(cuadrados)):
  93.             if cuadrados[i] == '_':
  94.                 return False
  95.         return self.__tablero.configuracionGanadora() is False
  96.  
  97.     def __hayGanador(self):
  98.         return self.__tablero.configuracionGanadora() is True

Código Python:
Ver original
  1. from abc import ABCMeta
  2. import abc
  3.  
  4.  
  5. class Jugador(metaclass=ABCMeta):
  6.     def __init__(self, xnombre, xcaracter):
  7.         self._nombre = xnombre
  8.         self._caracter = xcaracter
  9.  
  10.     def getNombre(self):
  11.         return self._nombre
  12.  
  13.     def setNombre(self, nombre):
  14.         self._nombre = nombre
  15.  
  16.     def getCaracter(self):
  17.         return self._caracter
  18.  
  19.     def setCaracter(self, caracter):
  20.         self._caracter = caracter
  21.  
  22.     @abc.abstractmethod
  23.     def hacerMovimiento(self, tablero):
  24.         pass

Código Python:
Ver original
  1. from Jugador import Jugador
  2. from Mensajes import Mensajes
  3.  
  4.  
  5. class Humano(Jugador):
  6.     def __init__(self, xnombre, xcaracter):
  7.         Jugador.__init__(self, xnombre, xcaracter)
  8.  
  9.     def hacerMovimiento(self, tablero):
  10.         return Mensajes.requestInt(tablero.mostrar() + "\n" + self._nombre + ", por favor seleccione un cuadrado")

Código Python:
Ver original
  1. from Jugador import Jugador
  2. class Computadora(Jugador):
  3.     def __init__(self, xnombre, xcaracter):
  4.         Jugador.__init__(self, xnombre, xcaracter)
  5.  
  6.     """
  7.        Aquí es donde implementamos la IA de este sistema siguiendo el método simple
  8.        que fue escrito durante el laboratorio:
  9. *******     1. Gana si podemos
  10. *******     2. Bloquear si el humano puede ganar
  11. ******      3. Horquilla si es posible
  12. ********    4. Tome el centro si está abierto
  13. *******     5. Si hay una esquina abierta, tómala
  14. *****       6. Tome un cuadrado vacío 'lateral' si está disponible
  15. ************7. Toma cualquier plaza abierta
  16.    """
  17.  
  18.     def hacerMovimiento(self, tablero):
  19.         movimiento = 0
  20.         if tablero.encontrarEspacioGanador(caracter) != -1:
  21.             movimiento = tablero.encontrarEspacioGanador(caracter)
  22.             return movimiento
  23.         elif tablero.encontrarEspacioDeBloqueo(caracter) != -1:
  24.             movimiento = tablero.encontrarEspacioDeBloqueo(caracter)
  25.             return movimiento
  26.         elif tablero.encontrarBifurcacionEnEspacio(caracter) != -1:
  27.             movimiento = tablero.encontrarBifurcacionEnEspacio(caracter)
  28.             return movimiento
  29.         elif tablero.encontrarEspacioCentralAbierto() != -1:
  30.             movimiento = tablero.encontrarEspacioCentralAbierto()
  31.             return movimiento
  32.         elif tablero.encontrarEspacioDeEsquinaAbierto() != -1:
  33.             movimiento = tablero.encontrarEspacioDeEsquinaAbierto()
  34.             return movimiento
  35.         elif tablero.encontrarEspacioLateralVacio() != -1:
  36.             movimiento = tablero.encontrarEspacioLateralVacio()
  37.             return movimiento
  38.         else:
  39.             return self.__encontrarLugarVacio(tablero)
  40.  
  41.     # Contenedor para el comportamiento de movimiento predeterminado del super
  42.     def __encontrarLugarVacio(self, board):
  43.         lugares = board.getCuadrado()
  44.         for i in range(1, len(lugares)):
  45.             if lugares[i] == "_":
  46.                 return i
  47.         return -1

Código Python:
Ver original
  1. from Juego import Juego
  2. """
  3.    Código de: https://github.com/EvanOman/AI_TicTacToe
  4.  
  5.    9. Implementar el juego del TATETI
  6. """
  7. def main():
  8.     tateti = Juego()
  9.     tateti.play()
  10.  
  11. if __name__ == "__main__":
  12.     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.
__________________
Si te interesa, visita mi perfil de Linkedin. Gracias