Example #1
0
    def test_place_tile(self):
        empty_board = Board()
        hand_tile = HandTile([('s1', 's2'), ('e2', 'e1'), ('n2', 'n1'),
                              ('w1', 'w2')])
        hand_tile_2 = HandTile([('s1', 'e1'), ('s2', 'n2'), ('e2', 'w2'),
                                ('n1', 'w1')])

        self.assertAlmostEqual(len(empty_board.tiles), 0)

        board_tile = empty_board.place_tile(hand_tile, "a1")

        self.assertAlmostEqual(len(empty_board.tiles), 1)
        self.assertAlmostEqual(empty_board.tiles["a1"], board_tile)
        self.assertAlmostEqual(board_tile.neighbors["north"], EDGE)
        self.assertAlmostEqual(board_tile.neighbors["east"], None)
        self.assertAlmostEqual(board_tile.neighbors["south"], None)
        self.assertAlmostEqual(board_tile.neighbors["west"], EDGE)

        new_board_tile = empty_board.place_tile(hand_tile_2, "a2")

        self.assertAlmostEqual(len(empty_board.tiles), 2)
        self.assertAlmostEqual(empty_board.tiles["a2"], new_board_tile)
        self.assertAlmostEqual(new_board_tile.neighbors["north"], board_tile)
        self.assertAlmostEqual(new_board_tile.neighbors["east"], None)
        self.assertAlmostEqual(new_board_tile.neighbors["south"], None)
        self.assertAlmostEqual(new_board_tile.neighbors["west"], EDGE)

        self.assertAlmostEqual(board_tile.neighbors["north"], EDGE)
        self.assertAlmostEqual(board_tile.neighbors["east"], None)
        self.assertAlmostEqual(board_tile.neighbors["south"], new_board_tile)
        self.assertAlmostEqual(board_tile.neighbors["west"], EDGE)
Example #2
0
    def test_end_of_path(self):
        board = Board()
        hand_tile = HandTile([('s1', 'e2'), ('s2', 'w1'), ('e1', 'n2'),
                              ('n1', 'w2')])
        hand_tile_2 = HandTile([('n1', 'n2'), ('e1', 'w1'), ('e2', 'w2'),
                                ('s2', 's1')])

        board.place_tile(hand_tile, "a1")

        self.assertAlmostEqual(board.end_of_path("a1", "n2")["tile"], "a1")
        self.assertAlmostEqual(board.end_of_path("a1", "n2")["port"], "e1")

        board.place_tile(hand_tile_2, "b1")

        self.assertAlmostEqual(board.end_of_path("a1", "n2")["tile"], "b1")
        self.assertAlmostEqual(board.end_of_path("a1", "n2")["port"], "e1")

        board.place_tile(hand_tile_2, "c1")

        self.assertAlmostEqual(board.end_of_path("a1", "n2")["tile"], "c1")
        self.assertAlmostEqual(board.end_of_path("a1", "n2")["port"], "e1")

        self.assertAlmostEqual(board.end_of_path("a1", "s1")["tile"], "c1")
        self.assertAlmostEqual(board.end_of_path("a1", "s1")["port"], "e2")

        board.place_tile(hand_tile, "d1")

        self.assertAlmostEqual(board.end_of_path("a1", "n2")["tile"], "d1")
        self.assertAlmostEqual(board.end_of_path("a1", "n2")["port"], "s2")

        self.assertAlmostEqual(board.end_of_path("a1", "s1")["tile"], EDGE)
        self.assertAlmostEqual(board.end_of_path("a1", "s1")["port"], EDGE)
