class App: def __init__(self, headless, bot): self.bot = bot self.headless = headless self._running = True self._close = False self._display_surf = None self.size = self.weight, self.height = 800, 800 if not self.headless: self.fps = 15 self.playtime = 0.0 self.clock = pygame.time.Clock() pygame.mixer.init() pygame.init() def on_init(self): self._running = True cols = 50 rows = 50 mapSizeX = 700 mapSizeY = 700 imageSize = (int(mapSizeX / cols), int(mapSizeY / rows)) self.map = Map(50, 50, mapSizeX, mapSizeY, cols, rows, self.headless) self.snake = Snake(cols / 2, rows / 2, imageSize, self.headless) self.apple = Apple(cols, rows, imageSize, self.headless) if self.bot: self.bot.AddGoal(self.apple) self.bot.AddBody(self.snake) self.bot.AddMap(self.map) if not self.headless: pygame.display.set_caption("Snake") self._display_surf = pygame.display.set_mode( self.size, pygame.DOUBLEBUF) self.font = pygame.font.SysFont('mono', 14, bold=True) self.fontEndscore = pygame.font.SysFont('mono', 32, bold=True) def on_event(self, event): if event.type == pygame.QUIT: self._close = True elif event.type == pygame.KEYDOWN: if event.key == pygame.K_RIGHT: if not self.bot: self.snake.SetDirection(Direction.RIGHT) elif event.key == pygame.K_LEFT: if not self.bot: self.snake.SetDirection(Direction.LEFT) elif event.key == pygame.K_DOWN: if not self.bot: self.snake.SetDirection(Direction.DOWN) elif event.key == pygame.K_UP: if not self.bot: self.snake.SetDirection(Direction.UP) elif event.key == pygame.K_ESCAPE: self._close = True elif event.key == pygame.K_r: self.on_init() def on_render(self): if not self.headless: self._display_surf.fill((90, 90, 90)) #Map self.map.Draw(self._display_surf) #Scoreboard self.draw_text("SCORE: {}".format(len(self.snake.Position())), (0, 0)) self.draw_text("Press R to restart", (0, 13)) self.draw_text("Press ESC to exit", (0, 26)) #Snake self.snake.Draw(self._display_surf, self.map) #Apple self.apple.Draw(self._display_surf, self.map) pygame.display.update() def on_cleanup(self): if not self.headless: pygame.quit() def on_execute(self): if self.on_init() == False: self._running = False while (not self._close): if not self.headless: for event in pygame.event.get(): self.on_event(event) if self.bot: self.snake.SetDirection(self.bot.Move()) if self._running: self.snake.Move() self.snake.Eat(self.apple) if self.map.IsCollision((self.snake.x, self.snake.y), self.snake): self._running = False else: self.on_render() elif not self.headless: self.fontEndscore.size("Game over! Score: {}".format( len(self.snake.Position()))) text = self.fontEndscore.render( "Game over! Score: {}".format(len(self.snake.Position())), True, (0, 0, 0)) text_rect = text.get_rect(center=(self.weight / 2, self.height / 2)) self._display_surf.blit(text, text_rect) else: print("Game over! Score: {}".format(len( self.snake.Position()))) self._close = True if not self.headless: self.playtime += self.clock.tick(self.fps) / 1000.0 pygame.display.flip() self.on_cleanup() def draw_text(self, text, position): self.font.size(text) surface = self.font.render(text, True, (255, 255, 255)) self._display_surf.blit(surface, position)
def Show(self): screen = self.display field = PlayField() group = Snake() group.ConstructSnake() feed = Food() block = feed.GetNewBlock(group.sprites()) groupFood = pygame.sprite.Group() groupFood.add(block) print(block.rect.center) UPDATE = pygame.USEREVENT + 1 pygame.time.set_timer(UPDATE,70) textsurface = Font.MonoSpace(15).render(str(self.highscore),False,Color.Black) ps4 = PS4Controller() ps4.init() print(ps4.joystick_present) if ps4.joystick_present: if not ps4.hat_data: ps4.hat_data = {} for i in range(ps4.controller.get_numhats()): ps4.hat_data[i] = (0, 0) while not self.decision: self.CheckEvents() for event in pygame.event.get(): if ps4.joystick_present: if event.type == pygame.JOYHATMOTION: ps4.hat_data[event.hat] = event.value hatValues = ps4.hat_data[0] if hatValues[0] == -1: self.key = pygame.K_LEFT elif hatValues[0] == 1: self.key = pygame.K_RIGHT elif hatValues[1] == -1: self.key = pygame.K_DOWN elif hatValues[1] == 1: self.key = pygame.K_UP if event.type==pygame.KEYDOWN: self.key = event.key if event.type==UPDATE: group.UpdateDirection(self.key) game_over = not(pygame.sprite.collide_rect(field,group.sprites()[0])) or group.DetectCollisionWithItself() if game_over: self.decision = True self.Quit(False) else: screen.fill(Color.White) screen.blit(textsurface,(620,20)) group.Move() group.draw(screen) pygame.display.update() groupFood.draw(screen) if pygame.sprite.collide_rect(group.sprites()[0],groupFood.sprites()[0]): group.EatFood(groupFood.sprites()[0]) block = feed.GetNewBlock(group.sprites()) groupFood.empty() groupFood.add(block) self.highscore+=1 textsurface = Font.MonoSpace(15).render(str(self.highscore),False,Color.Black)