def test_get_legal_moves(self):
        game = dnbpy.Game((1, 1), ['player1', 'player2'])
        self.assertEqual([0, 1, 2, 3], game.get_legal_moves())

        game = dnbpy.Game((1, 1), ['player1', 'player2'], board_state=[0, 1, 1, 0])
        self.assertEqual([0, 3], game.get_legal_moves())

        game.select_edge(0, 'player1')
        self.assertEqual([3], game.get_legal_moves())

        game.select_edge(3, 'player2')
        self.assertEqual([], game.get_legal_moves())
Exemple #2
0
 def test_get_strings_and_coins_1x1_edges_selected(self):
     game = dnbpy.Game((1, 1), ['p1', 'p2'])
     game.select_edge(0, 'p1')
     game.select_edge(2, 'p2')
     """
     *---------*  
               |  
     1         |  
               |  
     *    3    *
     """
     strings_and_coins = dnbpy.StringsAndCoins(game)
     self.assertEqual(strings_and_coins.nodes, [
         '0-1-2-3',
         'ground-1',
         'ground-2',
         'ground-0',
         'ground-3',
     ])
     self.assertEqual(strings_and_coins.edges, [('ground-1', '0-1-2-3'),
                                                ('ground-3', '0-1-2-3')])
     self.assertEqual(0, strings_and_coins.get_node_degree('ground-0'))
     self.assertEqual(1, strings_and_coins.get_node_degree('ground-1'))
     self.assertEqual(0, strings_and_coins.get_node_degree('ground-2'))
     self.assertEqual(1, strings_and_coins.get_node_degree('ground-3'))
     self.assertEqual(2, strings_and_coins.get_node_degree('0-1-2-3'))
     self.assertEqual(strings_and_coins.to_adjacency_matrix(),
                      [[0, 1, 0, 0, 1], [1, 0, 0, 0, 0], [0, 0, 0, 0, 0],
                       [0, 0, 0, 0, 0], [1, 0, 0, 0, 0]])
Exemple #3
0
 def test_get_long_chains_3x3_multiple(self):
     game = dnbpy.Game((3, 3), ['p1', 'p2'])
     game.select_edge(3, 'p1')
     game.select_edge(10, 'p2')
     game.select_edge(17, 'p1')
     game.select_edge(4, 'p2')
     game.select_edge(11, 'p1')
     game.select_edge(18, 'p2')
     game.select_edge(5, 'p1')
     game.select_edge(12, 'p2')
     game.select_edge(19, 'p1')
     game.select_edge(6, 'p2')
     game.select_edge(13, 'p1')
     game.select_edge(20, 'p2')
     """
     This board contains 3 chains (i.e. a string of at least 3 non-ground nodes):
     *    0    *    1    *    2    *  
     |         |         |         |  
     |         |         |         |  
     |         |         |         |  
     *    7    *    8    *    9    *  
     |         |         |         |  
     |         |         |         |  
     |         |         |         |  
     *    14   *    15   *    16   *  
     |         |         |         |  
     |         |         |         |  
     |         |         |         |  
     *    21   *    22   *    23   *      
     """
     strings_and_coins = dnbpy.StringsAndCoins(game)
     chains = strings_and_coins.get_long_chains()
     self.assertEqual([['0-3-4-7', '7-10-11-14', '14-17-18-21'],
                       ['1-4-5-8', '8-11-12-15', '15-18-19-22'],
                       ['2-5-6-9', '9-12-13-16', '16-19-20-23']], chains)
Exemple #4
0
 def test_get_strings_and_coins_1x1(self):
     game = dnbpy.Game((1, 1), ['p1', 'p2'])
     """
     *    0    *  
          
     1         2  
                  
     *    3    *  
     """
     strings_and_coins = dnbpy.StringsAndCoins(game)
     self.assertEqual(strings_and_coins.nodes, [
         '0-1-2-3',
         'ground-1',
         'ground-2',
         'ground-0',
         'ground-3',
     ])
     self.assertEqual(strings_and_coins.edges, [('ground-1', '0-1-2-3'),
                                                ('ground-2', '0-1-2-3'),
                                                ('ground-0', '0-1-2-3'),
                                                ('ground-3', '0-1-2-3')])
     self.assertEqual(1, strings_and_coins.get_node_degree('ground-0'))
     self.assertEqual(1, strings_and_coins.get_node_degree('ground-1'))
     self.assertEqual(1, strings_and_coins.get_node_degree('ground-2'))
     self.assertEqual(1, strings_and_coins.get_node_degree('ground-3'))
     self.assertEqual(4, strings_and_coins.get_node_degree('0-1-2-3'))
     self.assertEqual(strings_and_coins.to_adjacency_matrix(),
                      [[0, 1, 1, 1, 1], [1, 0, 0, 0, 0], [1, 0, 0, 0, 0],
                       [1, 0, 0, 0, 0], [1, 0, 0, 0, 0]])
 def test_get_board_state_3x3(self):
     game = dnbpy.Game((3, 3), ['player1', 'player2'])
     board_state = game.get_board_state()
     self.assertEqual(board_state, [
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0
     ])
