class App:
    '''
    Main App for game
    '''
    def __init__(self):
        self._running = True
        self._display_surf = None
        self.size = self.width, self.height = WIDTH, HEIGHT
        self.clock = None
        self.snake = Snake()
        self.fruit = Fruit()
        self.pause = False
        self.moves = 0
        self.frames = 11

    def on_init(self):
        pygame.init()
        self._display_surf = pygame.display.set_mode(
            self.size, pygame.HWSURFACE | pygame.DOUBLEBUF)
        self._running = True
        self.clock = pygame.time.Clock()

    def on_event(self, event):

        # Quit game
        if event.type == pygame.QUIT:
            self._running = False

        # Change direction of snake
        if event.type == pygame.KEYDOWN:
            if event.key == K_UP:
                # Increase speed of game
                if self.frames < 1000000000:
                    self.frames *= 10
            elif event.key == K_DOWN:
                # Decrease speed of game
                if self.frames > 10:
                    self.frames /= 10
            elif event.key == K_p:
                self.pause = not self.pause
            elif event.key == K_q:
                self.on_cleanup()

    def on_loop(self, model_num):
        self.snake.alive = self.snake.collision(self.snake.position[0])
        if self.snake.alive is False:
            return
        if self.snake.eat(self.fruit) is True:
            # Adjust fitness, reset move counter
            fitness[model_num] += 150
            score[model_num] += 1
            self.moves = 0
        self.snake.update()

        if check_if_closer(self.snake, self.fruit):
            # Reward snake for moving towards fruit
            fitness[model_num] += 10

        self.moves += 1

    def on_render(self, model_num):
        self._display_surf.fill((0, 124, 0))

        # Fill every other space to create a multi color grid
        for i in range(0, int(GRID_D)):
            for j in range(0, int(GRID_D)):
                if (i + j) % 2 == 0:
                    block = pygame.Rect(
                        ((j * BLOCK_W, i * BLOCK_H), (BLOCK_W, BLOCK_H)))
                    pygame.draw.rect(self._display_surf, (0, 200, 0), block)

        # Draw sanke and fruit
        self.fruit.draw(self._display_surf)
        self.snake.draw(self._display_surf)
        pygame.display.set_caption("Gen: " + str(generation) + " Model: " +
                                   str(model_num) + " Score: " +
                                   str(self.snake.score) + " Tick " +
                                   str(self.frames))
        pygame.display.update()

    def on_cleanup(self):
        pygame.quit()
        sys.exit()

    def on_execute(self, i):
        if self.on_init() == False:
            self._running = False

        while (self._running):
            for event in pygame.event.get():
                self.on_event(event)

            self.snake.direction = predict_direction(self.snake, self.fruit, i)

            # Checks if game is paused
            if self.pause is False:
                self.on_loop(i)
                self.on_render(i)
                self.clock.tick(self.frames)

            # Reset when snake dies
            if self.snake.alive == False or self.moves == MAX_MOVES:
                print(int(self.snake.score))
                self.snake.reset()
                self.fruit.random_generate()
                self.moves = 0

                # Print fitness
                print(fitness[i])
                break

        # Clean up and print score
        # self.on_cleanup()
        print(int(self.snake.score))
Example #2
0
    print(screen.canvheight)

    print("#"*10)
    snake.move()
    print("#" * 10)
    #detect collision with food
    if snake.head.distance(food) < 15:
        food.set_val()
        scoreboard.add_point()
        snake.add_to_tail()

    #detect collision with wall
    if abs(snake.head.xcor()) >= screen.canvwidth-20:
        scoreboard.reset()
        snake.reset()
    elif abs(snake.head.ycor()) >= screen.canvheight:
        scoreboard.reset()
        snake.reset()



    # detect collision with tail
    for snaketail in snake.snakelist[1:]:
        if snake.head.distance(snaketail) < 10:
            scoreboard.reset()
            snake.reset()


scoreboard.clear()