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