class User: ''' ''' def __init__(self): self.minesweeper_board = MinesweeperBoard(5,5) self.moves = [] self.current_move = {} self.is_board_completed = False def get_move(self): move = raw_input() try: option, position = self.parse_input(move) except Exception as e: print e.message self.get_move() self.current_move['option']=option self.current_move['position']=position # import pdb;pdb.set_trace() def move(self): if self.current_move['option'] == 'o': result = self.minesweeper_board.open(self.current_move['position'][0], self.current_move['position'][1]) if not result: self.minesweeper_board.print_board() raise Exception('Oops, you stepped on a mine! Game over!') elif self.current_move['option'] == 'f': self.minesweeper_board.flag(self.current_move['position'][0], self.current_move['position'][1]) self.moves.append(self.current_move) self.current_move = {} self.is_board_completed = self.minesweeper_board.is_game_over() def parse_input(self, move): #To use regular expressions if (len(move) != 6) or (move[0] not in ['o', 'f']) or (move[1] != '(') or (move[5] != ')'): raise Exception('Please enter valid input') position = (int(move[2]), int(move[4])) # if not self.minesweeper_board.is_valid_position(position[0], position[1]): # raise Exception('Position not found in board') return move[0] , position def play(self): try: print self.minesweeper_board.mine_position while True: self.minesweeper_board.print_board() self.get_move() self.move() if self.is_board_completed: break self.minesweeper_board.print_board() print 'Wow you cleared the minefield! Game over!' except Exception as e: print e.message
def test_game_over_is_True_and_human_wins(): # to do test_board = [[Tile(), Tile()], [Tile(), Tile()]] test_bomb_coordinates = [(0, 0)] test_board[0][0].bomb = True test_board[0][1].is_revealed = True test_board[1][1].is_revealed = True test_board[1][0].is_revealed = True game = MinesweeperBoard(test_board=test_board, test_bombs_coordinates=test_bomb_coordinates) assert game.game_over() is True assert game.human_wins is True
def do_new(self, arg_string): """new WIDTH HEIGHT NUM_MINES Start a new game with the specified dimensions and number of mines.""" try: width, height, num_mines = (int(arg) for arg in arg_string.split()) except ValueError: return self.onecmd('help new') self.board = MinesweeperBoard(width, height, num_mines) print() print(PLAY_ADVICE) return False
def test_assign_bombs_to_tiles(): game = MinesweeperBoard(Difficulty.EASY) counter = 0 for row in game.board: for column in row: if column.bomb: counter += 1 assert counter == 10
def test_numbers_to_tiles(): test_board = [[Tile(), Tile()], [Tile(), Tile()]] test_bomb_coordinates = [(0, 0), (0, 1)] test_board[0][0].bomb = True test_board[0][1].bomb = True game = MinesweeperBoard(test_board=test_board, test_bombs_coordinates=test_bomb_coordinates) assert game.board[1][0].number_of_neighbour_bombs == 2 assert game.board[1][1].number_of_neighbour_bombs == 2
def test_reveal_neighbours(): test_board = [[Tile(), Tile(), Tile()], [Tile(), Tile(), Tile()], [Tile(), Tile(), Tile()]] test_bomb_coordinates = [(0, 0)] test_board[0][0].bomb = True game = MinesweeperBoard(test_board=test_board, test_bombs_coordinates=test_bomb_coordinates) game.players_choice_of_tile_and_action((2, 2), 'reveal') assert game.board[0][1].is_revealed == True assert game.board[0][2].is_revealed == True assert game.board[1][0].is_revealed == True assert game.board[1][1].is_revealed == True assert game.board[1][2].is_revealed == True assert game.board[2][0].is_revealed == True assert game.board[2][1].is_revealed == True assert game.board[2][2].is_revealed == True assert game.game_over() is True
def test_victory(): board = MinesweeperBoard(2, 1, 1) assert(not board.end_state) board.step(0, 0) assert(board.end_state == EndState.VICTORY) board.step(1, 0) assert(board.end_state == EndState.VICTORY)
def test_game_over_is_True_and_human_loses(): # to do test_board = [[Tile(), Tile()], [Tile(), Tile()]] test_bomb_coordinates = [(0, 0)] test_board[0][0].bomb = True test_board[0][0].is_revealed = False test_board[1][1].is_revealed = True test_board[1][0].is_revealed = True test_board[0][1].is_revealed = False game = MinesweeperBoard(test_board=test_board, test_bombs_coordinates=test_bomb_coordinates) assert game.game_over() is False game.players_choice_of_tile_and_action((0, 0), 'reveal') assert game.game_over() is True assert game.human_wins is False
def test_get_position_of_bombs_hard(): game = MinesweeperBoard(Difficulty.HARD) assert len(game.position_of_bombs) == 99
class MinesweeperCmd(Cmd): """Handle commands for a game of Minesweeper.""" def __init__(self): Cmd.__init__(self) self.board = None self.prompt = '(Minesweeper) ' self.intro = '\n'.join(['', WELCOME, NEW_GAME_ADVICE, '']) # ----- game control ----- def do_new(self, arg_string): """new WIDTH HEIGHT NUM_MINES Start a new game with the specified dimensions and number of mines.""" try: width, height, num_mines = (int(arg) for arg in arg_string.split()) except ValueError: return self.onecmd('help new') self.board = MinesweeperBoard(width, height, num_mines) print() print(PLAY_ADVICE) return False def _cleanup_game(self): self.board = None def do_end(self, __): """End the game, but don't exit the program.""" self._cleanup_game() # ----- game play ----- def do_step(self, arg_string): """step X Y Play a step at space X, Y.""" if not self.board: return self.onecmd('help new') try: x, y = (int(arg) for arg in arg_string.split()) except ValueError: return self.onecmd('help step') try: game_end = self.board.step(x, y) except IndexError: print('out of range') return False if game_end: print() print(self.board) print() if game_end == EndState.VICTORY: print('You win!!') elif game_end == EndState.DEFEAT: print('You lose.') self._cleanup_game() return False def do_flag(self, arg_string): """flag X Y Flag space X, Y as containing a mine.""" if not self.board: return self.onecmd('help new') try: x, y = (int(arg) for arg in arg_string.split()) except ValueError: return self.onecmd('help flag') self.board.flag(x, y) def do_mark(self, arg_string): """mark X Y Flag space X, Y as containing a mine.""" if not self.board: return self.onecmd('help new') try: x, y = (int(arg) for arg in arg_string.split()) except ValueError: return self.onecmd('help mark') self.board.flag(x, y) def do_unflag(self, arg_string): """flag X Y Remove flag from space X, Y.""" if not self.board: return self.onecmd('help new') try: x, y = (int(arg) for arg in arg_string.split()) except ValueError: return self.onecmd('help unflag') self.board.unflag(x, y) def do_unmark(self, arg_string): """mark X Y Remove flag from space X, Y.""" if not self.board: return self.onecmd('help new') try: x, y = (int(arg) for arg in arg_string.split()) except ValueError: return self.onecmd('help unmark') self.board.unflag(x, y) # ----- parser handling ----- def _exit(self): print('Goodbye') return True def do_bye(self, __): """Exit the game.""" return self._exit() def do_exit(self, __): """Exit the game.""" return self._exit() def do_quit(self, __): """Exit the game.""" return self._exit() def do_EOF(self, __): """Exit the game.""" return self._exit() # ----- meta ----- def precmd(self, line): if line != 'EOF': line = line.lower() return line def postcmd(self, stop, line): if stop: return True print() if self.board: print(self.board) else: print(NEW_GAME_ADVICE) return False
def __init__(self): self.minesweeper_board = MinesweeperBoard(5,5) self.moves = [] self.current_move = {} self.is_board_completed = False
def test_get_board_size_default(): game = MinesweeperBoard() assert game.row_size == 8 and game.column_size == 10
def test_loading_from_file_maintains_board_state(): test_board = [[Tile(), Tile()], [Tile(), Tile()]] test_bomb_coordinates = [(0, 0)] test_board[0][0].bomb = True # test_board[0][0].is_revealed = False # test_board[1][1].is_revealed = True # test_board[1][0].is_revealed = True # test_board[0][1].is_revealed = False game = MinesweeperBoard(test_board=test_board, test_bombs_coordinates=test_bomb_coordinates) assert game.game_over() is False game.players_choice_of_tile_and_action((1, 0), 'reveal') assert game.game_over() is False assert game.human_wins is False game.save_game() game = MinesweeperBoard(load_from_file=True) assert game.game_over() is False assert game.human_wins is False assert game.board[0][0].is_revealed is False assert game.board[0][1].is_revealed is False assert game.board[1][1].is_revealed is False assert game.board[0][0].bomb is True assert game.board[0][1].bomb is False assert game.board[1][0].bomb is False assert game.board[1][1].bomb is False
def test_get_board_size_medium(): game = MinesweeperBoard(Difficulty.MEDIUM) assert game.row_size == 14 and game.column_size == 20
def test_get_number_of_bombs_easy(): game = MinesweeperBoard(Difficulty.EASY) assert game.number_of_bombs == 10
def test_init(): board = MinesweeperBoard(3, 3, 1) assert(not board.end_state)
def test_build_board(): game = MinesweeperBoard(Difficulty.EASY) assert len(game.board) == game.row_size assert len(game.board[0]) == game.column_size