Minesweeper problem with the calculation of the raised squares

0

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
    
asked by Shexing ZhuWang 24.12.2018 в 21:19
source

0 answers