Esempio n. 1
0
class FieldGrid(GridLayout):
    def __init__(self, rows, cols, bombs):
        super().__init__(cols=cols, pos_hint={'center_x': 0.5, 'center_y': 0.7},
                         size=(cols*22, rows*22), size_hint=(None, None))
        self.board = Board(rows, cols, bombs)
        self.over = False
        self.mark = False

        for i in range(rows*cols):
            tile = TileWidget(i)
            self.add_widget(tile)

    def tile_pressed(self, index):
        if self.over:
            return

        tile = self.board.tiles[index]
        n_tiles = self.board.rows * self.board.cols

        if self.mark:
            if not tile.covered:
                return

            self.board.mark_tile(index)
            if tile.marked:
                self.children[n_tiles-1-index].change_image("mark")
            else:
                self.children[n_tiles-1-index].change_image("cov")

            if self.board.status() == 1:
                gui.field.status.text = "Win!"  # TODO: refactor
                self.over = True
        else:
            if tile.marked:
                return
            self.board.expose_tile(index)
            widget = self.children[n_tiles-1-index]

            if self.board.status() == 0 and tile.value != 0:
                widget.change_image(str(tile.value))
            elif self.board.status() == 0 and tile.value == 0:
                self.reload_board()
            elif self.board.status() == -1:
                widget.change_image("bomb")
                gui.field.status.text = "Game over"  # TODO: refactor
                self.over = True

    def reload_board(self):
        n_tiles = self.board.rows*self.board.cols
        for i in range(n_tiles):
            w = self.children[n_tiles-1-i]
            t = self.board.tiles[i]

            if t.covered and t.marked:
                w.change_image("mark")
            elif t.covered and not t.marked:
                w.change_image("cov")
            else:
                w.change_image(str(t.value))