Example #3
0
    def test_take_turn(self):
        empty_board = Board()
        player = Avatar("white")
        hand_tile = HandTile([('s1', 'e2'), ('s2', 'w1'), ('e1', 'n2'),
                              ('n1', 'w2')])
        hand_tile_2 = HandTile([('n1', 'n2'), ('e1', 'w1'), ('e2', 'w2'),
                                ('s2', 's1')])

        self.assertAlmostEqual(player.current_tile, None)
        self.assertAlmostEqual(player.current_port, None)
        self.assertAlmostEqual(len(empty_board.tiles), 0)

        empty_board.first_turn(player, hand_tile, "a1", "n2")

        self.assertAlmostEqual(player.current_tile, "a1")
        self.assertAlmostEqual(player.current_port, "e1")
        self.assertAlmostEqual(len(empty_board.tiles), 1)

        try:
            empty_board.take_turn(hand_tile, "a2", player)
        except:
            print("Player has broken the rules")

        empty_board.take_turn(hand_tile_2, "b1", player)

        self.assertAlmostEqual(player.current_tile, "b1")
        self.assertAlmostEqual(player.current_port, "e1")
        self.assertAlmostEqual(len(empty_board.tiles), 2)
    def test_check_turn(self):
        rc = RuleChecker()
        empty_board = Board()
        player = Avatar("white")
        tile = HandTile([('s1', 'e2'), ('s2', 'w1'), ('e1', 'n2'),
                         ('n1', 'w2')])
        tile_2 = HandTile([('n1', 's2'), ('n2', 'e2'), ('e1', 'w2'),
                           ('s1', 'w1')])
        suicide_tile = HandTile([('n1', 'w1'), ('n2', 'e1'), ('s2', 'e2'),
                                 ('s1', 'w2')])

        empty_board.first_turn(player, tile, "a1", "n2")
        self.assertAlmostEqual(player.current_port, "e1")
        self.assertAlmostEqual(player.current_tile, "a1")

        player.tiles = [tile_2, suicide_tile]

        # Tile has to be at the correct coordinate
        self.assertAlmostEqual(
            rc.check_turn(empty_board, tile_2, "a1", player)["legal"], False)
        self.assertAlmostEqual(
            rc.check_turn(empty_board, tile_2, "a2", player)["legal"], False)
        self.assertAlmostEqual(
            rc.check_turn(empty_board, tile_2, "b1", player)["legal"], True)

        # Tile cannot cause a suicide if there are other options
        self.assertAlmostEqual(
            rc.check_turn(empty_board, suicide_tile, "b1", player)["legal"],
            False)

        player.tiles = [suicide_tile]

        self.assertAlmostEqual(
            rc.check_turn(empty_board, suicide_tile, "b1", player)["legal"],
            True)
    def test_end_of_path(self):
        paths = [('s1', 'e2'), ('s2', 'w1'), ('e1', 'n2'), ('n1', 'w2')]
        tile = Tile(paths)

        self.assertAlmostEqual(tile.end_of_path('s1'), 'e2')
        self.assertAlmostEqual(tile.end_of_path('e2'), 's1')

        hand_tile = HandTile(paths)
        self.assertAlmostEqual(hand_tile.end_of_path('e1'), 'n2')
        self.assertAlmostEqual(hand_tile.end_of_path('n2'), 'e1')
    def test_check_player_dead(self):
        rule_checker = RuleChecker()
        board = Board()
        player = Avatar('green')
        tile_1 = HandTile([('n1', 's2'), ('n2', 'e2'), ('e1', 'w2'),
                           ('s1', 'w1')])
        tile_2 = HandTile([('n1', 'e2'), ('n2', 'w2'), ('e1', 's1'),
                           ('s2', 'w1')])

        board.first_turn(player, tile_1, 'a1', 'n1')
        self.assertAlmostEqual(player.current_port, 's2')
        self.assertAlmostEqual(player.current_tile, 'a1')

        self.assertAlmostEqual(
            rule_checker.check_player_dead(board, tile_2, "a2", player), True)
        self.assertAlmostEqual(
            rule_checker.check_player_dead(board, tile_1, "a2", player), False)
Example #7
0
    def test_convert_to_board_tile(self):
        empty_board = Board()
        hand_tile = HandTile([('s1', 's2'), ('e2', 'e1'), ('n2', 'n1'),
                              ('w1', 'w2')])
        board_tile = empty_board.convert_to_board_tile(hand_tile, "a1")

        self.assertAlmostEqual(board_tile.neighbors["north"], EDGE)
        self.assertAlmostEqual(board_tile.neighbors["east"], None)
        self.assertAlmostEqual(board_tile.neighbors["south"], None)
        self.assertAlmostEqual(board_tile.neighbors["west"], EDGE)
