Exemplo n.º 1
0
 def __init__(self, height, width, bomb_count=1,
              first_click_row=0, first_click_col=0):
     Game.validate_initial_conditions(height, width, bomb_count,
                                      first_click_row, first_click_col)
     self.bomb_count = bomb_count
     self.flags_left_to_place = bomb_count
     self.cell_count = height * width
     self.bomb_dropper = BombDropper(height, width, first_click_row,
                                     first_click_col, bomb_count)
     self.board = Board(self.bomb_dropper.drop_bombs())
     self.won = False
     self.loss = False
     self.turn = 0
Exemplo n.º 2
0
 def test_3_by_3_lose_center(self):
     self.bombs = [
         [self.f, self.f, self.f],
         [self.f, self.t, self.f],
         [self.f, self.f, self.f],
     ]
     expected_apperances = [
         [self.U, self.U, self.U],
         [self.U, self.X, self.U],
         [self.U, self.U, self.U],
     ]
     self.board = Board(self.bombs)
     self.check_all_unopened_at_start()
     self.board.open_cell(1, 1)
     self.assertEqual(self.board.get_opened_bomb_count(), 1)
     self.assertEqual(self.board.get_opened_cell_count(), 0)
     actual_appearance = self.board.get_all_appearances()
     self.assertEqual(actual_appearance, expected_apperances)
Exemplo n.º 3
0
class Game:
    MIN_WIDTH = 1
    MIN_HEIGHT = 1
    DEFAULT_SIZE = 10
    MIN_BOMB_COUNT = 1

    def __init__(self, height, width, bomb_count=1,
                 first_click_row=0, first_click_col=0):
        Game.validate_initial_conditions(height, width, bomb_count,
                                         first_click_row, first_click_col)
        self.bomb_count = bomb_count
        self.flags_left_to_place = bomb_count
        self.cell_count = height * width
        self.bomb_dropper = BombDropper(height, width, first_click_row,
                                        first_click_col, bomb_count)
        self.board = Board(self.bomb_dropper.drop_bombs())
        self.won = False
        self.loss = False
        self.turn = 0

    @staticmethod
    def validate_initial_conditions(height, width, bomb_count,
                                    first_click_row, first_click_col):
        if height < Game.MIN_HEIGHT or width < Game.MIN_WIDTH:
            raise ValueError(
                'Cannot create Game with negative dimensions '
                f'({height}, {width}).'
            )
        elif bomb_count not in range(Game.MIN_BOMB_COUNT, height * width):
            raise ValueError(
                'bomb_count  must be positive and less than total number of '
                f'cells ({height * width}) but was {bomb_count}'
            )
        elif first_click_row not in range(0, height):
            raise ValueError(
                f'first_click_row must be in range(0, {height}) but was '
                f'{first_click_row}'
            )
        elif first_click_col not in range(0, width):
            raise ValueError(
                f'first_click_col must be in range(0, {width}) but was '
                f'{first_click_col}'
            )
        else:
            pass  # Input valid

    # -----------------------------------------------------------------------------

    def get_actions(self):
        return self.open_cell, self.toggle_flag, self.chord_cell

    def open_cell(self, row, col):
        print("\nOpening!")
        self.board.reset_affected_positions()

        valid = self.board.open_cell(row, col)
        move = Move(valid=valid,
                    cell=self.board.get_cell(row, col),
                    move_type=Move.MoveType.OPEN,
                    affected_positions=self.board.get_affected_positions())
        self.increment_turn(move)
        if valid:
            self.update_end_game()

        self.board.reset_affected_positions()
        return move

    def toggle_flag(self, row, col):
        print("\nToggling flag!")
        self.board.reset_affected_positions()

        valid = self.board.toggle_flag(row, col)
        move = Move(valid=valid,
                    cell=self.board.get_cell(row, col),
                    move_type=Move.MoveType.TOGGLE_FLAG,
                    affected_positions=self.board.get_affected_positions())
        self.flags_left_to_place += self.change_flag_count(move, row, col)
        self.increment_turn(move)

        self.board.reset_affected_positions()
        return move

    def chord_cell(self, row, col):
        print("\nChording!")
        self.board.reset_affected_positions()

        valid, flag_count = self.board.chord_cell(row, col)
        move = Move(valid=valid,
                    cell=self.board.get_cell(row, col),
                    move_type=Move.MoveType.CHORD,
                    affected_positions=self.board.get_affected_positions(),
                    adjFlagCount=flag_count)
        self.increment_turn(move)
        if valid:
            self.update_end_game()

        self.board.reset_affected_positions()
        return move

    def change_flag_count(self, move, row, col):
        if move.is_valid():
            appearance = self.board.get_single_appearance(row, col)
            return -1 if appearance == Cell.Appearance.FLAG else 1
        else:
            return 0

    def increment_turn(self, move):
        if move.is_valid():
            self.turn += 1

    def update_end_game(self):
        if self.cell_count - self.board.get_opened_cell_count() == self.bomb_count:
            self.won = True
            self.board.convert_all_bombs_to_flags()
            return
        if self.board.get_opened_bomb_count() > 0:
            self.loss = True
            self.board.reveal_board()
            return

    def check_end_game(self):
        assert not (self.won and self.loss)
        return self.won, self.loss

    def get_turn(self):
        return self.turn

    def get_flags_left_to_place(self):
        return self.flags_left_to_place

    def get_single_appearance(self, row, col):
        return self.board.get_single_appearance(row, col)

    def get_all_appearances(self):
        return self.board.get_all_appearances()
