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)
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)
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)
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)
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
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)
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
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)
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)