Esempio n. 1
0
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
Esempio n. 7
0
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
Esempio n. 11
0
 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
Esempio n. 16
0
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