Exemplo n.º 4
0
 def test_initial_shape(self):
     self.board = Board(self.bombs)
     grid = self.board.get_grid()
     self.assertEqual(len(grid), self.DEFAULT_HEIGHT)
     self.assertEqual(len(grid[0]), self.DEFAULT_WIDTH)
Exemplo n.º 5
0
class TestBoard(unittest.TestCase):
    DEFAULT_SHAPE = (10, 10)
    DEFAULT_HEIGHT = DEFAULT_SHAPE[0]
    DEFAULT_WIDTH = DEFAULT_SHAPE[1]

    F = Cell.Appearance.FLAG
    E = Cell.Appearance.EMPTY
    U = Cell.Appearance.UNOPENED
    Y = Cell.Appearance.FLAG_INCORRECT
    B = Cell.Appearance.UNENCOUNTERED_BOMB
    X = Cell.Appearance.OPENED_BOMB

    def make_aliases(self):
        return (True, False, self.F, self.E, self.U, self.Y, self.B, self.X)

    def setUp(self):
        self.t = True
        self.f = False
        self.bombs = self.create_all_bombs(self.DEFAULT_HEIGHT,
                                           self.DEFAULT_WIDTH)
        self.board = Board(self.bombs)

    def check_cell_predicate(self, predicate):
        grid = self.board.get_grid()
        for row in grid:
            for cell in row:
                self.assertTrue(predicate(cell))

    def create_all_bombs(self, height, width):
        return [[True for _ in range(height)] for _ in range(width)]

    def check_all_unopened_at_start(self):
        shape = self.board.get_shape()
        actual = self.board.get_all_appearances()
        expected = [[self.U for _ in range(shape[1])] for _ in range(shape[0])]
        self.assertEqual(actual, expected)

    def print_appearance(appearance):
        symbols = {
            TestBoard.F: "F",
            TestBoard.E: "E",
            TestBoard.U: "U",
            TestBoard.Y: "Y",
            TestBoard.B: "B",
            TestBoard.X: "X",
        }
        rendered = [[
            symbols[app] if app in symbols else str(app) for app in row
        ] for row in appearance]
        print("\n".join(str(row) for row in rendered))

    def check_moves(self, display=False):
        self.check_all_unopened_at_start()
        for idx, move in enumerate(self.moves):
            self.compare_state(idx, move, display)

    def compare_state(self, idx, move, display=False):

        actual_validity = move['act'](*move['pos'])
        expected_validity = move['val']
        self.assertEqual(actual_validity, expected_validity)

        expected_appearance = move['board']
        actual_appearance = self.board.get_all_appearances()
        if display:
            self.dis(actual_appearance, expected_appearance, idx)
        self.assertEqual(actual_appearance, expected_appearance)

        expected_opened_cell_count = move['o_cnt']
        actual_opened_cell_count = self.board.get_opened_cell_count()
        self.assertEqual(actual_opened_cell_count, expected_opened_cell_count)

        expected_opened_bomb_count = move['b_cnt']
        actual_opened_bomb_count = self.board.get_opened_bomb_count()
        self.assertEqual(actual_opened_bomb_count, expected_opened_bomb_count)

    def dis(self, actual_appearance, expected_appearance, idx):
        print(79 * "-")
        print(f'idx: {idx}')
        print("Actual")
        TestBoard.print_appearance(actual_appearance)
        print("Expected")
        print(40 * "-")
        TestBoard.print_appearance(expected_appearance)

    # -------------------------------------------------------------------------

    def test_initial_shape(self):
        self.board = Board(self.bombs)
        grid = self.board.get_grid()
        self.assertEqual(len(grid), self.DEFAULT_HEIGHT)
        self.assertEqual(len(grid[0]), self.DEFAULT_WIDTH)

    def test_initial_grid_types(self):
        self.bombs = self.create_all_bombs(32, 48)
        self.board = Board(self.bombs)
        self.check_cell_predicate(lambda cell: type(cell) == Cell)

    def test_initial_cell_appearance(self):
        self.bombs = self.create_all_bombs(35, 67)
        self.board = Board(self.bombs)
        self.check_cell_predicate(
            lambda cell: cell.get_appearance() == Cell.Appearance.UNOPENED)

    def test_repr_10_10(self):
        expected = ("? ? ? ? ? ? ? ? ? ?\n"
                    "? ? ? ? ? ? ? ? ? ?\n"
                    "? ? ? ? ? ? ? ? ? ?\n"
                    "? ? ? ? ? ? ? ? ? ?\n"
                    "? ? ? ? ? ? ? ? ? ?\n"
                    "? ? ? ? ? ? ? ? ? ?\n"
                    "? ? ? ? ? ? ? ? ? ?\n"
                    "? ? ? ? ? ? ? ? ? ?\n"
                    "? ? ? ? ? ? ? ? ? ?\n"
                    "? ? ? ? ? ? ? ? ? ?")
        self.assertEqual(repr(self.board), expected)

    def test_repr_1_1(self):
        self.bombs = self.create_all_bombs(1, 1)
        self.board = Board(self.bombs)
        expected = ("?")
        self.assertEqual(repr(self.board), expected)

    # -----------------------------------------------------------------------------
    # Toggling tests

    def test_toggle_each_cell_to_flag(self):
        self.board.iterate(lambda cell: self.board.toggle_flag(
            cell.get_row(), cell.get_col()))
        self.board.iterate(lambda cell: self.assertEqual(
            cell.get_appearance(), Cell.Appearance.FLAG))

    # -----------------------------------------------------------------------------
    def test_3_by_3_lose_center(self):
        self.bombs = [
            [self.f, self.f, self.f],
            [self.f, self.t, self.f],
            [self.f, self.f, self.f],
        ]
        expected_apperances = [
            [self.U, self.U, self.U],
            [self.U, self.X, self.U],
            [self.U, self.U, self.U],
        ]
        self.board = Board(self.bombs)
        self.check_all_unopened_at_start()
        self.board.open_cell(1, 1)
        self.assertEqual(self.board.get_opened_bomb_count(), 1)
        self.assertEqual(self.board.get_opened_cell_count(), 0)
        actual_appearance = self.board.get_all_appearances()
        self.assertEqual(actual_appearance, expected_apperances)

    def test_3_by_3_win_center(self):
        t, f, F, E, U, Y, B, X = self.make_aliases()
        self.bomb_count = 1
        self.bombs = [
            [self.f, self.f, self.f],
            [self.f, self.t, self.f],
            [self.f, self.f, self.f],
        ]
        self.board = Board(self.bombs)
        self.moves = (
            {
                'board': [[U, U, U], [U, U, U], [U, U, 1]],
                'pos': (2, 2),
                'val': True,
                'o_cnt': 1,
                'b_cnt': 0,
                'act': self.board.open_cell
            },
            {
                'board': [[U, U, U], [U, U, U], [1, U, 1]],
                'pos': (2, 0),
                'val': True,
                'o_cnt': 2,
                'b_cnt': 0,
                'act': self.board.open_cell
            },
            {
                'board': [[1, U, U], [U, U, U], [1, U, 1]],
                'pos': (0, 0),
                'val': True,
                'o_cnt': 3,
                'b_cnt': 0,
                'act': self.board.open_cell
            },
            {
                'board': [[1, U, U], [U, U, U], [1, U, 1]],
                'pos': (0, 0),
                'val': False,
                'o_cnt': 3,
                'b_cnt': 0,
                'act': self.board.open_cell
            },
            {
                'board': [[1, 1, U], [U, U, U], [1, U, 1]],
                'pos': (0, 1),
                'val': True,
                'o_cnt': 4,
                'b_cnt': 0,
                'act': self.board.open_cell
            },
            {
                'board': [[1, 1, U], [U, U, U], [1, 1, 1]],
                'pos': (2, 1),
                'val': True,
                'o_cnt': 5,
                'b_cnt': 0,
                'act': self.board.open_cell
            },
            {
                'board': [[1, 1, 1], [U, U, U], [1, 1, 1]],
                'pos': (0, 2),
                'val': True,
                'o_cnt': 6,
                'b_cnt': 0,
                'act': self.board.open_cell
            },
            {
                'board': [[1, 1, 1], [1, U, U], [1, 1, 1]],
                'pos': (1, 0),
                'val': True,
                'o_cnt': 7,
                'b_cnt': 0,
                'act': self.board.open_cell
            },
            {
                'board': [[1, 1, 1], [1, U, U], [1, 1, 1]],
                'pos': (1, 0),
                'val': False,
                'o_cnt': 7,
                'b_cnt': 0,
                'act': self.board.toggle_flag
            },
            {
                'board': [[1, 1, 1], [1, U, F], [1, 1, 1]],
                'pos': (1, 2),
                'val': True,
                'o_cnt': 7,
                'b_cnt': 0,
                'act': self.board.toggle_flag
            },
            {
                'board': [[1, 1, 1], [1, U, F], [1, 1, 1]],
                'pos': (1, 2),
                'val': False,
                'o_cnt': 7,
                'b_cnt': 0,
                'act': self.board.open_cell
            },
            {
                'board': [[1, 1, 1], [1, U, U], [1, 1, 1]],
                'pos': (1, 2),
                'val': True,
                'o_cnt': 7,
                'b_cnt': 0,
                'act': self.board.toggle_flag
            },
            {
                'board': [[1, 1, 1], [1, U, 1], [1, 1, 1]],
                'pos': (1, 2),
                'val': True,
                'o_cnt': 8,
                'b_cnt': 0,
                'act': self.board.open_cell
            },
        )
        self.check_moves()
        total_cell_count = len(self.bombs) * len(self.bombs[0])
        self.assertEqual(total_cell_count - self.board.get_opened_cell_count(),
                         self.bomb_count)

    def test_10_by_10_win_center(self):
        t, f, F, E, U, Y, B, X = self.make_aliases()
        self.bomb_count = 1
        self.bombs = [
            [f, f, f, f, f, f, f, f, f, f],
            [f, f, f, f, f, f, f, t, f, f],
            [f, f, f, t, f, f, t, f, f, f],
            [f, f, f, t, f, f, f, f, f, f],
            [f, f, t, f, f, f, f, f, f, f],
            [f, t, f, f, f, t, f, f, f, f],
            [f, f, f, f, f, f, f, t, f, f],
            [f, f, f, t, f, f, f, f, f, f],
            [f, f, f, f, f, f, f, t, f, f],
            [f, f, f, f, f, f, f, f, f, f],
        ]
        self.board = Board(self.bombs)
        self.moves = (
            {
                'board': [
                    [U, U, U, U, U, U, U, U, 1, E],
                    [U, U, U, U, U, U, U, U, 1, E],
                    [U, U, U, U, U, U, U, 2, 1, E],
                    [U, U, U, U, U, U, 1, 1, E, E],
                    [U, U, U, U, U, U, 1, E, E, E],
                    [U, U, U, U, U, U, 2, 1, 1, E],
                    [U, U, U, U, U, U, U, U, 1, E],
                    [U, U, U, U, U, U, U, U, 2, E],
                    [U, U, U, U, U, U, U, U, 1, E],
                    [U, U, U, U, U, U, U, U, 1, E],
                ],
                'pos': (9, 9),
                'val':
                True,
                'o_cnt':
                27,
                'b_cnt':
                0,
                'act':
                self.board.open_cell
            },
            {
                'board': [
                    [U, U, U, U, U, U, U, U, 1, E],
                    [U, U, U, U, U, U, U, U, 1, E],
                    [U, U, U, U, U, U, U, 2, 1, E],
                    [U, U, U, U, U, U, 1, 1, E, E],
                    [U, U, U, U, U, U, 1, E, E, E],
                    [U, U, U, U, U, U, 2, 1, 1, E],
                    [U, U, U, U, U, U, U, U, 1, E],
                    [U, U, U, U, U, U, U, U, 2, E],
                    [U, U, U, U, U, U, U, U, 1, E],
                    [U, U, U, U, U, U, U, U, 1, E],
                ],
                'pos': (3, 6),
                'val':
                False,
                'o_cnt':
                27,
                'b_cnt':
                0,
                'act':
                self.board.open_cell
            },
            {
                'board': [
                    [U, U, U, U, U, U, U, U, 1, E],
                    [U, U, U, U, U, U, U, U, 1, E],
                    [U, U, U, U, U, U, U, 2, 1, E],
                    [U, U, U, U, U, U, 1, 1, E, E],
                    [U, U, U, U, U, U, 1, E, E, E],
                    [U, U, U, U, U, U, 2, 1, 1, E],
                    [U, U, U, U, U, U, U, U, 1, E],
                    [U, U, U, U, U, U, U, 2, 2, E],
                    [U, U, U, U, U, U, U, U, 1, E],
                    [U, U, U, U, U, U, U, U, 1, E],
                ],
                'pos': (7, 7),
                'val':
                True,
                'o_cnt':
                28,
                'b_cnt':
                0,
                'act':
                self.board.open_cell
            },
            {
                'board': [
                    [U, U, U, U, U, U, U, U, 1, E],
                    [U, U, U, U, U, U, U, U, 1, E],
                    [U, U, U, U, U, U, U, 2, 1, E],
                    [U, U, U, U, U, U, 1, 1, E, E],
                    [U, U, U, U, U, U, 1, E, E, E],
                    [U, U, U, U, U, U, 2, 1, 1, E],
                    [1, 1, 2, U, 2, 1, 2, U, 1, E],
                    [E, E, 1, U, 1, E, 2, 2, 2, E],
                    [E, E, 1, 1, 1, E, 1, U, 1, E],
                    [E, E, E, E, E, E, 1, U, 1, E],
                ],
                'pos': (9, 0),
                'val':
                True,
                'o_cnt':
                54,
                'b_cnt':
                0,
                'act':
                self.board.open_cell
            },
            {
                'board': [
                    [E, E, E, E, E, E, 1, U, 1, E],
                    [E, E, 1, 1, 1, 1, 2, U, 1, E],
                    [E, E, 2, U, U, U, U, 2, 1, E],
                    [E, 1, 3, U, U, U, 1, 1, E, E],
                    [1, 2, U, U, U, U, 1, E, E, E],
                    [U, U, U, U, U, U, 2, 1, 1, E],
                    [1, 1, 2, U, 2, 1, 2, U, 1, E],
                    [E, E, 1, U, 1, E, 2, 2, 2, E],
                    [E, E, 1, 1, 1, E, 1, U, 1, E],
                    [E, E, E, E, E, E, 1, U, 1, E],
                ],
                'pos': (0, 2),
                'val':
                True,
                'o_cnt':
                76,
                'b_cnt':
                0,
                'act':
                self.board.open_cell
            },
            {
                'board': [
                    [E, E, E, E, E, E, 1, 1, 1, E],
                    [E, E, 1, 1, 1, 1, 2, U, 1, E],
                    [E, E, 2, U, U, U, U, 2, 1, E],
                    [E, 1, 3, U, U, U, 1, 1, E, E],
                    [1, 2, U, U, U, U, 1, E, E, E],
                    [U, U, U, U, U, U, 2, 1, 1, E],
                    [1, 1, 2, U, 2, 1, 2, U, 1, E],
                    [E, E, 1, U, 1, E, 2, 2, 2, E],
                    [E, E, 1, 1, 1, E, 1, U, 1, E],
                    [E, E, E, E, E, E, 1, U, 1, E],
                ],
                'pos': (0, 7),
                'val':
                True,
                'o_cnt':
                77,
                'b_cnt':
                0,
                'act':
                self.board.open_cell
            },
            {
                'board': [
                    [E, E, E, E, E, E, 1, 1, 1, E],
                    [E, E, 1, 1, 1, 1, 2, U, 1, E],
                    [E, E, 2, U, U, U, U, 2, 1, E],
                    [E, 1, 3, U, U, U, 1, 1, E, E],
                    [1, 2, U, U, U, U, 1, E, E, E],
                    [1, U, U, U, U, U, 2, 1, 1, E],
                    [1, 1, 2, U, 2, 1, 2, U, 1, E],
                    [E, E, 1, U, 1, E, 2, 2, 2, E],
                    [E, E, 1, 1, 1, E, 1, U, 1, E],
                    [E, E, E, E, E, E, 1, U, 1, E],
                ],
                'pos': (5, 0),
                'val':
                True,
                'o_cnt':
                78,
                'b_cnt':
                0,
                'act':
                self.board.open_cell
            },
            {
                'board': [
                    [E, E, E, E, E, E, 1, 1, 1, E],
                    [E, E, 1, 1, 1, 1, 2, U, 1, E],
                    [E, E, 2, U, U, U, U, 2, 1, E],
                    [E, 1, 3, U, U, U, 1, 1, E, E],
                    [1, 2, U, U, U, U, 1, E, E, E],
                    [1, U, U, U, U, U, 2, 1, 1, E],
                    [1, 1, 2, U, 2, 1, 2, U, 1, E],
                    [E, E, 1, U, 1, E, 2, 2, 2, E],
                    [E, E, 1, 1, 1, E, 1, U, 1, E],
                    [E, E, E, E, E, E, 1, 1, 1, E],
                ],
                'pos': (9, 7),
                'val':
                True,
                'o_cnt':
                79,
                'b_cnt':
                0,
                'act':
                self.board.open_cell
            },
            {
                'board': [
                    [E, E, E, E, E, E, 1, 1, 1, E],
                    [E, E, 1, 1, 1, 1, 2, U, 1, E],
                    [E, E, 2, U, U, U, U, 2, 1, E],
                    [E, 1, 3, U, U, U, 1, 1, E, E],
                    [1, 2, U, U, 2, U, 1, E, E, E],
                    [1, U, U, U, U, U, 2, 1, 1, E],
                    [1, 1, 2, U, 2, 1, 2, U, 1, E],
                    [E, E, 1, U, 1, E, 2, 2, 2, E],
                    [E, E, 1, 1, 1, E, 1, U, 1, E],
                    [E, E, E, E, E, E, 1, 1, 1, E],
                ],
                'pos': (4, 4),
                'val':
                True,
                'o_cnt':
                80,
                'b_cnt':
                0,
                'act':
                self.board.open_cell
            },
            # {'board': [
            #     [E, E, E, E, E, E, 1, 1, 1, E],
            #     [E, E, 1, 1, 1, 1, 2, *, 1, E],
            #     [E, E, 2, *, U, U, *, 2, 1, E],
            #     [E, 1, 3, *, U, U, 1, 1, E, E],
            #     [1, 2, *, U, 2, U, 1, E, E, E],
            #     [1, *, U, U, U, *, 2, 1, 1, E],
            #     [1, 1, 2, U, 2, 1, 2, *, 1, E],
            #     [E, E, 1, *, 1, E, 2, 2, 2, E],
            #     [E, E, 1, 1, 1, E, 1, *, 1, E],
            #     [E, E, E, E, E, E, 1, 1, 1, E],
            # ],
            #  'pos': (4, 4),
            #  'val': True,
            #  'o_cnt': 80,
            #  'b_cnt': 0,
            #  'act': self.board.open_cell},
        )
        self.check_moves()
        total_cell_count = len(self.bombs) * len(self.bombs[0])
