Ejemplo n.º 1
0
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)
Ejemplo n.º 2
0
    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)