Exemple #6
0
    def test_policy_with_heuristic(self):
        board_size = (3, 3)

        def heuristic(board_state, max_score, min_score, is_max):
            return -min_score

        players = {
            "p1":
            dnbpy.Level3MinimaxPolicy(board_size,
                                      3,
                                      random_state=0,
                                      heuristic=heuristic),
            "p2":
            dnbpy.Level2HeuristicPolicy(board_size, random_state=0)
        }

        game = dnbpy.Game(board_size, ["p1", "p2"])

        while not game.is_finished():
            current_player = game.get_current_player()
            opp_player = "p2" if current_player == "p1" else "p1"
            edge = players[current_player].select_edge(
                game.get_board_state(), game.get_score(current_player),
                game.get_score(opp_player))
            game.select_edge(edge, current_player)

        self.assertEqual(5, game.get_score("p1"))
        self.assertEqual(4, game.get_score("p2"))
Exemple #7
0
 def test_to_string_3x3(self):
     game = dnbpy.Game((3, 3), ['p1', 'p2'])
     game.select_edge(0, 'p1')
     game.select_edge(9, 'p2')
     game.select_edge(10, 'p1')
     game.select_edge(13, 'p2')
     game.select_edge(2, 'p1')
     game.select_edge(6, 'p2')
     game.select_edge(5, 'p1')
     game.select_edge(12, 'p1')
     game.select_edge(16, 'p2')
     expected = ("*---------*    1    *---------*  \n"
                 "                    |         |  \n"
                 "3         4         |   p1    |  \n"
                 "                    |         |  \n"
                 "*    7    *    8    *---------*  \n"
                 "|                   |         |  \n"
                 "|         11        |   p2    |  \n"
                 "|                   |         |  \n"
                 "*    14   *    15   *---------*  \n"
                 "                                 \n"
                 "17        18        19        20 \n"
                 "                                 \n"
                 "*    21   *    22   *    23   *  \n"
                 "\n"
                 "p1: 1, p2: 1")
     self.assertEqual(str(game), expected)
Exemple #8
0
 def test_get_long_chains_3x3(self):
     game = dnbpy.Game((3, 3), ['p1', 'p2'])
     game.select_edge(4, 'p1')
     game.select_edge(12, 'p2')
     game.select_edge(9, 'p1')
     game.select_edge(1, 'p2')
     game.select_edge(11, 'p1')
     game.select_edge(3, 'p2')
     game.select_edge(10, 'p1')
     game.select_edge(2, 'p2')
     """
     This board contains a single chain (i.e. a string of at least 3 non-ground nodes):
     *    0    *---------*---------*  
     |         |                      
     |         |         5         6  
     |         |                      
     *    7    *    8    *---------*  
     |         |         |            
     |         |         |         13 
     |         |         |            
     *    14   *    15   *    16   *  
                                      
     17        18        19        20 
                                      
     *    21   *    22   *    23   *  
     """
     strings_and_coins = dnbpy.StringsAndCoins(game)
     chains = strings_and_coins.get_long_chains()
     self.assertEqual([['2-5-6-9', '1-4-5-8', '8-11-12-15']], chains)
Exemple #9
0
 def test_get_all_boxes_2x2(self):
     game = dnbpy.Game((2, 2), ['player1', 'player2'])
     boxes = game.get_all_boxes()
     self.assertTrue(len(boxes) == 4)
     self.assertEqual(str(boxes[0]), '0-2-3-5')
     self.assertEqual(str(boxes[1]), '1-3-4-6')
     self.assertEqual(str(boxes[2]), '5-7-8-10')
     self.assertEqual(str(boxes[3]), '6-8-9-11')
