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
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)
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()
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)
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])
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])
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 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_repr_1_1(self): self.bombs = self.create_all_bombs(1, 1) self.board = Board(self.bombs) expected = ("?") self.assertEqual(repr(self.board), expected)
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_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)