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

Hola a todos, quería preguntarles lo siguiente, resulta que tengo un código del tateti hecho en Java y lo traducí a Python pero cuando ejecuto el código funciona sólo hasta la parte de selección del modo de juego y después queda cómo en un bucle infinito, pongo el código:

Código Python:
Ver original
  1. from Movimiento import Movimiento
  2. from Mensajes import Mensajes
  3. class Tablero:
  4.     def __init__(self, xdimensiones, xcaracteres):
  5.         self.__dimensiones = xdimensiones
  6.         self.__caracteres = xcaracteres
  7.         self.__ESPACIOENBLANCO = "_"
  8.         self.__tamanio = self.__dimensiones * self.__dimensiones
  9.         self.__cuadrados = self.__cargarTablero()
  10.         self.__ganandoFilas = self.__cargarFilas()
  11.         self.__ganandoFilas = self.__configuracionPopularGanadora(self.__ganandoFilas)
  12.         self.__ganandoDiag = self.__configuracionPopularDiagonal()
  13.  
  14.     def __cargarTablero(self):
  15.         self.__cuadrados = []
  16.         for i in range(0, self.__tamanio + 1):
  17.             self.__cuadrados.append(self.__ESPACIOENBLANCO)
  18.         return self.__cuadrados
  19.  
  20.     def __cargarFilas(self):
  21.         self.__ganandoFilas = []
  22.         for i in range(0, self.__dimensiones):
  23.             aux = []
  24.             for j in range(0, self.__dimensiones):
  25.                 aux.append(0)
  26.             self.__ganandoFilas.append(aux)
  27.         return self.__ganandoFilas
  28.  
  29.     def getCuadrado(self):
  30.         return self.__cuadrados
  31.  
  32.     def mostrar(self):
  33.         res = ""
  34.         for i in range(0, self.__tamanio):
  35.             res += " " + cuadrados[i] + " "
  36.             if i % self.__dimensiones != 0:
  37.                 res += "|"
  38.             elif i % tamanio != 0:
  39.                 res += "\n"
  40.                 boardWidth = 4 * self.__dimensiones - 1
  41.                 for j in range(0, boardWidth):
  42.                     res += "-"
  43.                 res += "\n"
  44.         res += "\n"
  45.         return res
  46.  
  47.     def aplicarMarcador(self, posicion, marcador):
  48.         if posicion < 1 or posicion > self.__tamanio:
  49.             Mensajes.messageInfo("Por favor escoja una posición entre el 1 y 9.")
  50.             return Movimiento.FUERADERANGO
  51.         elif self.__cuadrados[posicion] != self.__ESPACIOENBLANCO:
  52.             return Movimiento.ESPACIOTOMADO
  53.         else:
  54.             self.__cuadrados[posicion] = marcador
  55.             return Movimiento.EXITO
  56.  
  57.     def __limpiarEspacio(self, posicion):
  58.         if posicion < 1 or posicion > self.__tamanio:
  59.             Mensajes.messageInfo("Por favor escoja una posición entre el 1 y 9.")
  60.             return Movimiento.FUERADERANGO
  61.         else:
  62.             self.__cuadrados[posicion] = self.__ESPACIOENBLANCO
  63.             return Movimiento.EXITO
  64.  
  65.     def configuracionGanadora(self):
  66.         return (
  67.             self.__verificarLineas(self.__ganandoFilas) is True
  68.             or self.__verificarLineas(self.__transponer(self.__ganandoFilas)) is True
  69.             or self.__verificarLineas(self.__ganandoDiag) is True
  70.         )
  71.  
  72.     def __verificarLineas(self, lineasGanadoras):
  73.         for row in range(0, len(lineasGanadoras)):
  74.             linea = self.__obtenerPorIndice(lineasGanadoras[row])
  75.             if self.__contieneCaracter(linea, self.__ESPACIOENBLANCO) is False:
  76.                 bandera = True
  77.                 primero = linea[0]
  78.                 i = 1
  79.                 while i < len(linea) and bendera is True:
  80.                     if linea[i] != primero:
  81.                         bandera = False
  82.                     i += 1
  83.                 if bandera is True:
  84.                     return True
  85.         return False
  86.  
  87.     def __obtenerPorIndice(self, indices):
  88.         outArr = []
  89.         for i in range(0, len(indices)):
  90.             outArr.append(self.__cuadrados[indices[i]])
  91.         return outArr
  92.  
  93.     def __contieneCaracter(self, array, key):
  94.         for i in range(0, len(array)):
  95.             if array[i] == key:
  96.                 return True
  97.         return False
  98.  
  99.     def __configuracionPopularGanadora(self, matrix):
  100.         value = 1
  101.         for row in range(0, len(matrix)):
  102.             for col in range(0, len(matrix)):
  103.                 matrix[row][col] = value
  104.                 value += 1
  105.         return matrix
  106.  
  107.     def __configuracionPopularDiagonal(self):
  108.         matrix = []
  109.         for i in range(0, 2):
  110.             aux = []
  111.             for n in range(0, self.__dimensiones):
  112.                 aux.append(1 + n * (self.__dimensiones + 1))
  113.                 aux.append(self.__dimensiones + n * (self.__dimensiones - 1))
  114.             matrix.append(aux)
  115.         return matrix
  116.  
  117.     def __transponer(self, matrix):
  118.         for i in range(0, len(matrix)):
  119.             for j in range(0, i):
  120.                 temp = matrix[i][j]
  121.                 matrix[i][j] = matrix[j][i]
  122.                 matrix[j][i] = temp
  123.         return matrix
  124.  
  125.     def encontrarEspacioGanador(self, playerChar):
  126.         for index in range(1, len(self.__tamanio), +1):
  127.             if self.aplicarMarcador(index, playerChar) is Movimiento.EXITO:
  128.                 # Averigüe si la aplicación de ese personaje ganó el TATETI
  129.                 ganadorIntroducido = self.configuracionGanadora()
  130.                 # Asegúrese de deshacer el movimiento antes de regresar
  131.                 self.__limpiarEspacio(index)
  132.                 # Si esto es verdadero, entonces esto es el espacio ganador
  133.                 if ganadorIntroducido is True:
  134.                     return index
  135.         return -1
  136.  
  137.     def encontrandoNumeroEspaciosGanadores(self, caracter):
  138.         """
  139.            La forma en que esto funciona es que simplemente aplicamos este
  140.            caracter del jugador a cada espacio abierto para ver si hay un
  141.            movimiento que le da a este jugador la victoria. Si encontramos
  142.            uno ese es el índice que devolvemos
  143.        """
  144.         numEspaciosGanadores = 0
  145.         for index in range(1, len(self.__tamanio), +1):
  146.             if self.aplicarMarcador(index, playerChar) is Movimiento.EXITO:
  147.                 # Averigüe si la aplicación de ese personaje ganó el TATETI
  148.                 ganadorIntroducido = self.configuracionGanadora()
  149.                 # Asegúrese de deshacer el movimiento antes de regresar
  150.                 self.__limpiarEspacio(index)
  151.                 # Si esto es verdadero, entonces esto es el espacio ganador
  152.                 if ganadorIntroducido is True:
  153.                     numEspaciosGanadores += 1
  154.         return numEspaciosGanadores
  155.  
  156.     def encontrarEspacioDeBloqueo(self, caracter):
  157.         otroCaracter = self.__encontrarOtroJugador(caracter)
  158.         return encontrarEspacioGanador(otroCaracter)
  159.  
  160.     def encontrarBifurcacionEnEspacio(self, caracter):
  161.         """
  162.            Básicamente, simplemente recorremos todos los cuadrados y si poner
  163.            una marca en cualquier cuadrado introduce dos configuraciones ganadoras,
  164.            entonces tenemos una bifurcación y devolvemos el índice del cuadrado
  165.        """
  166.         for index in range(1, len(self.__tamanio), +1):
  167.             if self.aplicarMarcador(index, caracter) is Movimiento.EXITO:
  168.                 # Averigüe si la aplicación de ese personaje ganó el TATETI
  169.                 numEspaciosGanadores = self.encontrandoNumeroEspaciosGanadores(caracter)
  170.                 # Asegúrese de deshacer el movimiento antes de regresar
  171.                 self.__limpiarEspacio(index)
  172.                 # Si esto es verdadero, entonces esto es el espacio ganador
  173.                 if numEspaciosGanadores > 1:
  174.                     return index
  175.         return -1
  176.  
  177.     def encontrarEspacioCentralAbierto(self):
  178.         centerIndex = self.__tamanio / 2
  179.         if self.__cuadrados[centerIndex] == self.__ESPACIOENBLANCO:
  180.             return centerIndex
  181.         else:
  182.             return -1
  183.  
  184.     def encontrarEspacioDeEsquinaAbierto(self):
  185.         # Siempre tendremos 4 esquinas definidas como tales:
  186.         corners = [1, dimensiones, dimensiones * dimensiones - (dimensiones - 1), dimensiones * dimensiones]
  187.         for corner in corners:
  188.             if self.__cuadrados[corner] == self.__ESPACIOENBLANCO:
  189.                 return corner
  190.         return -1
  191.  
  192.     # Hace una lista de espacios laterales, devuelve uno si está abierto
  193.     def encontrarEspacioLateralVacio(self):
  194.         # TODO: Generalice esto a más de 3x3 cuadrícula
  195.         lados = [2, 4, 6, 8]
  196.         for lado in lados:
  197.             if self.__cuadrados[lado] == self.__ESPACIOENBLANCO:
  198.                 return lado
  199.         return -1
  200.  
  201.     def __encontrarOtroJugador(self, caracter):
  202.         for i in range(0, len(self.__caracteres)):
  203.             if self.__caracteres[i] != caracter:
  204.                 return self.__caracteres[i]
  205.         # Si no podemos encontrarlo, devuelve el carácter nulo
  206.         return "\u0000"
__________________
Si te interesa, visita mi perfil de Linkedin. Gracias