Exemple #10
0
 def test_get_all_boxes_2x3(self):
     game = dnbpy.Game((2, 3), ['player1', 'player2'])
     boxes = game.get_all_boxes()
     self.assertTrue(len(boxes) == 6)
     self.assertEqual(str(boxes[0]), '0-3-4-7')
     self.assertEqual(str(boxes[1]), '1-4-5-8')
     self.assertEqual(str(boxes[2]), '2-5-6-9')
     self.assertEqual(str(boxes[3]), '7-10-11-14')
     self.assertEqual(str(boxes[4]), '8-11-12-15')
     self.assertEqual(str(boxes[5]), '9-12-13-16')
 def test_get_current_player(self):
     game = dnbpy.Game((1, 1), ['player1', 'player2'])
     self.assertEqual(game.get_current_player(), 'player1')
     game.select_edge(0, 'player1')
     self.assertEqual(game.get_current_player(), 'player2')
     game.select_edge(1, 'player2')
     self.assertEqual(game.get_current_player(), 'player1')
     game.select_edge(2, 'player1')
     self.assertEqual(game.get_current_player(), 'player2')
     game.select_edge(3, 'player2')
     self.assertIsNone(game.get_current_player())
Exemple #12
0
 def test_get_boxes_2x2(self):
     game = dnbpy.Game((2, 2), ['player1', 'player2'])
     game.select_edge(0, 'player1')
     game.select_edge(2, 'player2')
     game.select_edge(3, 'player1')
     game.select_edge(5, 'player2')
     boxes = game.get_boxes('player1')
     self.assertEqual(len(boxes), 0)
     boxes = game.get_boxes('player2')
     self.assertEqual(len(boxes), 1)
     self.assertEqual(str(boxes[0]), '0-2-3-5')
Exemple #13
0
 def test_to_string_1x1(self):
     game = dnbpy.Game((1, 1), ['p1', 'p2'])
     game.select_edge(0, 'p1')
     game.select_edge(1, 'p2')
     expected = ("*---------*  \n"
                 "|            \n"
                 "|         2  \n"
                 "|            \n"
                 "*    3    *  \n"
                 "\n"
                 "p1: 0, p2: 0")
     self.assertEqual(str(game), expected)
Exemple #14
0
 def test_select_edge_2x2(self):
     game = dnbpy.Game((2, 2), ['player1', 'player2'])
     next_player, boxes_made = game.select_edge(2, 'player1')
     self.assertEqual(next_player, 'player2')
     self.assertEqual(boxes_made, 0)
     board_state = game.get_board_state()
     self.assertEqual(board_state, [0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0])
     next_player, boxes_made = game.select_edge(5, 'player2')
     self.assertEqual(next_player, 'player1')
     self.assertEqual(boxes_made, 0)
     board_state = game.get_board_state()
     self.assertEqual(board_state, [0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0])
Exemple #15
0
 def test_get_all_boxes_3x3(self):
     game = dnbpy.Game((3, 3), ['player1', 'player2'])
     boxes = game.get_all_boxes()
     self.assertTrue(len(boxes) == 9)
     self.assertEqual(str(boxes[0]), '0-3-4-7')
     self.assertEqual(str(boxes[1]), '1-4-5-8')
     self.assertEqual(str(boxes[2]), '2-5-6-9')
     self.assertEqual(str(boxes[3]), '7-10-11-14')
     self.assertEqual(str(boxes[4]), '8-11-12-15')
     self.assertEqual(str(boxes[5]), '9-12-13-16')
     self.assertEqual(str(boxes[6]), '14-17-18-21')
     self.assertEqual(str(boxes[7]), '15-18-19-22')
     self.assertEqual(str(boxes[8]), '16-19-20-23')
Exemple #16
0
 def test_to_string_1x2(self):
     game = dnbpy.Game((1, 2), ['p1', 'p2'])
     game.select_edge(1, 'p1')
     game.select_edge(3, 'p2')
     game.select_edge(6, 'p1')
     expected = ("*    0    *---------*  \n"
                 "          |            \n"
                 "2         |         4  \n"
                 "          |            \n"
                 "*    5    *---------*  \n"
                 "\n"
                 "p1: 0, p2: 0")
     self.assertEqual(str(game), expected)
Exemple #17
0
 def test_select_edge_returns_next_player(self):
     game = dnbpy.Game((1, 1), ['player1', 'player2'])
     next_player, boxes_made = game.select_edge(0, 'player1')
     self.assertEqual(next_player, 'player2')
     self.assertEqual(boxes_made, 0)
     next_player, boxes_made = game.select_edge(1, 'player2')
     self.assertEqual(next_player, 'player1')
     self.assertEqual(boxes_made, 0)
     next_player, boxes_made = game.select_edge(2, 'player1')
     self.assertEqual(next_player, 'player2')
     self.assertEqual(boxes_made, 0)
     next_player, boxes_made = game.select_edge(3, 'player2')
     self.assertEqual(boxes_made, 1)
     self.assertIsNone(next_player)
     self.assertEqual(game.get_score('player1'), 0)
     self.assertEqual(game.get_score('player2'), 1)
     with self.assertRaises(Exception) as e:
         game.select_edge(1, 'player1')
     self.assertTrue(("game is finished" in str(e.exception)))