Example #8
0
    def test_is_coordinate_occupied(self):
        board = Board()
        hand_tile = HandTile([('s1', 's2'), ('e2', 'e1'), ('n2', 'n1'),
                              ('w1', 'w2')])

        self.assertAlmostEqual(board.is_coordinate_occupied("f4"), False)

        board.place_tile(hand_tile, "f4")

        self.assertAlmostEqual(board.is_coordinate_occupied("f4"), True)
    def is_player_death_avoidable(self, board, player):
        all_tile_options = []
        for tile in player.tiles:
            rotations_left = 4
            while rotations_left > 0:
                rotations_left = rotations_left - 1
                temp_tile = HandTile(tile.paths)
                temp_tile.rotate(rotations_left)
                all_tile_options.append(temp_tile)

        for tile in all_tile_options:
            board_coordinate = get_connecting_coordinate(
                player.current_tile, player.current_port)
            would_player_die = self.check_player_dead(board, tile,
                                                      board_coordinate, player)
            if not would_player_die:
                return True

        return False
Example #10
0
    def test_first_turn(self):
        empty_board = Board()
        player = Avatar("white")
        hand_tile = HandTile([('s1', 'e2'), ('s2', 'w1'), ('e1', 'n2'),
                              ('n1', 'w2')])

        self.assertAlmostEqual(player.current_tile, None)
        self.assertAlmostEqual(player.current_port, None)
        self.assertAlmostEqual(len(empty_board.tiles), 0)

        try:
            empty_board.first_turn(player, hand_tile, "a1", "n1")
        except:
            print("Tile choice is suicide")

        empty_board.first_turn(player, hand_tile, "a1", "n2")

        self.assertAlmostEqual(player.current_tile, "a1")
        self.assertAlmostEqual(player.current_port, "e1")
        self.assertAlmostEqual(len(empty_board.tiles), 1)
        self.assertAlmostEqual("a1" in empty_board.tiles, True)
        self.assertAlmostEqual(empty_board.tiles["a1"].paths, hand_tile.paths)
