class TestBoard(unittest.TestCase): def setUp(self) -> None: self.board = Board(width=25, height=25) def test_add_snake_random(self): self.board.add_object('snake') self.assertEqual(1, len(self.board.objects['snake']), "Single snake not added correctly") def test_add_snake_specific(self): self.board.snakes = [] self.board.add_object("snake", Point(x=10, y=15)) snake = self.board.objects['snake'].pop() self.assertEqual(10, snake.get_head().x, "x position not set correctly") self.assertEqual(15, snake.get_head().y, "y position not set correctly") self.assertEqual(constants.LEN_SNAKE_START, len(snake), "Snake is not start length") def test_add_snake_collision(self): self.board.snakes = [] self.board.add_object("snake", Point(x=20, y=20)) self.board.add_object("snake", Point(x=20, y=20)) snake_1 = self.board.objects['snake'].pop() snake_2 = self.board.objects['snake'].pop() self.assertEqual(False, snake_1 in snake_2, "These are the same snakes") def test_setting_seed(self): """ Test if the same board is produced after setting a seed. """ seed = self.board.seed() for _ in range(10): self.board.reset() state = self.board.board self.board.seed(seed) for _ in range(10): self.board.reset() self.assertEqual([o.__class__.__name__ for x in state for o in x], [o.__class__.__name__ for x in self.board.board for o in x], "Unable to reproduce same board")
class SnakeGame: """ Remapping of all board functions to the public available environment functions. """ def __init__(self, width=None, height=None): self.board = Board(width, height) self.image = np.zeros((self.board.width, self.board.height, 3), dtype=np.uint8) def obs(self, attribute="rgb"): return self.board.obs(attribute) def reward(self): return self.board.reward() def done(self): return self.board.done() def info(self): return self.board.info() def step(self, action: int): self.board.step(action, values=False) return self.obs(), self.reward(), self.done(), self.info() def reset(self): """ Reset the game, and should return the start observation of the game. """ self.board.reset() return self.obs() def render(self): return self.board.obs(attribute='rgb') def close(self): self.board.close() def seed(self, seed=None): return self.board.seed(seed)