Exemplo n.º 6
0
 def test_10_by_10_win_center(self):
     t, f, F, E, U, Y, B, X = self.make_aliases()
     self.bomb_count = 1
     self.bombs = [
         [f, f, f, f, f, f, f, f, f, f],
         [f, f, f, f, f, f, f, t, f, f],
         [f, f, f, t, f, f, t, f, f, f],
         [f, f, f, t, f, f, f, f, f, f],
         [f, f, t, f, f, f, f, f, f, f],
         [f, t, f, f, f, t, f, f, f, f],
         [f, f, f, f, f, f, f, t, f, f],
         [f, f, f, t, f, f, f, f, f, f],
         [f, f, f, f, f, f, f, t, f, f],
         [f, f, f, f, f, f, f, f, f, f],
     ]
     self.board = Board(self.bombs)
     self.moves = (
         {
             'board': [
                 [U, U, U, U, U, U, U, U, 1, E],
                 [U, U, U, U, U, U, U, U, 1, E],
                 [U, U, U, U, U, U, U, 2, 1, E],
                 [U, U, U, U, U, U, 1, 1, E, E],
                 [U, U, U, U, U, U, 1, E, E, E],
                 [U, U, U, U, U, U, 2, 1, 1, E],
                 [U, U, U, U, U, U, U, U, 1, E],
                 [U, U, U, U, U, U, U, U, 2, E],
                 [U, U, U, U, U, U, U, U, 1, E],
                 [U, U, U, U, U, U, U, U, 1, E],
             ],
             'pos': (9, 9),
             'val':
             True,
             'o_cnt':
             27,
             'b_cnt':
             0,
             'act':
             self.board.open_cell
         },
         {
             'board': [
                 [U, U, U, U, U, U, U, U, 1, E],
                 [U, U, U, U, U, U, U, U, 1, E],
                 [U, U, U, U, U, U, U, 2, 1, E],
                 [U, U, U, U, U, U, 1, 1, E, E],
                 [U, U, U, U, U, U, 1, E, E, E],
                 [U, U, U, U, U, U, 2, 1, 1, E],
                 [U, U, U, U, U, U, U, U, 1, E],
                 [U, U, U, U, U, U, U, U, 2, E],
                 [U, U, U, U, U, U, U, U, 1, E],
                 [U, U, U, U, U, U, U, U, 1, E],
             ],
             'pos': (3, 6),
             'val':
             False,
             'o_cnt':
             27,
             'b_cnt':
             0,
             'act':
             self.board.open_cell
         },
         {
             'board': [
                 [U, U, U, U, U, U, U, U, 1, E],
                 [U, U, U, U, U, U, U, U, 1, E],
                 [U, U, U, U, U, U, U, 2, 1, E],
                 [U, U, U, U, U, U, 1, 1, E, E],
                 [U, U, U, U, U, U, 1, E, E, E],
                 [U, U, U, U, U, U, 2, 1, 1, E],
                 [U, U, U, U, U, U, U, U, 1, E],
                 [U, U, U, U, U, U, U, 2, 2, E],
                 [U, U, U, U, U, U, U, U, 1, E],
                 [U, U, U, U, U, U, U, U, 1, E],
             ],
             'pos': (7, 7),
             'val':
             True,
             'o_cnt':
             28,
             'b_cnt':
             0,
             'act':
             self.board.open_cell
         },
         {
             'board': [
                 [U, U, U, U, U, U, U, U, 1, E],
                 [U, U, U, U, U, U, U, U, 1, E],
                 [U, U, U, U, U, U, U, 2, 1, E],
                 [U, U, U, U, U, U, 1, 1, E, E],
                 [U, U, U, U, U, U, 1, E, E, E],
                 [U, U, U, U, U, U, 2, 1, 1, E],
                 [1, 1, 2, U, 2, 1, 2, U, 1, E],
                 [E, E, 1, U, 1, E, 2, 2, 2, E],
                 [E, E, 1, 1, 1, E, 1, U, 1, E],
                 [E, E, E, E, E, E, 1, U, 1, E],
             ],
             'pos': (9, 0),
             'val':
             True,
             'o_cnt':
             54,
             'b_cnt':
             0,
             'act':
             self.board.open_cell
         },
         {
             'board': [
                 [E, E, E, E, E, E, 1, U, 1, E],
                 [E, E, 1, 1, 1, 1, 2, U, 1, E],
                 [E, E, 2, U, U, U, U, 2, 1, E],
                 [E, 1, 3, U, U, U, 1, 1, E, E],
                 [1, 2, U, U, U, U, 1, E, E, E],
                 [U, U, U, U, U, U, 2, 1, 1, E],
                 [1, 1, 2, U, 2, 1, 2, U, 1, E],
                 [E, E, 1, U, 1, E, 2, 2, 2, E],
                 [E, E, 1, 1, 1, E, 1, U, 1, E],
                 [E, E, E, E, E, E, 1, U, 1, E],
             ],
             'pos': (0, 2),
             'val':
             True,
             'o_cnt':
             76,
             'b_cnt':
             0,
             'act':
             self.board.open_cell
         },
         {
             'board': [
                 [E, E, E, E, E, E, 1, 1, 1, E],
                 [E, E, 1, 1, 1, 1, 2, U, 1, E],
                 [E, E, 2, U, U, U, U, 2, 1, E],
                 [E, 1, 3, U, U, U, 1, 1, E, E],
                 [1, 2, U, U, U, U, 1, E, E, E],
                 [U, U, U, U, U, U, 2, 1, 1, E],
                 [1, 1, 2, U, 2, 1, 2, U, 1, E],
                 [E, E, 1, U, 1, E, 2, 2, 2, E],
                 [E, E, 1, 1, 1, E, 1, U, 1, E],
                 [E, E, E, E, E, E, 1, U, 1, E],
             ],
             'pos': (0, 7),
             'val':
             True,
             'o_cnt':
             77,
             'b_cnt':
             0,
             'act':
             self.board.open_cell
         },
         {
             'board': [
                 [E, E, E, E, E, E, 1, 1, 1, E],
                 [E, E, 1, 1, 1, 1, 2, U, 1, E],
                 [E, E, 2, U, U, U, U, 2, 1, E],
                 [E, 1, 3, U, U, U, 1, 1, E, E],
                 [1, 2, U, U, U, U, 1, E, E, E],
                 [1, U, U, U, U, U, 2, 1, 1, E],
                 [1, 1, 2, U, 2, 1, 2, U, 1, E],
                 [E, E, 1, U, 1, E, 2, 2, 2, E],
                 [E, E, 1, 1, 1, E, 1, U, 1, E],
                 [E, E, E, E, E, E, 1, U, 1, E],
             ],
             'pos': (5, 0),
             'val':
             True,
             'o_cnt':
             78,
             'b_cnt':
             0,
             'act':
             self.board.open_cell
         },
         {
             'board': [
                 [E, E, E, E, E, E, 1, 1, 1, E],
                 [E, E, 1, 1, 1, 1, 2, U, 1, E],
                 [E, E, 2, U, U, U, U, 2, 1, E],
                 [E, 1, 3, U, U, U, 1, 1, E, E],
                 [1, 2, U, U, U, U, 1, E, E, E],
                 [1, U, U, U, U, U, 2, 1, 1, E],
                 [1, 1, 2, U, 2, 1, 2, U, 1, E],
                 [E, E, 1, U, 1, E, 2, 2, 2, E],
                 [E, E, 1, 1, 1, E, 1, U, 1, E],
                 [E, E, E, E, E, E, 1, 1, 1, E],
             ],
             'pos': (9, 7),
             'val':
             True,
             'o_cnt':
             79,
             'b_cnt':
             0,
             'act':
             self.board.open_cell
         },
         {
             'board': [
                 [E, E, E, E, E, E, 1, 1, 1, E],
                 [E, E, 1, 1, 1, 1, 2, U, 1, E],
                 [E, E, 2, U, U, U, U, 2, 1, E],
                 [E, 1, 3, U, U, U, 1, 1, E, E],
                 [1, 2, U, U, 2, U, 1, E, E, E],
                 [1, U, U, U, U, U, 2, 1, 1, E],
                 [1, 1, 2, U, 2, 1, 2, U, 1, E],
                 [E, E, 1, U, 1, E, 2, 2, 2, E],
                 [E, E, 1, 1, 1, E, 1, U, 1, E],
                 [E, E, E, E, E, E, 1, 1, 1, E],
             ],
             'pos': (4, 4),
             'val':
             True,
             'o_cnt':
             80,
             'b_cnt':
             0,
             'act':
             self.board.open_cell
         },
         # {'board': [
         #     [E, E, E, E, E, E, 1, 1, 1, E],
         #     [E, E, 1, 1, 1, 1, 2, *, 1, E],
         #     [E, E, 2, *, U, U, *, 2, 1, E],
         #     [E, 1, 3, *, U, U, 1, 1, E, E],
         #     [1, 2, *, U, 2, U, 1, E, E, E],
         #     [1, *, U, U, U, *, 2, 1, 1, E],
         #     [1, 1, 2, U, 2, 1, 2, *, 1, E],
         #     [E, E, 1, *, 1, E, 2, 2, 2, E],
         #     [E, E, 1, 1, 1, E, 1, *, 1, E],
         #     [E, E, E, E, E, E, 1, 1, 1, E],
         # ],
         #  'pos': (4, 4),
         #  'val': True,
         #  'o_cnt': 80,
         #  'b_cnt': 0,
         #  'act': self.board.open_cell},
     )
     self.check_moves()
     total_cell_count = len(self.bombs) * len(self.bombs[0])
