Ejemplo n.º 1
0
    def __init__(self,
                 algorithm_params=dict(),
                 mode='Human vs AI',
                 algorithm='Minmax'):
        self._board = Board()
        if algorithm == 'Minmax':
            self._algorithm = MiniMax(Player.AI, Player.HUMAN, heuristic,
                                      **algorithm_params)
        elif algorithm == 'Alpha-beta pruning':
            self._algorithm = MiniMax(Player.AI,
                                      Player.HUMAN,
                                      heuristic,
                                      alpha_beta=True,
                                      **algorithm_params)
        elif algorithm == 'MCTS':
            self._algorithm = MCTS(1000, 2)
        else:
            raise ValueError(f"Algorithm {algorithm} not known")

        self._last_move = None
        if mode == 'AI vs AI':
            self._second_algo = MiniMax(Player.HUMAN, Player.AI, heuristic,
                                        **algorithm_params)

        self._start_time = None
        self._total_time = None
Ejemplo n.º 2
0
    def test_rows_complicated(self):
        board = Board()

        board._board = np.array([
            [2, 1, 2, 0, 0, 0, 0],
            [2, 1, 2, 2, 1, 0, 0],
            [1, 1, 1, 2, 2, 2, 0],
        ])

        result = count_rows(board.array)

        self.assertDictEqual(result[Player.AI], dict())
        self.assertDictEqual(result[Player.HUMAN], {3: 1, 1: 1})
Ejemplo n.º 3
0
    def test_diagonal(self):
        board = Board()
        board._board = np.array([
            [1, 0, 0, 1, 0, 0, 0],
            [0, 1, 0, 0, 0, 0, 0],
            [0, 0, 1, 1, 0, 0, 0],
            [0, 0, 0, 0, 1, 0, 0],
            [0, 1, 0, 0, 1, 1, 0],
            [0, 0, 1, 0, 0, 1, 1],
        ])

        actual = count_diagonals(board.array)
        self.assertDictEqual(actual, {4: 1, 3: 1, 2: 2})
Ejemplo n.º 4
0
    def test_diagonal_all(self):
        board = Board()
        board._board = np.array([
            [0, 1, 0, 0, 1, 0, 0],
            [0, 0, 1, 0, 0, 1, 0],
            [0, 0, 0, 1, 0, 0, 1],
            [0, 0, 1, 0, 0, 0, 1],
            [0, 1, 0, 1, 0, 1, 0],
            [1, 0, 1, 0, 1, 0, 0],
        ])

        actual = count_diagonals(board, Player.AI)
        self.assertDictEqual(actual, {3: 4, 4: 1, 2: 2})
Ejemplo n.º 5
0
    def test_rows(self):
        board = Board()

        board._board = np.array([
            [0, 0, 0, 0, 0, 0, 0],
            [0, 0, 0, 0, 0, 0, 0],
            [1, 1, 1, 0, 2, 2, 0],
        ])

        result = count_rows(board.array)

        self.assertDictEqual(result[Player.AI], {
            3: 1,
        })
        self.assertDictEqual(result[Player.HUMAN], {2: 1})
Ejemplo n.º 6
0
    def test_cols(self):
        board = Board()

        board._board = np.array([
            [2, 1, 0, 0, 0, 0, 0],
            [1, 1, 0, 0, 0, 0, 0],
            [1, 1, 0, 0, 0, 0, 1],
            [1, 1, 2, 0, 0, 0, 1],
            [1, 2, 2, 0, 0, 0, 1],
        ])

        result = count_columns(board.array)

        self.assertDictEqual(result[Player.AI], {4: 2, 3: 1, 2: 1})
        self.assertDictEqual(result[Player.HUMAN], {2: 1, 1: 1})
    def test_attack(self):
        board = Board()
        _fill_board(board, [(5, 0), (5, 2), (5, 3)], Player.HUMAN)

        minimax = MiniMax(4, Player.HUMAN, Player.AI, heuristic)
        column = minimax(board)
        self.assertEqual(1, column)
