class TestArena(unittest.TestCase): def setUp(self): self.arena = Arena(width=2, length=3) self.expected_space = { (1, 1): None, (2, 1): None, (1, 2): None, (2, 2): None, (1, 3): None, (2, 3): None } def test_width(self): self.assertEqual(self.arena.get_width(), 2) def test_length(self): self.assertEqual(self.arena.get_length(), 3) def test_space(self): self.assertEqual(self.arena.space, self.expected_space) def test_get_upper_left_position(self): self.assertEqual( self.arena.get_upper_left_position(), (1, 1) ) def test_get_upper_right_position(self): self.assertEqual( self.arena.get_upper_right_position(), (2, 1) ) def test_get_lower_left_position(self): self.assertEqual( self.arena.get_lower_left_position(), (1, 3) ) def test_get_lower_right_position(self): self.assertEqual( self.arena.get_lower_right_position(), (2, 3) ) def test_player_is_in_bounds_for_in_bounds_player(self): player = Player("Test", (1, 1)) self.assertTrue( self.arena.player_is_in_bounds(player) ) def test_player_is_in_bounds_for_out_of_bounds_player(self): player = Player("Test", (0, 17)) self.assertFalse( self.arena.player_is_in_bounds(player) ) def test_claim_space_for_unclaimed_space(self): player = Player("Test", (1, 1)) self.arena.claim_space_for(player, (1, 2)) self.assertEqual( self.arena.space.get((1, 2)), player ) def test_claim_space_for_out_of_bounds_space(self): player = Player("Test", (1, 1)) self.arena.claim_space_for(player, (0, 0)) self.assertIsNone( self.arena.space.get(player.position, None) ) def test_claim_space_for_claimed_space(self): player = Player("Test", (1, 1)) player2 = Player("Already Here", (1, 2)) self.arena.space[(3, 3)] = player2 self.arena.claim_space_for(player, (3, 3)) self.assertEqual( self.arena.space.get((3, 3)), player2 )
class Game: def __init__(self, player_one_name="1", player_two_name="2"): self.arena = Arena() self.player1 = Player( player_one_name, self.arena.get_upper_left_position() ) self.player2 = Player( player_two_name, self.arena.get_lower_right_position() ) self.player1.direction = DIRECTIONS.south self.player2.direction = DIRECTIONS.north self.move_count = 0 self.last_player = None self.current_player = self.player1 def is_over(self): return ( self.player1.is_dead() or self.player2.is_dead() ) def is_tie(self): return ( self.player1.is_dead() and self.player2.is_dead() ) def is_won(self): return ( not self.is_tie() and self.is_over() ) def get_winner(self): if self.is_won(): return next( player for player in [self.player1, self.player2] if player.is_alive() ) def get_owner(self, position): return self.arena.get_owner(position) def player_is_in_bounds(self, player): return self.arena.player_is_in_bounds(player) def player_is_out_of_bounds(self, player): return self.arena.player_is_out_of_bounds(player) def claim_space_for(self, player, position, force=False): self.arena.claim_space_for(player, position, force=force) def get_next_player(self): if not self.is_won(): return next( player for player in [self.player1, self.player2] if player is not self.current_player ) def get_available_directions(self): direction = self.current_player.direction return valid_directions_for(direction) def get_copy(self): return GameCopier(self).generate()