import pyxel
class case :
    def __init__(self):
        self.valeur = 0
        self.decouvert = False
        self.drapeau = False
    def info(self):
        return self.valeur
    def drapeau_set(self):
        if not self.decouvert :
            self.drapeau = not self.drapeau
    def drapeau_info(self):
        return self.drapeau
    def decouvert_set(self):
        if self.decouvert :
            return False
        else:
            self.drapeau = False
            self.decouvert = True
            return True
    def decouvert_info(self):
        return self.decouvert
    def affichage(self,triche = False):
        if not triche : 
            if not self.drapeau and not self.decouvert :
                return [0,0]
            if self.drapeau and not self.decouvert :
                return [0,16]
        if self.valeur == 0 :
            return [16,144]
        return [16,16*(self.valeur-1)]
    def valeur_info(self):
        return self.valeur
    def bombe_set(self):
        self.valeur = 9
    def bombe_info(self):
        return self.valeur == 9
    def valeur_set(self,valeur):
        if valeur < 9 and valeur > 0 :
            self.valeur = valeur
class maps :
    def affichage(self):
        return [[self.maps[i][y].affichage() for i in range(self.taille)] for y in range(self.taille)]
    def __init__(self, taille, nb_bombe):
        import random
        self.maps = [[case() for _ in range(taille)] for _ in range(taille)]
        self.taille = taille
        self.nb_bombe = nb_bombe

        # --- placement des bombes ---
        possible = [(i, j) for i in range(taille) for j in range(taille)]
        for _ in range(nb_bombe):
            a = random.choice(possible)
            possible.remove(a)
            self.maps[a[0]][a[1]].bombe_set()
        for x in range(taille):
            for y in range(taille):
                if not self.maps[x][y].bombe_info():
                    for dx in range(-1, 2):
                        for dy in range(-1, 2):
                            nx, ny = x + dx, y + dy
                            if 0 <= nx < taille and 0 <= ny < taille:
                                if self.maps[nx][ny].bombe_info():
                                    self.maps[x][y].valeur_set(self.maps[x][y].valeur_info() + 1)

    def info(self,x,y):
        return maps[x][y]
    def drapeau(self,y,x):
        self.maps[x//16][y//16].drapeau_set()
    def clic(self,y,x):
        if self.maps[x//16][y//16].drapeau_info() :
            return False
        test = []
        test.append([x//16,y//16])
        while len(test) > 0 :
            x = test[0][0]
            y = test[0][1]
            t = self.maps[x][y].decouvert_info()
            self.maps[x][y].decouvert_set()
            if self.maps[x][y].bombe_info():
                return True
            if self.maps[x][y].valeur_info() == 0 and not t:
                for dx in range(-1, 2):
                        for dy in range(-1, 2):
                            nx, ny = x + dx, y + dy
                            if 0 <= nx < self.taille and 0 <= ny < self.taille:
                                test.append([nx,ny])
            test.pop(0)
        return False
    def toutdec(self):
        for x in range(self.taille):
            for y in range(self.taille):
                if not (self.maps[x][y].bombe_info() and self.maps[x][y].drapeau_info()):
                    self.maps[x][y].decouvert_set()
    def verification(self):
        t = 0
        for a in self.maps :
            for b in a:
                if not b.decouvert_info():
                    t += 1
        return t == self.nb_bombe
class App:
    def __init__(self,taille,bb):
        self.ma_map = maps(taille,bb)
        self.play = 0
        pyxel.init(taille*16,taille*16, title="démineur")
        pyxel.load("my_resource.pyxres")
        pyxel.mouse(True)
        pyxel.run(self.update, self.draw)
    def update(self):
        if self.play == 0:
            if pyxel.btnp(pyxel.MOUSE_BUTTON_LEFT):
                if self.ma_map.clic(pyxel.mouse_x,pyxel.mouse_y):
                    self.play = 1
                    
                    self.ma_map.toutdec()
                if self.ma_map.verification():
                    self.play = 2
                    self.ma_map.toutdec()
            if pyxel.btnp(pyxel.MOUSE_BUTTON_RIGHT):
                self.ma_map.drapeau(pyxel.mouse_x,pyxel.mouse_y)
                    
    def draw(self):
        rep = self.ma_map.affichage()
        for x in range(len(rep)):
            for y in range(len(rep[x])):
                pyxel.blt(x*16,y*16,0,rep[x][y][0],rep[x][y][1],16,16)
        if self.play == 1 :
            pyxel.pal(8, 9)
            pyxel.pal(5, 8)
        if self.play == 2 :
            pyxel.pal(5, 11)
import random
a = random.choice([1,2,3])
a = [[9,10],[16,40],[22,99]][int(a)-1]
App(a[0],a[1])