Example #11
0
def create_tiles():
    list_of_tiles = [HandTile([('n1', 's2'), ('n2', 's1'), ('e1', 'w1'), ('e2', 'w2')]),
                     HandTile([('n1', 's2'), ('n2', 's1'), ('e1', 'w2'), ('e2', 'w1')]),
                     HandTile([('n1', 's1'), ('n2', 's2'), ('e1', 'w1'), ('e2', 'w2')]),
                     HandTile([('n1', 's2'), ('n2', 'e2'), ('e1', 'w2'), ('s1', 'w1')]),
                     HandTile([('n1', 'w1'), ('n2', 'e1'), ('e2', 's2'), ('s1', 'w2')]),
                     HandTile([('n1', 's2'), ('n2', 'e1'), ('e2', 'w1'), ('s1', 'w2')]),
                     HandTile([('n1', 's2'), ('n2', 'e1'), ('e2', 'w2'), ('s1', 'w1')]),
                     HandTile([('n1', 'e2'), ('n2', 'w2'), ('e1', 's1'), ('s2', 'w1')]),
                     HandTile([('n1', 'e2'), ('n2', 's1'), ('e1', 'w2'), ('s2', 'w1')]),
                     HandTile([('n1', 'e2'), ('n2', 's2'), ('e1', 'w1'), ('s1', 'w2')]),
                     HandTile([('n1', 'e2'), ('n2', 's2'), ('e1', 'w2'), ('s1', 'w1')]),
                     HandTile([('n1', 'e2'), ('n2', 'e1'), ('s2', 'w1'), ('s1', 'w2')]),
                     HandTile([('n1', 'e1'), ('n2', 'w1'), ('e2', 's1'), ('s2', 'w2')]),
                     HandTile([('n1', 'e1'), ('n2', 'w1'), ('e2', 's2'), ('s1', 'w2')]),
                     HandTile([('n1', 'e1'), ('n2', 'w2'), ('e2', 's1'), ('s2', 'w1')]),
                     HandTile([('n1', 'e1'), ('n2', 'w2'), ('e2', 's2'), ('s1', 'w1')]),
                     HandTile([('n1', 'e1'), ('n2', 's1'), ('e2', 'w1'), ('s2', 'w2')]),
                     HandTile([('n1', 'e1'), ('n2', 's1'), ('e2', 'w2'), ('s2', 'w1')]),
                     HandTile([('n1', 'e1'), ('n2', 's2'), ('e2', 'w1'), ('s1', 'w2')]),
                     HandTile([('n1', 'e1'), ('n2', 's2'), ('e2', 'w2'), ('s1', 'w1')]),
                     HandTile([('n1', 'e1'), ('n2', 'e2'), ('s2', 'w1'), ('s1', 'w2')]),
                     HandTile([('n1', 'e1'), ('n2', 'e2'), ('s2', 'w2'), ('s1', 'w1')]),
                     HandTile([('n1', 'n2'), ('e1', 'w1'), ('e2', 'w2'), ('s2', 's1')]),
                     HandTile([('n1', 'n2'), ('e1', 'w1'), ('e2', 's1'), ('s2', 'w2')]),
                     HandTile([('n1', 'n2'), ('e1', 'w1'), ('e2', 's2'), ('s1', 'w2')]),
                     HandTile([('n1', 'n2'), ('e1', 'w2'), ('e2', 'w1'), ('s2', 's1')]),
                     HandTile([('n1', 'n2'), ('e1', 'w2'), ('e2', 's1'), ('s2', 'w1')]),
                     HandTile([('n1', 'n2'), ('e1', 'w2'), ('e2', 's2'), ('s1', 'w1')]),
                     HandTile([('n1', 'n2'), ('e1', 's1'), ('e2', 'w1'), ('s2', 'w2')]),
                     HandTile([('n1', 'n2'), ('e1', 's1'), ('e2', 'w2'), ('s2', 'w1')]),
                     HandTile([('n1', 'n2'), ('e1', 's2'), ('e2', 'w1'), ('s1', 'w2')]),
                     HandTile([('n1', 'n2'), ('e1', 's2'), ('e2', 'w2'), ('s1', 'w1')]),
                     HandTile([('n1', 'n2'), ('e1', 'e2'), ('s2', 'w1'), ('s1', 'w2')]),
                     HandTile([('n1', 'n2'), ('e1', 'e2'), ('s2', 'w2'), ('s1', 'w1')]),
                     HandTile([('n1', 'n2'), ('e1', 'e2'), ('s2', 's1'), ('w2', 'w1')])]

    return list_of_tiles
Example #12
0
    def test__rotate(self):
        paths = [('s1', 'e2'), ('s2', 'w1'), ('e1', 'n2'), ('n1', 'w2')]
        hand_tile = HandTile(paths)
        hand_tile_rotated_clockwise = HandTile([('w1', 's1'), ('w2', 'n2'),
                                                ('s2', 'e2'), ('e1', 'n1')])
        hand_tile_rotated_counter = HandTile([('e2', 'n2'), ('e1', 's1'),
                                              ('n1', 'w1'), ('w2', 's2')])
        hand_tile_rotated_180 = HandTile([('n2', 'w1'), ('n1', 'e2'),
                                          ('w2', 's1'), ('s2', 'e1')])

        self.assertAlmostEqual(hand_tile.paths, paths)

        hand_tile.rotate(1)

        self.assertAlmostEqual(hand_tile.paths,
                               hand_tile_rotated_counter.paths)

        hand_tile.rotate(1)

        self.assertAlmostEqual(hand_tile.paths, hand_tile_rotated_180.paths)

        hand_tile.rotate(1)

        self.assertAlmostEqual(hand_tile.paths,
                               hand_tile_rotated_clockwise.paths)

        hand_tile.rotate(1)

        self.assertAlmostEqual(hand_tile.paths, paths)
