When I have uncovered all the boxes that are not mines, I should have fulfilled the condition of self.cases raised == self.fil * self.col-self.minds, but I have checked it in the custom matrix but it does not work .
from casilla import Casilla
from random import randint
class Tablero (object):
def __init__(self,fil,col,minas):
self.fil=fil
self.col=col
self.minas=minas
self.tiempo_inicio=0
self.tablero=[]
for i in range (self.fil):
self.tablero.append([])
for j in range (self.col):
self.tablero[i].append(Casilla())
self.casillas_levantadas=0
def comprovar_ganador (self):
if self.casillas_levantadas==(self.fil*self.col)-self.minas:
return True
#True lo pasa a mostrar tablero
else:
return False
#False para seguir jugando en el programa principal
def realizar_jugada (self,x,y,accion): #accion=' ' ,?,!
if accion==' ': #La accion que hace
if self.tablero[x-1][y-1].get_valor()==-1 and self.tablero[x-1][y-1].get_estado()=='x':
self.tablero[x-1][y-1].set_estado(' ')
return int(-1)
elif self.tablero[x-1][y-1].get_estado()=='x' or self.tablero[x-1][y-1].get_estado()=='?':
if self.tablero[x-1][y-1].get_valor()==0:
self.destapar_casillas_vecinas(x-1,y-1)
self.tablero[x-1][y-1].set_estado(' ')
self.casillas_levantadas+=1
elif self.tablero[x-1][y-1].get_estado()==' ':
print('Esta casilla ya está destapada')
else:
print('Esta casilla no se puede destapar porque está marcada con !, desmárquelo con x para poder destaparlo')
elif accion=="x":
if self.tablero[x-1][y-1].get_estado()=='!':
self.tablero[x-1][y-1].set_estado('x')
elif self.tablero[x-1][y-1].get_estado()=='?':
self.tablero[x-1][y-1].set_estado('x')
elif self.tablero[x-1][y-1].get_estado()=='x':
print('Esta casilla no se puede desmarcar, porque no ha sido marcada previamente')
else:
print('Esta casilla no se puede desmarcar, porque ya está destapada')
elif accion=='?':
if self.tablero[x-1][y-1].get_estado()=='x':
self.tablero[x-1][y-1].set_estado('?')
elif self.tablero[x-1][y-1].get_estado()==' ':
print('Esta casilla está destapada, no se puede marcar con interrogación')
elif self.tablero[x-1][y-1].get_estado()=='!':
print('La casilla está marcada con !, desmárcala con x para poder para marcar con ?')
else:
print('La casilla ya está marcada con ?')
elif accion=='!':
if self.tablero[x-1][y-1].get_estado()=='x':
self.tablero[x-1][y-1].set_estado('!')
elif self.tablero[x-1][y-1].get_estado()=='?':
print('La casilla está marcada con ?, desmárcala con x para poder marcar con !')
elif self.tablero[x-1][y-1].get_estado()==' ':
print('La casilla ya está destapada, no se puede marcar con !')
else:
print('La casilla ya está marcada con !')
else:
print('Esta acción no existe')
def mostrar_tablero(self,boolean): #si ha perdido/ganado True viene de comprovar ganador, False de realizar jugada
if boolean==True: #imrpimir tablero al ganar
print(' ',end='')
for y in range(1,self.col+1):
if y<9:
print(y,end=' ')
else:
print(y,end='')
print()
for i in range(self.fil):
if i+1<10:
print(f'{i+1} ',end='')
else:
print(i+1,end='')
for j in range(self.col):
print('|',end='')
if self.tablero[i][j].get_estado()==' ':
if self.tablero[i][j].get_valor()==0:
print(' ',end='')
elif self.tablero[i][j].get_valor()>0:
print(self.tablero[i][j].colores_casilla(),end='')
elif self.tablero[i][j].get_estado()!=' ':
print(self.tablero[i][j].get_estado(),end='')
print('|')
else:
print(' ',end='')
for y in range(1,self.col+1):
if y<9:
print(y,end=' ')
else:
print(y,end='')
print()
for i in range(self.fil):
if i+1<10:
print(f'{i+1} ',end='')
else:
print(i+1,end='')
for j in range(self.col):
print('|',end='')
if self.tablero[i][j].get_estado()==' ':
if self.tablero[i][j].get_valor()==0:
print(' ',end='')
elif self.tablero[i][j].get_valor()>0:
print(self.tablero[i][j].colores_casilla(),end='')
elif self.tablero[i][j].get_estado()!=' ':
print(self.tablero[i][j].get_estado(),end='')
print('|')
def bomba(self,x,y):
if self.tablero[x-1][y-1].get_bomba()==True and self.tablero[x-1][y-1].get_estado()==' ':
return(True)
else:
return(False)
def poner_bombas_tablero(self):
n=0
while n<self.minas:
i=randint(0,self.fil-1)
j=randint(0,self.col-1)
if self.tablero[i][j].get_valor()!=-1:
self.tablero[i][j].set_valor(-1)
self.tablero[i][j].set_bomba(True)
n+=1
for i in range(self.fil):
for j in range(self.col):
if self.tablero[i][j].get_valor()==-1:
if i==0:
if j==0:
for x in range(0,2):
for y in range(0,2):
if self.tablero[i+x][j+y].get_valor()!=-1:
self.tablero[i+x][j+y].set_valor(self.tablero[i+x][j+y].get_valor()+1)
if j==self.col-1:
for x in range(0,2):
for y in range(-1,1):
if self.tablero[i+x][j+y].get_valor()!=-1:
self.tablero[i+x][j+y].set_valor(self.tablero[i+x][j+y].get_valor()+1)
else:
for x in range(0,2):
for y in range(-1,2):
if self.tablero[i+x][j+y].get_valor()!=-1:
self.tablero[i+x][j+y].set_valor(self.tablero[i+x][j+y].get_valor()+1)
elif i==self.fil-1:
if j==0:
for x in range(-1,1):
for y in range(0,2):
if self.tablero[i+x][j+y].get_valor()!=-1:
self.tablero[i+x][j+y].set_valor(self.tablero[i+x][j+y].get_valor()+1)
elif j==self.col-1:
for x in range(-1,1):
for y in range(-1,1):
if self.tablero[i+x][j+y].get_valor()!=-1:
self.tablero[i+x][j+y].set_valor(self.tablero[i+x][j+y].get_valor()+1)
else:
for x in range(-1,1):
for y in range(-1,2):
if self.tablero[i+x][j+y].get_valor()!=-1:
self.tablero[i+x][j+y].set_valor(self.tablero[i+x][j+y].get_valor()+1)
elif j==0:
if i>0 and i<self.fil-1:
for x in range(-1,2):
for y in range(0,2):
if self.tablero[i+x][j+y].get_valor()!=-1:
self.tablero[i+x][j+y].set_valor(self.tablero[i+x][j+y].get_valor()+1)
elif j==self.col-1:
if i>0 and i<self.fil-1:
for x in range(-1,2):
for y in range(-1,1):
if self.tablero[i+x][j+y].get_valor()!=-1:
self.tablero[i+x][j+y].set_valor(self.tablero[i+x][j+y].get_valor()+1)
else:
for x in range(-1,2):
for y in range(-1,2):
if self.tablero[i+x][j+y].get_valor()!=-1:
self.tablero[i+x][j+y].set_valor(self.tablero[i+x][j+y].get_valor()+1)
def destapar_casillas_vecinas(self,x,y):
if x==0:
if y==0:
for i in range(0,2):
for j in range(0,2):
if self.tablero[x+i][y+j].get_estado()=='x':
self.tablero[x+i][y+j].set_estado(' ')
self.casillas_levantadas+=1
if self.tablero[x+i][y+j].get_valor()==0:
self.destapar_casillas_vecinas(x+i,y+j)
elif y==self.col-1:
for i in range(0,2):
for j in range(-1,1):
if self.tablero[x+i][y+j].get_estado()=='x':
self.tablero[x+i][y+j].set_estado(' ')
self.casillas_levantadas+=1
if self.tablero[x+i][y+j].get_valor()==0:
self.destapar_casillas_vecinas(x+i,y+j)
else:
for i in range(0,2):
for j in range(-1,2):
if self.tablero[x+i][y+j].get_estado()=='x':
self.tablero[x+i][y+j].set_estado(' ')
self.casillas_levantadas+=1
if self.tablero[x+i][y+j].get_valor()==0:
self.destapar_casillas_vecinas(x+i,y+j)
elif x==self.fil-1:
if y==0:
for i in range(-1,1):
for j in range(0,2):
if self.tablero[x+i][y+j].get_estado()=='x':
self.tablero[x+i][y+j].set_estado(' ')
self.casillas_levantadas+=1
if self.tablero[x+i][y+j].get_valor()==0:
self.destapar_casillas_vecinas(x+i,y+j)
elif y==self.col-1:
for i in range(-1,1):
for j in range(-1,1):
if self.tablero[x+i][y+j].get_estado()=='x':
self.tablero[x+i][y+j].set_estado(' ')
self.casillas_levantadas+=1
if self.tablero[x+i][y+j].get_valor()==0:
self.destapar_casillas_vecinas(x+i,y+j)
else:
for i in range(-1,1):
for j in range(-1,2):
if self.tablero[x+i][y+j].get_estado()=='x':
self.tablero[x+i][y+j].set_estado(' ')
self.casillas_levantadas+=1
if self.tablero[x+i][y+j].get_valor()==0:
self.destapar_casillas_vecinas(x+i,y+j)
elif y==0:
if x>0 and x<self.fil-1:
for i in range(-1,2):
for j in range(0,2):
if self.tablero[x+i][y+j].get_estado()=='x':
self.tablero[x+i][y+j].set_estado(' ')
self.casillas_levantadas+=1
if self.tablero[x+i][y+j].get_valor()==0:
self.destapar_casillas_vecinas(x+i,y+j)
elif y==self.col-1:
if x>0 and x<self.fil-1:
for i in range(-1,2):
for j in range(-1,1):
if self.tablero[x+i][y+j].get_estado()=='x':
self.tablero[x+i][y+j].set_estado(' ')
self.casillas_levantadas+=1
if self.tablero[x+i][y+j].get_valor()==0:
self.destapar_casillas_vecinas(x+i,y+j)
else:
for i in range(-1,2):
for j in range(-1,2):
if self.tablero[x+i][y+j].get_estado()=='x':
self.tablero[x+i][y+j].set_estado(' ')
self.casillas_levantadas+=1
if self.tablero[x+i][y+j].get_valor()==0:
self.destapar_casillas_vecinas(x+i,y+j)
def __str__(self):
print(' ',end='')
for y in range(1,self.col+1):
if y<9:
print(y,end=' ')
else:
print(y,end='')
print()
for i in range(self.fil):
if i+1<10:
print(f'{i+1} ',end='')
else:
print(i+1,end='')
for j in range(self.col):
print('|',end='')
if self.tablero[i][j].get_estado()==' ':
if self.tablero[i][j].get_valor()==0:
print(' ',end='')
elif self.tablero[i][j].get_valor()>0:
print(self.tablero[i][j].colores_casilla(),end='')
elif self.tablero[i][j].get_estado()!=' ':
print(self.tablero[i][j].get_estado(),end='')
print('|')
from tablero import Tablero
import time
def menu():
print('Buscaminas: \nPara poder jugar primero tendrá que seleccionar el nivel que usted desee.\n1.Nivel principiante\n2.Nivel intermedio\n3.Nivel experto\n4.Para determinar la matriz')
op=int(input('Introduzca la opción que quiere: '))
while op>4 or op<1:
print('No existe esta opción')
op=int(input('Introduzca la opción que quiere: '))
return op
op=menu()
start_time = time.time()
if op==1:
T=Tablero(8,8,10)
T.poner_bombas_tablero()
n=0
while n==0: #mostrar tablero > realizar jugada > mostrar tablero con la jugada
elapsed_time = time.time() - start_time
print(time.strftime("%H:%M:%S", time.gmtime(elapsed_time)))
T.__str__()
jugada=input('Introduzca la posición y la acción que quiere realizar (x,y,acción): ')
(x,y,acción)=jugada.split(',')
x=int(x)
y=int(y)
while x>8 or x<1 or y>8 or y<1:
print('Las coordenadas introducidas exceden del rango del tablero')
jugada=input('Introduzca la posición y la acción que quiere realizar (x,y,acción): ')
(x,y,acción)=jugada.split(',')
x=int(x)
y=int(y)
T.realizar_jugada(x,y,acción)
bomba=T.bomba(x,y) #Para determinar si ha destapado una casilla con bomba
boolean=T.comprovar_ganador()
if bomba==True: #Ha destapado una bomba y se sale del bucle
n=-1
if boolean==True: #Ha ganado
n=1
if n==-1:
T.mostrar_tablero(False)
print('Has perdido')
else:
T.mostrar_tablero(True)
print('Has ganado')
elif op==2:
T=Tablero(16,16,40)
elif op==3:
T=Tablero(16,30,99)
elif op==4:
n_fil=int(input('Introduce numero de filas: '))
n_col=int(input('Introduce numero de columnas: '))
minas=int(input('Introduce el numero de minas a colocar: '))
while minas>(n_fil*n_col) or minas==0:
print('El número de minas es inválido porque es mayor que el número de casillas o porque es 0')
minas=int(input('Introduce el numero de minas a colocar: '))
T=Tablero(n_fil,n_col,minas)
T.poner_bombas_tablero()
n=0
while n==0: #mostrar tablero > realizar jugada > mostrar tablero con la jugada
elapsed_time = time.time() - start_time
print(time.strftime("%H:%M:%S", time.gmtime(elapsed_time)))
T.__str__()
jugada=input('Introduzca la posición y la acción que quiere realizar (x,y,acción): ')
(x,y,acción)=jugada.split(',')
x=int(x)
y=int(y)
while x>n_fil or x<1 or y>n_col or y<1:
print('Las coordenadas introducidas exceden del rango del tablero')
jugada=input('Introduzca la posición y la acción que quiere realizar (x,y,acción): ')
(x,y,acción)=jugada.split(',')
x=int(x)
y=int(y)
T.realizar_jugada(x,y,acción)
bomba=T.bomba(x,y) #Para determinar si ha destapado una casilla con bomba
boolean=T.comprovar_ganador()
if bomba==True: #Ha destapado una bomba y se sale del bucle
n=-1
if boolean==True: #Ha ganado
n=1
if n==-1:
T.mostrar_tablero(False)
print('Has perdido')
else:
T.mostrar_tablero(True)
print('Has ganado')
I have also changed the way of counting the squares that are raised to this in the init, but it does not work either.
class Tablero (object):
def __init__(self,fil,col,minas):
self.fil=fil
self.col=col
self.minas=minas
self.tiempo_inicio=0
self.tablero=[]
for i in range (self.fil):
self.tablero.append([])
for j in range (self.col):
self.tablero[i].append(Casilla())
x=0
for i in range(self.fil):
for j in range(self.col):
if self.tablero[i][j].get_estado()==' ':
x+=1
self.casillas_levantadas=x