Ejemplo n.º 8
0
class Game:
    def __init__(self,
                 algorithm_params=dict(),
                 mode='Human vs AI',
                 algorithm='Minmax'):
        self._board = Board()
        if algorithm == 'Minmax':
            self._algorithm = MiniMax(Player.AI, Player.HUMAN, heuristic,
                                      **algorithm_params)
        elif algorithm == 'Alpha-beta pruning':
            self._algorithm = MiniMax(Player.AI,
                                      Player.HUMAN,
                                      heuristic,
                                      alpha_beta=True,
                                      **algorithm_params)
        elif algorithm == 'MCTS':
            self._algorithm = MCTS(1000, 2)
        else:
            raise ValueError(f"Algorithm {algorithm} not known")

        self._last_move = None
        if mode == 'AI vs AI':
            self._second_algo = MiniMax(Player.HUMAN, Player.AI, heuristic,
                                        **algorithm_params)

        self._start_time = None
        self._total_time = None

    def ai_move(self):
        column = self._algorithm(self._board)
        self._last_move = self._board.drop_coin(column, Player.AI)

    def player_move(self, column):
        if self._start_time is None:
            self._start_time = time()

        if column is None:
            column = self._second_algo(self._board)

        self._last_move = self._board.drop_coin(column, Player.HUMAN)

    def check_end(self):
        if self._last_move is None:
            return False

        end = self._board.check_board_state(*self._last_move)
        return end
    def test_attack_or_block(self):
        board = Board()
        _fill_board(board, [(5, 0), (5, 1)], Player.AI)
        _fill_board(board, [(5, 4), (5, 5), (5, 6)], Player.HUMAN)

        minimax = MiniMax(3, Player.AI, Player.HUMAN, heuristic)
        column = minimax(board)
        self.assertEqual(3, column)
    def test_example_3(self):
        """"
        0 0 0 0 0 0 0
        0 0 0 0 0 0 0
        0 0 1 0 0 0 0
        0 0 1 2 2 0 0
        0 0 2 2 1 0 0
        0 2 2 2 2 1 0
        """

        board = Board()
        _fill_board(board, [(2, 2), (3, 2), (4, 4), (5, 5)], Player.AI)
        _fill_board(board, [(3, 4), (3, 4), (4, 2), (4, 3), (5, 2), (5, 3),
                            (5, 4), (5, 1)], Player.HUMAN)

        self.assertFalse(board.check_board_state(Player.AI))

        self.assertTrue(board.check_board_state(Player.HUMAN))
    def test_example_5(self):
        """"
        0 0 0 0 0 0 0
        0 0 0 1 0 0 0
        0 0 1 2 0 2 0
        0 1 1 2 0 0 0
        1 2 2 2 0 0 0
        2 2 1 2 0 1 0
        """

        board = Board()
        _fill_board(board, [(1, 3), (2, 2), (3, 1), (4, 0), (3, 2), (5, 2),
                            (5, 5), (2, 3), (4, 5)], Player.AI)
        _fill_board(board, [(2, 5), (3, 3), (4, 1), (4, 2), (4, 3), (5, 0),
                            (5, 1), (5, 3), (3, 5)], Player.HUMAN)

        self.assertTrue(board.check_board_state(Player.AI))

        self.assertFalse(board.check_board_state(Player.HUMAN))
 def test_init(self):
     _ = Board()
 def test_empty(self):
     board = Board()
     self.assertFalse(board.check_board_state(0, 0))
    def test_win_row(self):
        board = Board()
        _fill_board(board, [(3, 2), (3, 3), (3, 4), (3, 5)], Player.AI)

        self.assertTrue(board.check_board_state(5, 5))
    def test_win_col(self):
        board = Board()
        _fill_board(board, [(0, 2), (1, 2), (2, 2), (3, 2)], Player.AI)

        self.assertTrue(board.check_board_state(Player.AI))
    def test_win_diagonal(self):
        board = Board()
        _fill_board(board, [(1, 1), (2, 2), (3, 3), (4, 4)], Player.AI)

        self.assertTrue(board.check_board_state(Player.AI))
    def test_not_win_first_player(self):
        board = Board()
        _fill_board(board, [(3, 2), (3, 3), (3, 4), (3, 6)], Player.AI)

        self.assertFalse(board.check_board_state(Player.AI))