Example #13
0
 def get_tile(self, tile_index):
     deck_tile = self.deck[tile_index]
     player_tile = HandTile(list(deck_tile.paths))
     return player_tile
    def test_check_first_turn(self):
        rc = RuleChecker()
        empty_board = Board()
        player = Avatar("white")
        suicide_tile = HandTile([('s1', 's2'), ('e2', 'e1'), ('n2', 'n1'),
                                 ('w1', 'w2')])
        tile = HandTile([('n1', 's2'), ('n2', 'e2'), ('e1', 'w2'),
                         ('s1', 'w1')])

        # Not on edge
        not_the_edge = rc.check_first_turn(empty_board, suicide_tile, "c7",
                                           "w2")
        self.assertAlmostEqual(not_the_edge["legal"], False)
        self.assertAlmostEqual(not_the_edge["rules broken"], [
            "tile placement is not on the board's edge",
            "starting port is invalid"
        ])

        # No suicides
        suicide_move = rc.check_first_turn(empty_board, suicide_tile, "a1",
                                           "n1")
        self.assertAlmostEqual(suicide_move["legal"], False)
        self.assertAlmostEqual(suicide_move["rules broken"],
                               ["tile placement is avoidable suicide"])
        self.assertAlmostEqual(
            rc.check_first_turn(empty_board, suicide_tile, "a1",
                                "n2")["legal"], False)
        self.assertAlmostEqual(
            rc.check_first_turn(empty_board, suicide_tile, "a1",
                                "w1")["legal"], False)
        self.assertAlmostEqual(
            rc.check_first_turn(empty_board, suicide_tile, "a1",
                                "w2")["legal"], False)

        # No iterior ports allowed
        interior_port_move = rc.check_first_turn(empty_board, suicide_tile,
                                                 "a1", "e2")
        self.assertAlmostEqual(interior_port_move["legal"], False)
        self.assertAlmostEqual(interior_port_move["rules broken"],
                               ["starting port is invalid"])
        self.assertAlmostEqual(
            rc.check_first_turn(empty_board, tile, "a1", "n2")["legal"], True)
        self.assertAlmostEqual(
            rc.check_first_turn(empty_board, tile, "a1", "s2")["legal"], False)
        self.assertAlmostEqual(
            rc.check_first_turn(empty_board, tile, "a1", "w2")["legal"], True)

        self.assertAlmostEqual(
            rc.check_first_turn(empty_board, tile, "a2", "e1")["legal"], False)
        self.assertAlmostEqual(
            rc.check_first_turn(empty_board, tile, "a2", "n1")["legal"], False)
        self.assertAlmostEqual(
            rc.check_first_turn(empty_board, tile, "a2", "s1")["legal"], False)
        self.assertAlmostEqual(
            rc.check_first_turn(empty_board, tile, "a2", "w1")["legal"], True)

        self.assertAlmostEqual(
            rc.check_first_turn(empty_board, tile, "b1", "e2")["legal"], False)
        self.assertAlmostEqual(
            rc.check_first_turn(empty_board, tile, "b1", "n2")["legal"], True)
        self.assertAlmostEqual(
            rc.check_first_turn(empty_board, tile, "b1", "s2")["legal"], False)
        self.assertAlmostEqual(
            rc.check_first_turn(empty_board, tile, "b1", "w2")["legal"], False)

        self.assertAlmostEqual(
            rc.check_first_turn(empty_board, tile, "j10", "e2")["legal"], True)
        self.assertAlmostEqual(
            rc.check_first_turn(empty_board, tile, "j10", "n2")["legal"],
            False)
        self.assertAlmostEqual(
            rc.check_first_turn(empty_board, tile, "j10", "s2")["legal"], True)
        self.assertAlmostEqual(
            rc.check_first_turn(empty_board, tile, "j10", "w2")["legal"],
            False)

        empty_board.first_turn(player, tile, "a1", "n1")

        # No neighbors
        placed_on_occupied_spot = rc.check_first_turn(empty_board, tile, "a1",
                                                      "s2")
        self.assertAlmostEqual(placed_on_occupied_spot["legal"], False)
        self.assertAlmostEqual(placed_on_occupied_spot["rules broken"], [
            'coordinate is already occupied', 'starting port is invalid',
            'tile placement is avoidable suicide'
        ])

        placed_tile_with_neighbors = rc.check_first_turn(
            empty_board, tile, "a1", "s1")
        self.assertAlmostEqual(placed_tile_with_neighbors["legal"], False)
        self.assertAlmostEqual(placed_tile_with_neighbors["rules broken"], [
            'coordinate is already occupied', 'starting port is invalid',
            'tile placement is avoidable suicide'
        ])

        self.assertAlmostEqual(
            rc.check_first_turn(empty_board, tile, "b1", "e2")["legal"], False)