Example #1
0
class SnakeGame():
    def __init__(self):
        self.score = 0
        self.snake = Snake(SCREEN_SIZE[0] // 2, SCREEN_SIZE[1] // 2)
        self.apple = Apple()
        self.apple.placeApple(self.snake.getBody(), SCREEN_SIZE[0],
                              SCREEN_SIZE[1])
        self.scorePosX = SCREEN_SIZE[0] // 2 - 10
        self.eatingSound = pygame.mixer.Sound('Eating.ogg')

    def reset(self):
        self.score = 0
        self.snake = Snake(SCREEN_SIZE[0] // 2, SCREEN_SIZE[1] // 2)
        self.apple.placeApple(self.snake.getBody(), SCREEN_SIZE[0],
                              SCREEN_SIZE[1])

    def isSnakeCollision(self):
        body = self.snake.getBody()
        head = body[0]
        # check left and righside screen
        if ((head[0] < 0 or head[0] >
             (SCREEN_SIZE[0] - self.snake.getSize()))):
            return True
        # check top and bottom of screen
        if ((head[1] < 0 or head[1] >
             (SCREEN_SIZE[1] - self.snake.getSize()))):
            return True
        # check if snake hit self
        if (len(body) > 3):
            for i in range(3, len(body)):
                if isSquareHit(head, body[i], self.snake.getSize()):
                    return True
        return False

    def isAppleCollision(self):
        head = self.snake.getBody()[0]
        return isSquareHit((self.apple.getX(), self.apple.getY()), head,
                           self.snake.getSize())

    def drawScore(self, surface):
        scoreFont = pygame.font.Font(None, 40)
        scoreSurface = scoreFont.render(str(self.score), True, (255, 255, 255))
        surface.blit(scoreSurface, (self.scorePosX, 0))

    def drawSplashScreen(self, surface, text, color):
        """ Surface, String --> void
        Draws text centered at the center of the given Surface.
        """
        splashFont = pygame.font.Font(None, 100)
        splashSurface = splashFont.render(text, True, color)
        textXPos = (SCREEN_SIZE[0] // 2) - (splashFont.size(text)[0] // 2)
        textYpos = (SCREEN_SIZE[1] // 2) - (splashFont.size(text)[1] // 2)
        surface.blit(splashSurface, (textXPos, textYpos))

    def handleQuit(self, event):
        if event.type == KEYDOWN:
            if event.key == K_ESCAPE:
                pygame.quit()
                exit()
        elif event.type == QUIT:
            pygame.quit()
            exit()

    def play(self):
        self.drawSplashScreen(SCREEN, "SNAKE", (255, 255, 255))
        pygame.display.flip()
        while True:  # starting splashcreen
            event = pygame.event.wait()
            self.handleQuit(event)
            if event.type == KEYDOWN:
                break

        while True:  # main loop for running the game
            pygame.event.pump()
            SCREEN.blit(BG, (0, 0))  # Makes clean background
            self.apple.drawApple(SCREEN, self.snake.getSize())
            self.snake.drawSnake(SCREEN)
            self.drawScore(SCREEN)
            pygame.display.flip()

            # Handle Key events
            didChangeDir = False
            for event in pygame.event.get():
                self.handleQuit(event)
                if event.type == KEYDOWN and not didChangeDir:
                    didChangeDir = self.snake.changeDir(event)

            # Move the snake
            self.snake.moveSnake()

            # Handle Collisions
            if self.isSnakeCollision():
                self.snake.drawSnake(
                    SCREEN)  # update the snake's position to when it crashed
                self.drawSplashScreen(SCREEN, "GAME OVER", (169, 169, 169))
                pygame.display.flip()
                while True:  # game over screen
                    event = pygame.event.wait()
                    self.handleQuit(event)
                    if event.type == KEYDOWN:
                        self.reset()
                        break
            if self.isAppleCollision():
                self.eatingSound.play()
                self.apple.placeApple(self.snake.getBody(), SCREEN_SIZE[0],
                                      SCREEN_SIZE[1])
                self.snake.addSegment()
                self.score += 1

            # Game Speed
            pygame.time.delay(80)