Exemple #18
0
 def test_get_score_2x2(self):
     game = dnbpy.Game((2, 2), ['player1', 'player2'])
     game.select_edge(0, 'player1')
     game.select_edge(2, 'player2')
     game.select_edge(3, 'player1')
     game.select_edge(5, 'player2')
     score = game.get_score('player1')
     self.assertEqual(score, 0)
     score = game.get_score('player2')
     self.assertEqual(score, 1)
     self.assertFalse(game.is_finished())
     game.select_edge(11, 'player2')
     game.select_edge(6, 'player1')
     game.select_edge(10, 'player2')
     game.select_edge(8, 'player1')
     score = game.get_score('player1')
     self.assertEqual(score, 0)
     score = game.get_score('player2')
     self.assertEqual(score, 1)
     game.select_edge(9, 'player2')
     game.select_edge(7, 'player2')
     score = game.get_score('player1')
     self.assertEqual(score, 0)
     score = game.get_score('player2')
     self.assertEqual(score, 3)
     game.select_edge(4, 'player2')
     game.select_edge(1, 'player1')
     score = game.get_score('player1')
     self.assertEqual(score, 1)
     score = game.get_score('player2')
     self.assertEqual(score, 3)
     self.assertTrue(game.is_finished())
     with self.assertRaises(Exception) as e:
         game.select_edge(1, 'player1')
     self.assertTrue(("game is finished" in str(e.exception)))
     boxes = game.get_boxes('player1')
     self.assertEqual(len(boxes), 1)
     self.assertEqual(str(boxes[0]), '1-3-4-6')
     boxes = game.get_boxes('player2')
     self.assertEqual(len(boxes), 3)
     self.assertEqual(str(boxes[0]), '5-7-8-10')
     self.assertEqual(str(boxes[1]), '0-2-3-5')
     self.assertEqual(str(boxes[2]), '6-8-9-11')
Exemple #19
0
 def test_to_string_2x2(self):
     game = dnbpy.Game((2, 2), ['p1', 'p2'])
     game.select_edge(1, 'p1')
     game.select_edge(3, 'p2')
     game.select_edge(4, 'p1')
     game.select_edge(6, 'p2')
     game.select_edge(11, 'p2')
     expected = ("*    0    *---------*  \n"
                 "          |         |  \n"
                 "2         |   p2    |  \n"
                 "          |         |  \n"
                 "*    5    *---------*  \n"
                 "                       \n"
                 "7         8         9  \n"
                 "                       \n"
                 "*    10   *---------*  \n"
                 "\n"
                 "p1: 0, p2: 1")
     self.assertEqual(str(game), expected)
Exemple #20
0
    def test_policy_with_no_depth(self):
        board_size = (3, 3)

        players = {
            "p1": dnbpy.Level3MinimaxPolicy(board_size, random_state=0),
            "p2": dnbpy.Level2HeuristicPolicy(board_size, random_state=0)
        }

        game = dnbpy.Game(board_size, ["p1", "p2"])

        while not game.is_finished():
            current_player = game.get_current_player()
            opp_player = "p2" if current_player == "p1" else "p1"
            edge = players[current_player].select_edge(
                game.get_board_state(), game.get_score(current_player),
                game.get_score(opp_player))
            game.select_edge(edge, current_player)

        self.assertEqual(7, game.get_score("p1"))
        self.assertEqual(2, game.get_score("p2"))
Exemple #21
0
    def test_policy(self):
        board_size = (3, 3)
        players = {
            "p1":
            dnbpy.Level1HeuristicPolicy(board_size, random_state=0),
            "p2":
            dnbpy.MCTSPolicy(board_size, 500, reset_tree=True, random_state=0)
        }

        game = dnbpy.Game(board_size, ["p1", "p2"])

        while not game.is_finished():
            current_player = game.get_current_player()
            opp_player = "p2" if current_player == "p1" else "p1"
            edge = players[current_player].select_edge(
                game.get_board_state(), game.get_score(current_player),
                game.get_score(opp_player))
            game.select_edge(edge, current_player)

        self.assertEqual(4, game.get_score("p1"))
        self.assertEqual(5, game.get_score("p2"))