Exemplo n.º 7
0
 def setUp(self):
     self.t = True
     self.f = False
     self.bombs = self.create_all_bombs(self.DEFAULT_HEIGHT,
                                        self.DEFAULT_WIDTH)
     self.board = Board(self.bombs)
Exemplo n.º 8
0
 def test_3_by_3_win_center(self):
     t, f, F, E, U, Y, B, X = self.make_aliases()
     self.bomb_count = 1
     self.bombs = [
         [self.f, self.f, self.f],
         [self.f, self.t, self.f],
         [self.f, self.f, self.f],
     ]
     self.board = Board(self.bombs)
     self.moves = (
         {
             'board': [[U, U, U], [U, U, U], [U, U, 1]],
             'pos': (2, 2),
             'val': True,
             'o_cnt': 1,
             'b_cnt': 0,
             'act': self.board.open_cell
         },
         {
             'board': [[U, U, U], [U, U, U], [1, U, 1]],
             'pos': (2, 0),
             'val': True,
             'o_cnt': 2,
             'b_cnt': 0,
             'act': self.board.open_cell
         },
         {
             'board': [[1, U, U], [U, U, U], [1, U, 1]],
             'pos': (0, 0),
             'val': True,
             'o_cnt': 3,
             'b_cnt': 0,
             'act': self.board.open_cell
         },
         {
             'board': [[1, U, U], [U, U, U], [1, U, 1]],
             'pos': (0, 0),
             'val': False,
             'o_cnt': 3,
             'b_cnt': 0,
             'act': self.board.open_cell
         },
         {
             'board': [[1, 1, U], [U, U, U], [1, U, 1]],
             'pos': (0, 1),
             'val': True,
             'o_cnt': 4,
             'b_cnt': 0,
             'act': self.board.open_cell
         },
         {
             'board': [[1, 1, U], [U, U, U], [1, 1, 1]],
             'pos': (2, 1),
             'val': True,
             'o_cnt': 5,
             'b_cnt': 0,
             'act': self.board.open_cell
         },
         {
             'board': [[1, 1, 1], [U, U, U], [1, 1, 1]],
             'pos': (0, 2),
             'val': True,
             'o_cnt': 6,
             'b_cnt': 0,
             'act': self.board.open_cell
         },
         {
             'board': [[1, 1, 1], [1, U, U], [1, 1, 1]],
             'pos': (1, 0),
             'val': True,
             'o_cnt': 7,
             'b_cnt': 0,
             'act': self.board.open_cell
         },
         {
             'board': [[1, 1, 1], [1, U, U], [1, 1, 1]],
             'pos': (1, 0),
             'val': False,
             'o_cnt': 7,
             'b_cnt': 0,
             'act': self.board.toggle_flag
         },
         {
             'board': [[1, 1, 1], [1, U, F], [1, 1, 1]],
             'pos': (1, 2),
             'val': True,
             'o_cnt': 7,
             'b_cnt': 0,
             'act': self.board.toggle_flag
         },
         {
             'board': [[1, 1, 1], [1, U, F], [1, 1, 1]],
             'pos': (1, 2),
             'val': False,
             'o_cnt': 7,
             'b_cnt': 0,
             'act': self.board.open_cell
         },
         {
             'board': [[1, 1, 1], [1, U, U], [1, 1, 1]],
             'pos': (1, 2),
             'val': True,
             'o_cnt': 7,
             'b_cnt': 0,
             'act': self.board.toggle_flag
         },
         {
             'board': [[1, 1, 1], [1, U, 1], [1, 1, 1]],
             'pos': (1, 2),
             'val': True,
             'o_cnt': 8,
             'b_cnt': 0,
             'act': self.board.open_cell
         },
     )
     self.check_moves()
     total_cell_count = len(self.bombs) * len(self.bombs[0])
     self.assertEqual(total_cell_count - self.board.get_opened_cell_count(),
                      self.bomb_count)
Exemplo n.º 9
0
 def test_repr_1_1(self):
     self.bombs = self.create_all_bombs(1, 1)
     self.board = Board(self.bombs)
     expected = ("?")
     self.assertEqual(repr(self.board), expected)
Exemplo n.º 10
0
 def test_initial_cell_appearance(self):
     self.bombs = self.create_all_bombs(35, 67)
     self.board = Board(self.bombs)
     self.check_cell_predicate(
         lambda cell: cell.get_appearance() == Cell.Appearance.UNOPENED)
Exemplo n.º 11
0
 def test_initial_grid_types(self):
     self.bombs = self.create_all_bombs(32, 48)
     self.board = Board(self.bombs)
     self.check_cell_predicate(lambda cell: type(cell) == Cell)