class TestCollision(unittest.TestCase):

    def setUp(self) -> None:
        self.objects_name = ["wall", "ground", "apple", "snake"]

        self.wall = Wall(Point(0, 0))
        self.ground = Ground(Point(10, 10))
        self.apple = Apple(Point(20, 20))
        self.snake = Snake(Point(30, 30))

        self.wall_same = Wall(Point(0, 0))
        self.ground_same = Ground(Point(0, 0))
        self.apple_same = Apple(Point(0, 0))
        self.snake_same = Snake(Point(0, 0))

        self.objects_diff = [getattr(self, name) for name in self.objects_name]
        self.objects_same = [getattr(self, name + "_same") for name in self.objects_name]

    def test_collisions(self):
        for each in self.objects_name:
            test_objects_diff = [item.clone() for item in self.objects_diff]
            test_objects_diff.pop(self.objects_name.index(each))
            result = [getattr(self, each).collide(item) for item in test_objects_diff]
            self.assertEqual([False, False, False], result, "Incorrect collision detected")

            test_objects_same = [item.clone() for item in self.objects_same]
            test_objects_same.pop(self.objects_name.index(each))
            result = [getattr(self, each + "_same").collide(item) for item in test_objects_same]
            self.assertEqual([True, True, True], result, "Incorrect collision detected")

    def test_snake_eat_apple(self):
        self.board = Board(width=50, height=50)
        self.board.add_object("snake", Point(x=20, y=33))
        self.board.add_object("apple", Point(x=20, y=32))

        snake = self.board.objects['snake'][0]
        _, reward, _, _ = self.board.step(constants.GET_ACTION_MEANING.index("UP"))

        self.assertEqual(constants.DEFAULT_REWARD_PER_APPLE + constants.DEFAULT_REWARD_PER_STEP, reward,
                         "Snake eating apple incorrect points awarded")

        self.assertEqual(LEN_SNAKE_START+1, len(snake),
                         "Snake length is not increased after eating apple")

    def test_snake_wall(self):
        self.board = Board(width=50, height=50)
        self.board.add_object("snake", Point(x=1, y=30))

        snake = self.board.objects['snake'][0]
        _, _, done, _ = self.board.step(constants.GET_ACTION_MEANING.index("LEFT"))
        self.board.step(1)

        self.assertEqual(True, done, "Game over is not detected upon dying")
        self.assertEqual(False, snake.alive,
                         "Snake didn't die upon hitting the wall")
Пример #2
0
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)