import random

from pygame.locals import *
import pygame
import time

from test.游戏.Food import Food, Snake, STEP


class SnakeGame():
    def __init__(self):
        self.width = 800
        self.height = 600
        self._running = False


    def init(self):
        pygame.init()  #初始化所有导入的pygame模块
        # 初始化一个准备显示的窗口或屏幕
        self._display_surf = pygame.display.set_mode((self.width,self.height), pygame.HWSURFACE)
        self.food = Food(5, 5, self._display_surf)
        self.snake = Snake(1, 1, self._display_surf)
        self._running = True

    def run(self):
        self.init()
        while self._running:
            pygame.event.pump()     # 内部处理pygame事件处理程序
            self.listen_keybord()   # 监听键盘上下左右键
            self.loop()
            self.render()
            time.sleep(0.05)

    def listen_keybord(self):
        keys = pygame.key.get_pressed()

        if (keys[K_RIGHT]):
            self.snake.moveRight()

        if (keys[K_LEFT]):
            self.snake.moveLeft()

        if (keys[K_UP]):
            self.snake.moveUp()

        if (keys[K_DOWN]):
            self.snake.moveDown()

        if (keys[K_ESCAPE]):
            self._running = False

    def render(self):
        self._display_surf.fill((0, 0, 0))    # 游戏界面填充为黑色
        self.food.draw()        # 画出食物
        self.snake.draw()       # 画出蛇
        pygame.display.flip()   # 刷新屏幕


    def loop(self):
        self.snake.update()
        self.eat()
        self.faild_check()

    def faild_check(self):
        # 检查是否吃到了自己
        for i in range(2,self.snake.length):
            if self.isCollision(self.snake.x[0], self.snake.y[0], self.snake.x[i], self.snake.y[i],40):
                print('吃到自己了')
                exit(0)

        if self.snake.x[0] < 0 or self.snake.x[0] > self.width \
                or self.snake.y[0] < 0 or self.snake.y[0] > self.height:
            print('出边界了')
            exit(0)

    def eat(self):
        if self.isCollision(self.food.x, self.food.y, self.snake.x[0], self.snake.y[0], 40):
            self.food.x = random.randint(2, 9)*STEP
            self.food.y = random.randint(2, 9)*STEP
            self.snake.length += 1      # 蛇的长度加1



    @staticmethod
    def isCollision(x1, y1, x2, y2, bsize):
        if x1 >= x2 and x1 <= x2 + bsize:
            if y1 >= y2 and y1 <= y2 + bsize:
                return True
        return False

if __name__ == '__main__':
    snake = SnakeGame()
    snake.run()