Exemple #22
0
 def test_get_long_chains_2x3_closed(self):
     game = dnbpy.Game((2, 3), ['p1', 'p2'])
     game.select_edge(7, 'p1')
     game.select_edge(8, 'p2')
     game.select_edge(9, 'p1')
     game.select_edge(10, 'p2')
     game.select_edge(13, 'p1')
     game.select_edge(14, 'p2')
     game.select_edge(15, 'p1')
     """
     This board contains a single chain (i.e. a string of at least 3 non-ground nodes):
     *    0    *    1    *    2    *  
                                  
     3         4         5         6  
                                  
     *---------*---------*---------*  
     |                             |  
     |         11        12        |  
     |                             |  
     *---------*---------*    16   *  
     """
     strings_and_coins = dnbpy.StringsAndCoins(game)
     chains = strings_and_coins.get_long_chains()
     self.assertEqual([['7-10-11-14', '8-11-12-15', '9-12-13-16']], chains)
Exemple #23
0
 def test_get_strings_and_coins_3x2(self):
     game = dnbpy.Game((3, 2), ['p1', 'p2'])
     """
     *    0    *    1    *  
                            
     2         3         4  
                            
     *    5    *    6    *  
                            
     7         8         9  
                            
     *    10   *    11   *  
                            
     12        13        14 
                            
     *    15   *    16   * 
     """
     strings_and_coins = dnbpy.StringsAndCoins(game)
     self.assertEqual(strings_and_coins.nodes, [
         '0-2-3-5', 'ground-2', 'ground-0', '1-3-4-6', 'ground-4',
         'ground-1', '5-7-8-10', 'ground-7', '6-8-9-11', 'ground-9',
         '10-12-13-15', 'ground-12', 'ground-15', '11-13-14-16',
         'ground-14', 'ground-16'
     ])
     self.assertEqual(strings_and_coins.edges,
                      [('ground-2', '0-2-3-5'), ('ground-0', '0-2-3-5'),
                       ('0-2-3-5', '1-3-4-6'), ('ground-4', '1-3-4-6'),
                       ('ground-1', '1-3-4-6'), ('0-2-3-5', '5-7-8-10'),
                       ('ground-7', '5-7-8-10'), ('1-3-4-6', '6-8-9-11'),
                       ('5-7-8-10', '6-8-9-11'), ('ground-9', '6-8-9-11'),
                       ('5-7-8-10', '10-12-13-15'),
                       ('ground-12', '10-12-13-15'),
                       ('ground-15', '10-12-13-15'),
                       ('6-8-9-11', '11-13-14-16'),
                       ('10-12-13-15', '11-13-14-16'),
                       ('ground-14', '11-13-14-16'),
                       ('ground-16', '11-13-14-16')])
     self.assertEqual(4, strings_and_coins.get_node_degree('0-2-3-5'))
     self.assertEqual(1, strings_and_coins.get_node_degree('ground-2'))
     self.assertEqual(1, strings_and_coins.get_node_degree('ground-0'))
     self.assertEqual(4, strings_and_coins.get_node_degree('1-3-4-6'))
     self.assertEqual(1, strings_and_coins.get_node_degree('ground-4'))
     self.assertEqual(1, strings_and_coins.get_node_degree('ground-1'))
     self.assertEqual(4, strings_and_coins.get_node_degree('5-7-8-10'))
     self.assertEqual(1, strings_and_coins.get_node_degree('ground-7'))
     self.assertEqual(4, strings_and_coins.get_node_degree('6-8-9-11'))
     self.assertEqual(1, strings_and_coins.get_node_degree('ground-9'))
     self.assertEqual(4, strings_and_coins.get_node_degree('10-12-13-15'))
     self.assertEqual(1, strings_and_coins.get_node_degree('ground-12'))
     self.assertEqual(1, strings_and_coins.get_node_degree('ground-15'))
     self.assertEqual(4, strings_and_coins.get_node_degree('11-13-14-16'))
     self.assertEqual(1, strings_and_coins.get_node_degree('ground-14'))
     self.assertEqual(1, strings_and_coins.get_node_degree('ground-16'))
     self.assertEqual(strings_and_coins.to_adjacency_matrix(),
                      [[0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                       [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                       [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                       [1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0],
                       [0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                       [0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                       [1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0],
                       [0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                       [0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0],
                       [0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0],
                       [0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0],
                       [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0],
                       [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0],
                       [0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1],
                       [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0],
                       [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0]])
Exemple #24
0
 def test_get_score_player_not_recognized(self):
     with self.assertRaises(Exception) as e:
         game = dnbpy.Game((2, 2), ['player1', 'player2'])
         game.get_score('player3')
     self.assertTrue(("player not recognized: player3" in str(e.exception)))
Exemple #25
0
 def test_get_strings_and_coins_2x3(self):
     game = dnbpy.Game((2, 3), ['p1', 'p2'])
     """
     *    0    *    1    *    2    *  
                              
     3         4         5         6  
                                      
     *    7    *    8    *    9    *  
                                      
     10        11        12        13 
                                      
     *    14   *    15   *    16   *  
     """
     strings_and_coins = dnbpy.StringsAndCoins(game)
     self.assertEqual(strings_and_coins.nodes, [
         '0-3-4-7', 'ground-3', 'ground-0', '1-4-5-8', 'ground-1',
         '2-5-6-9', 'ground-6', 'ground-2', '7-10-11-14', 'ground-10',
         'ground-14', '8-11-12-15', 'ground-15', '9-12-13-16', 'ground-13',
         'ground-16'
     ])
     self.assertEqual(strings_and_coins.edges,
                      [('ground-3', '0-3-4-7'), ('ground-0', '0-3-4-7'),
                       ('0-3-4-7', '1-4-5-8'), ('ground-1', '1-4-5-8'),
                       ('1-4-5-8', '2-5-6-9'), ('ground-6', '2-5-6-9'),
                       ('ground-2', '2-5-6-9'), ('0-3-4-7', '7-10-11-14'),
                       ('ground-10', '7-10-11-14'),
                       ('ground-14', '7-10-11-14'),
                       ('1-4-5-8', '8-11-12-15'),
                       ('7-10-11-14', '8-11-12-15'),
                       ('ground-15', '8-11-12-15'),
                       ('2-5-6-9', '9-12-13-16'),
                       ('8-11-12-15', '9-12-13-16'),
                       ('ground-13', '9-12-13-16'),
                       ('ground-16', '9-12-13-16')])
     self.assertEqual(4, strings_and_coins.get_node_degree('0-3-4-7'))
     self.assertEqual(1, strings_and_coins.get_node_degree('ground-3'))
     self.assertEqual(1, strings_and_coins.get_node_degree('ground-0'))
     self.assertEqual(4, strings_and_coins.get_node_degree('1-4-5-8'))
     self.assertEqual(1, strings_and_coins.get_node_degree('ground-1'))
     self.assertEqual(4, strings_and_coins.get_node_degree('2-5-6-9'))
     self.assertEqual(1, strings_and_coins.get_node_degree('ground-6'))
     self.assertEqual(1, strings_and_coins.get_node_degree('ground-2'))
     self.assertEqual(4, strings_and_coins.get_node_degree('7-10-11-14'))
     self.assertEqual(1, strings_and_coins.get_node_degree('ground-10'))
     self.assertEqual(1, strings_and_coins.get_node_degree('ground-14'))
     self.assertEqual(4, strings_and_coins.get_node_degree('8-11-12-15'))
     self.assertEqual(1, strings_and_coins.get_node_degree('ground-15'))
     self.assertEqual(4, strings_and_coins.get_node_degree('9-12-13-16'))
     self.assertEqual(1, strings_and_coins.get_node_degree('ground-13'))
     self.assertEqual(1, strings_and_coins.get_node_degree('ground-16'))
     self.assertEqual(strings_and_coins.to_adjacency_matrix(),
                      [[0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0],
                       [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                       [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                       [1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0],
                       [0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                       [0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0],
                       [0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                       [0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                       [1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0],
                       [0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0],
                       [0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0],
                       [0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0],
                       [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0],
                       [0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1],
                       [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0],
                       [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0]])
Exemple #26
0
def play():
    print("DNBPy - Play")
    num_players = int(input("How many players?: "))

    if num_players < 2:
        print("Error: there must be at least two players")
        sys.exit(0)

    players = []
    for n in range(num_players):
        player = input("player {} name: ".format(n + 1))
        players.append(player)

    if len(set(players)) == 1:
        print("Error: player names must be unique")
        sys.exit(0)

    board_rows = int(input("Number of board rows: "))
    if board_rows < 1:
        print("Error: there must be at least one row")
        sys.exit(0)

    board_cols = int(input("Number of board columns: "))
    if board_cols < 1:
        print("Error: there must be at least one column")
        sys.exit(0)

    minimax_depth = None
    if "$L3" in players:
        val = input("Minimax depth (leave empty for variable depth): ")
        if len(val.strip()) > 0:
            minimax_depth = int(val)
            if minimax_depth < 1:
                print("Error: minimax depth must be greater than 0")
                sys.exit(0)

    num_playouts = 100
    if "$mcts" in players:
        num_playouts = int(input("Number of playouts: "))
        if num_playouts < 1:
            print("Error: number of playouts must be greater than 0")
            sys.exit(0)

    print("preparing game...")

    board_size = (board_rows, board_cols)
    game = dnbpy.Game(board_size, players)
    print(game)

    computer_players = {
        "$random":
        dnbpy.RandomPolicy(),
        "$L1":
        dnbpy.Level1HeuristicPolicy(board_size=board_size),
        "$L2":
        dnbpy.Level2HeuristicPolicy(board_size=board_size),
        "$L3":
        dnbpy.Level3MinimaxPolicy(board_size=board_size,
                                  depth=minimax_depth,
                                  update_alpha=True),
        "$mcts":
        dnbpy.MCTSPolicy(board_size=board_size, num_playouts=num_playouts)
    }

    while not game.is_finished():
        current_player = game.get_current_player()

        if current_player in computer_players:
            # get the first player that isn't the current player
            opp_player = [p for p in players if p != current_player][0]
            move = computer_players[current_player].select_edge(
                game.get_board_state(), game.get_score(current_player),
                game.get_score(opp_player))
            game.select_edge(move, current_player)
            print("player %s selects edge %s" % (current_player, move))
        else:
            try:
                move = int(
                    input("{} select your move: ".format(current_player)))
                game.select_edge(move, current_player)
            except Exception:
                print("illegal move selection.. select again")

        print(game)
Exemple #27
0
 def test_select_taken_edge(self):
     with self.assertRaises(Exception) as e:
         game = dnbpy.Game((2, 2), ['player1', 'player2'])
         game.select_edge(2, 'player1')
         game.select_edge(2, 'player2')
     self.assertTrue(("edge already selected: 2" in str(e.exception)))
Exemple #28
0
 def test_get_strings_and_coins_2x3_edges_selected(self):
     game = dnbpy.Game((2, 3), ['p1', 'p2'])
     game.select_edge(4, 'p1')
     game.select_edge(12, 'p2')
     game.select_edge(9, 'p1')
     game.select_edge(1, 'p2')
     """
     *    0    *---------*    2    *  
               |                      
     3         |         5         6  
               |                      
     *    7    *    8    *---------*  
                         |            
     10        11        |         13 
                         |            
     *    14   *    15   *    16   *  
     """
     strings_and_coins = dnbpy.StringsAndCoins(game)
     self.assertEqual(strings_and_coins.nodes, [
         '0-3-4-7', 'ground-3', 'ground-0', '1-4-5-8', 'ground-1',
         '2-5-6-9', 'ground-6', 'ground-2', '7-10-11-14', 'ground-10',
         'ground-14', '8-11-12-15', 'ground-15', '9-12-13-16', 'ground-13',
         'ground-16'
     ])
     self.assertEqual(strings_and_coins.edges,
                      [('ground-3', '0-3-4-7'), ('ground-0', '0-3-4-7'),
                       ('1-4-5-8', '2-5-6-9'), ('ground-6', '2-5-6-9'),
                       ('ground-2', '2-5-6-9'), ('0-3-4-7', '7-10-11-14'),
                       ('ground-10', '7-10-11-14'),
                       ('ground-14', '7-10-11-14'),
                       ('1-4-5-8', '8-11-12-15'),
                       ('7-10-11-14', '8-11-12-15'),
                       ('ground-15', '8-11-12-15'),
                       ('ground-13', '9-12-13-16'),
                       ('ground-16', '9-12-13-16')])
     self.assertEqual(3, strings_and_coins.get_node_degree('0-3-4-7'))
     self.assertEqual(1, strings_and_coins.get_node_degree('ground-3'))
     self.assertEqual(1, strings_and_coins.get_node_degree('ground-0'))
     self.assertEqual(2, strings_and_coins.get_node_degree('1-4-5-8'))
     self.assertEqual(0, strings_and_coins.get_node_degree('ground-1'))
     self.assertEqual(3, strings_and_coins.get_node_degree('2-5-6-9'))
     self.assertEqual(1, strings_and_coins.get_node_degree('ground-6'))
     self.assertEqual(1, strings_and_coins.get_node_degree('ground-2'))
     self.assertEqual(4, strings_and_coins.get_node_degree('7-10-11-14'))
     self.assertEqual(1, strings_and_coins.get_node_degree('ground-10'))
     self.assertEqual(1, strings_and_coins.get_node_degree('ground-14'))
     self.assertEqual(3, strings_and_coins.get_node_degree('8-11-12-15'))
     self.assertEqual(1, strings_and_coins.get_node_degree('ground-15'))
     self.assertEqual(2, strings_and_coins.get_node_degree('9-12-13-16'))
     self.assertEqual(1, strings_and_coins.get_node_degree('ground-13'))
     self.assertEqual(1, strings_and_coins.get_node_degree('ground-16'))
     self.assertEqual(strings_and_coins.to_adjacency_matrix(),
                      [[0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0],
                       [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                       [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                       [0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0],
                       [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                       [0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0],
                       [0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                       [0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                       [1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0],
                       [0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0],
                       [0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0],
                       [0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0],
                       [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0],
                       [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1],
                       [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0],
                       [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0]])
Exemple #29
0
 def test_get_all_boxes_1x1(self):
     game = dnbpy.Game((1, 1), ['player1', 'player2'])
     boxes = game.get_all_boxes()
     self.assertTrue(len(boxes) == 1)
     self.assertEqual(str(boxes[0]), '0-1-2-3')
Exemple #30
0
 def test_get_strings_and_coins_3x2_edges_selected(self):
     game = dnbpy.Game((3, 2), ['p1', 'p2'])
     game.select_edge(0, 'p1')
     game.select_edge(4, 'p2')
     game.select_edge(7, 'p1')
     game.select_edge(13, 'p2')
     game.select_edge(16, 'p1')
     """
     *---------*    1    *  
                         |  
     2         3         |  
                         |  
     *    5    *    6    *  
     |                      
     |         8         9  
     |                      
     *    10   *    11   *  
               |            
     12        |         14 
               |            
     *    15   *---------* 
     """
     strings_and_coins = dnbpy.StringsAndCoins(game)
     self.assertEqual(strings_and_coins.nodes, [
         '0-2-3-5', 'ground-2', 'ground-0', '1-3-4-6', 'ground-4',
         'ground-1', '5-7-8-10', 'ground-7', '6-8-9-11', 'ground-9',
         '10-12-13-15', 'ground-12', 'ground-15', '11-13-14-16',
         'ground-14', 'ground-16'
     ])
     self.assertEqual(strings_and_coins.edges,
                      [('ground-2', '0-2-3-5'), ('0-2-3-5', '1-3-4-6'),
                       ('ground-1', '1-3-4-6'), ('0-2-3-5', '5-7-8-10'),
                       ('1-3-4-6', '6-8-9-11'), ('5-7-8-10', '6-8-9-11'),
                       ('ground-9', '6-8-9-11'),
                       ('5-7-8-10', '10-12-13-15'),
                       ('ground-12', '10-12-13-15'),
                       ('ground-15', '10-12-13-15'),
                       ('6-8-9-11', '11-13-14-16'),
                       ('ground-14', '11-13-14-16')])
     self.assertEqual(3, strings_and_coins.get_node_degree('0-2-3-5'))
     self.assertEqual(1, strings_and_coins.get_node_degree('ground-2'))
     self.assertEqual(0, strings_and_coins.get_node_degree('ground-0'))
     self.assertEqual(3, strings_and_coins.get_node_degree('1-3-4-6'))
     self.assertEqual(0, strings_and_coins.get_node_degree('ground-4'))
     self.assertEqual(1, strings_and_coins.get_node_degree('ground-1'))
     self.assertEqual(3, strings_and_coins.get_node_degree('5-7-8-10'))
     self.assertEqual(0, strings_and_coins.get_node_degree('ground-7'))
     self.assertEqual(4, strings_and_coins.get_node_degree('6-8-9-11'))
     self.assertEqual(1, strings_and_coins.get_node_degree('ground-9'))
     self.assertEqual(3, strings_and_coins.get_node_degree('10-12-13-15'))
     self.assertEqual(1, strings_and_coins.get_node_degree('ground-12'))
     self.assertEqual(1, strings_and_coins.get_node_degree('ground-15'))
     self.assertEqual(2, strings_and_coins.get_node_degree('11-13-14-16'))
     self.assertEqual(1, strings_and_coins.get_node_degree('ground-14'))
     self.assertEqual(0, strings_and_coins.get_node_degree('ground-16'))
     self.assertEqual(strings_and_coins.to_adjacency_matrix(),
                      [[0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                       [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                       [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                       [1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0],
                       [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                       [0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                       [1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0],
                       [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                       [0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0],
                       [0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0],
                       [0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0],
                       [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0],
                       [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0],
                       [0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0],
                       [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0],
                       [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]])