Reglas del juego:
import random
class Juego:
def __init__(self, n):
self.n = n
self.tablero = [['·' for _ in range(n)] for _ in range(n)]
self.barreras = []
self.jugador = None
self.puntuacion = 0
def generar_barreras(self):
for _ in range(max(1, int(0.0354*n**2+0.9856*n-1.8752))):
fila = random.randint(0, self.n-1)
columna = random.randint(0, self.n-1)
self.barreras.append((fila, columna))
self.tablero[fila][columna] = '▒'
def generar_jugador(self):
while True:
fila = random.randint(0, self.n-1)
columna = random.randint(0, self.n-1)
if (fila, columna) not in self.barreras:
self.jugador = (fila, columna)
self.tablero[fila][columna] = 'A'
break
def mover_jugador(self, direccion):
fila, columna = self.jugador
if direccion == 'arriba' and fila > 0:
fila -= 1
elif direccion == 'abajo' and fila < self.n-1:
fila += 1
elif direccion == 'izquierda' and columna > 0:
columna -= 1
elif direccion == 'derecha' and columna < self.n-1:
columna += 1
if self.tablero[fila][columna] == '·':
self.puntuacion += 1
elif self.tablero[fila][columna] == 'A':
self.puntuacion -= 1
self.tablero[self.jugador[0]][self.jugador[1]] = 'a' if self.tablero[self.jugador[0]][self.jugador[1]] == 'A' else '.'
self.tablero[fila][columna] = 'A'
self.jugador = (fila, columna)
def jugar(self):
self.generar_barreras()
self.generar_jugador()
print(self.barreras)
for row in self.tablero:
print(*row)
print()
while self.puntuacion < (self.n * self.n) - len(self.barreras):
direccion = random.choice(['arriba', 'abajo', 'izquierda', 'derecha'])
self.mover_jugador(direccion)
self.mostrar_tablero()
print("Puntuación total:", self.puntuacion)
def mostrar_tablero(self):
for fila in self.tablero:
print(' '.join(fila))
if __name__ == "__main__":
n = 6 # tamaño del tablero n×n
juego = Juego(n)
juego.jugar()
[(5, 4), (5, 4), (1, 5), (1, 3), (3, 0)] A · · · · · · · · ▒ · ▒ · · · · · · ▒ · · · · · · · · · · · · · · · ▒ ·
--------------------------------------------------------------------------- KeyboardInterrupt Traceback (most recent call last) <ipython-input-5-2aee6c58073b> in <cell line: 66>() 67 n = 6 # tamaño del tablero n×n 68 juego = Juego(n) ---> 69 juego.jugar() <ipython-input-5-2aee6c58073b> in jugar(self) 55 while self.puntuacion < (self.n * self.n) - len(self.barreras): 56 direccion = random.choice(['arriba', 'abajo', 'izquierda', 'derecha']) ---> 57 self.mover_jugador(direccion) 58 59 self.mostrar_tablero() <ipython-input-5-2aee6c58073b> in mover_jugador(self, direccion) 36 columna += 1 37 ---> 38 if self.tablero[fila][columna] == '·': 39 self.puntuacion += 1 40 elif self.tablero[fila][columna] == 'A': KeyboardInterrupt:
Modificado el método mover_jugador para restar 0.5 puntos en lugar de 1 punto cuando el jugador pasa por una casilla que ya ha visitado previamente.
import random
class Juego:
def __init__(self, n):
self.n = n
self.tablero = [['·' for _ in range(n)] for _ in range(n)]
self.barreras = []
self.jugador = None
self.puntuacion = 0
def generar_barreras(self):
for _ in range(n):
fila = random.randint(0, self.n-1)
columna = random.randint(0, self.n-1)
self.barreras.append((fila, columna))
self.tablero[fila][columna] = '#'
def generar_jugador(self):
while True:
fila = random.randint(0, self.n-1)
columna = random.randint(0, self.n-1)
if (fila, columna) not in self.barreras:
self.jugador = (fila, columna)
self.tablero[fila][columna] = 'A'
break
def mover_jugador(self, direccion):
fila, columna = self.jugador
if direccion == 'arriba' and fila > 0:
fila -= 1
elif direccion == 'abajo' and fila < self.n-1:
fila += 1
elif direccion == 'izquierda' and columna > 0:
columna -= 1
elif direccion == 'derecha' and columna < self.n-1:
columna += 1
if self.tablero[fila][columna] == '·':
self.puntuacion += 1
elif self.tablero[fila][columna] == 'A':
self.puntuacion -= 0.5
self.tablero[self.jugador[0]][self.jugador[1]] = 'a' if self.tablero[self.jugador[0]][self.jugador[1]] == 'A' else '.'
self.tablero[fila][columna] = 'A'
self.jugador = (fila, columna)
def jugar(self):
self.generar_barreras()
self.generar_jugador()
while self.puntuacion < (self.n * self.n) - len(self.barreras):
direccion = random.choice(['arriba', 'abajo', 'izquierda', 'derecha'])
self.mover_jugador(direccion)
self.mostrar_tablero()
print("Puntuación total:", self.puntuacion)
def mostrar_tablero(self):
for fila in self.tablero:
print(' '.join(fila))
if __name__ == "__main__":
n = 6 # tamaño del tablero n×n
juego = Juego(n)
juego.jugar()
Ingrese el tamaño del tablero: 5
--------------------------------------------------------------------------- KeyboardInterrupt Traceback (most recent call last) <ipython-input-2-3b15e01dbe07> in <cell line: 64>() 62 n = int(input("Ingrese el tamaño del tablero: ")) 63 juego = Juego(n) ---> 64 juego.jugar() <ipython-input-2-3b15e01dbe07> in jugar(self) 51 while self.puntuacion < (self.n * self.n) - len(self.barreras): 52 direccion = random.choice(['arriba', 'abajo', 'izquierda', 'derecha']) ---> 53 self.mover_jugador(direccion) 54 55 self.mostrar_tablero() <ipython-input-2-3b15e01dbe07> in mover_jugador(self, direccion) 36 columna += 1 37 ---> 38 if self.tablero[fila][columna] == '·': 39 self.puntuacion += 1 40 elif self.tablero[fila][columna] == 'A': KeyboardInterrupt:
Este código utiliza la biblioteca numpy para manejar el tablero como una matriz y la función label de scipy.ndimage para verificar la conectividad del tablero. El método generar_barreras ahora genera las barreras de todos los tamaños en un solo bucle, lo que hace que el código sea más eficiente y fácil de modificar para admitir tamaños de barreras adicionales.
El método validar_casilla verifica si una barrera de un tamaño y dirección dados puede colocarse en una posición dada sin superponerse con otras barreras. El método verificar_conectividad verifica si todas las celdas vacías del tablero están conectadas. Si no es así, significa que la última barrera colocada ha aislado una parte del tablero, por lo que se elimina y se intenta colocar en una nueva posición.
Este código garantiza que todas las barreras se colocan de forma aleatoria sin superponerse y sin aislar ninguna parte del tablero. Sin embargo, debido a la naturaleza aleatoria del algoritmo, puede tardar un tiempo variable en generar un tablero válido, especialmente si el tablero es grande y/o hay muchas barreras.
import random
import numpy as np
from scipy.ndimage import label
def generar_barreras():
tablero = np.zeros((10, 10), dtype=int)
tamanos = [1]*4 + [2]*3 + [3]*2 + [4]*1
random.shuffle(tamanos)
for tamano in tamanos:
while True:
fila = random.randint(0, 9)
columna = random.randint(0, 9)
direccion = random.choice(['horizontal', 'vertical'])
if validar_casilla(tablero, fila, columna, tamano, direccion):
if direccion == 'horizontal':
tablero[fila, columna:columna+tamano] = 1
else:
tablero[fila:fila+tamano, columna] = 1
if verificar_conectividad(tablero):
break
else:
if direccion == 'horizontal':
tablero[fila, columna:columna+tamano] = 0
else:
tablero[fila:fila+tamano, columna] = 0
return tablero
def validar_casilla(tablero, fila, columna, tamano, direccion):
if direccion == 'horizontal':
if columna + tamano > 10:
return False
return np.all(tablero[fila, columna:columna+tamano] == 0)
else:
if fila + tamano > 10:
return False
return np.all(tablero[fila:fila+tamano, columna] == 0)
def verificar_conectividad(tablero):
_, num_labels = label(tablero == 0)
return num_labels == 1