import pygame
import random
import sys

# 初始化pygame
pygame.init()

# 游戏参数
WIDTH, HEIGHT = 600, 600
GRID_SIZE = 20
GRID_WIDTH = WIDTH // GRID_SIZE
GRID_HEIGHT = HEIGHT // GRID_SIZE
FPS = 10

# 颜色定义
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
GREEN = (0, 255, 0)
RED = (255, 0, 0)
BLUE = (0, 120, 255)
DARK_GREEN = (0, 180, 0)

# 方向常量
UP = (0, -1)
DOWN = (0, 1)
LEFT = (-1, 0)
RIGHT = (1, 0)


class Snake:
    def __init__(self):
        self.reset()

    def reset(self):
        self.length = 3
        self.positions = [(GRID_WIDTH // 2, GRID_HEIGHT // 2)]
        self.direction = RIGHT
        self.score = 0
        self.grow_pending = 2  # 初始长度为3

    def get_head_position(self):
        return self.positions[0]

    def turn(self, new_direction):
        # 防止直接反向移动
        if (new_direction[0] * -1, new_direction[1] * -1) != self.direction:
            self.direction = new_direction

    def move(self):
        head = self.get_head_position()
        new_x = (head[0] + self.direction[0]) % GRID_WIDTH
        new_y = (head[1] + self.direction[1]) % GRID_HEIGHT
        new_position = (new_x, new_y)

        # 检查是否撞到自己
        if new_position in self.positions[1:]:
            return False

        self.positions.insert(0, new_position)

        if self.grow_pending > 0:
            self.grow_pending -= 1
        else:
            self.positions.pop()

        return True

    def grow(self):
        self.grow_pending += 1
        self.score += 10

    def draw(self, surface):
        for i, p in enumerate(self.positions):
            # 绘制蛇身
            rect = pygame.Rect(p[0] * GRID_SIZE, p[1] *
                               GRID_SIZE, GRID_SIZE, GRID_SIZE)
            if i == 0:  # 蛇头
                pygame.draw.rect(surface, DARK_GREEN, rect)
                pygame.draw.rect(surface, GREEN, rect, 1)
            else:  # 蛇身
                pygame.draw.rect(surface, GREEN, rect)
                pygame.draw.rect(surface, DARK_GREEN, rect, 1)

            # 蛇头眼睛
            if i == 0:
                eye_size = GRID_SIZE // 5
                eye_offset = GRID_SIZE // 4
                # 根据方向确定眼睛位置
                if self.direction == RIGHT:
                    left_eye = (rect.right - eye_offset, rect.top + eye_offset)
                    right_eye = (rect.right - eye_offset,
                                 rect.bottom - eye_offset)
                elif self.direction == LEFT:
                    left_eye = (rect.left + eye_offset, rect.top + eye_offset)
                    right_eye = (rect.left + eye_offset,
                                 rect.bottom - eye_offset)
                elif self.direction == UP:
                    left_eye = (rect.left + eye_offset, rect.top + eye_offset)
                    right_eye = (rect.right - eye_offset,
                                 rect.top + eye_offset)
                else:  # DOWN
                    left_eye = (rect.left + eye_offset,
                                rect.bottom - eye_offset)
                    right_eye = (rect.right - eye_offset,
                                 rect.bottom - eye_offset)

                pygame.draw.circle(surface, WHITE, left_eye, eye_size)
                pygame.draw.circle(surface, WHITE, right_eye, eye_size)
                pygame.draw.circle(surface, BLACK, left_eye, eye_size // 2)
                pygame.draw.circle(surface, BLACK, right_eye, eye_size // 2)


class Food:
    def __init__(self):
        self.position = (0, 0)
        self.randomize_position()

    def randomize_position(self):
        self.position = (random.randint(0, GRID_WIDTH - 1),
                         random.randint(0, GRID_HEIGHT - 1))

    def draw(self, surface):
        rect = pygame.Rect(self.position[0] * GRID_SIZE,
                           self.position[1] * GRID_SIZE,
                           GRID_SIZE, GRID_SIZE)
        pygame.draw.rect(surface, RED, rect)
        pygame.draw.rect(surface, (255, 150, 150), rect, 2)
        # 添加食物内部的细节
        pygame.draw.circle(surface, (255, 200, 200),
                           rect.center, GRID_SIZE // 4)


class Game:
    def __init__(self):
        self.screen = pygame.display.set_mode((WIDTH, HEIGHT))
        pygame.display.set_caption("贪吃蛇 Python版")
        self.clock = pygame.time.Clock()
        self.font = pygame.font.SysFont('simhei', 25)
        self.big_font = pygame.font.SysFont('simhei', 50)
        self.snake = Snake()
        self.food = Food()
        self.speed = FPS
        self.game_over = False
        self.paused = False

    def draw_grid(self):
        for x in range(0, WIDTH, GRID_SIZE):
            pygame.draw.line(self.screen, (40, 40, 40), (x, 0), (x, HEIGHT))
        for y in range(0, HEIGHT, GRID_SIZE):
            pygame.draw.line(self.screen, (40, 40, 40), (0, y), (WIDTH, y))

    def draw_score(self):
        score_text = self.font.render(f'得分: {self.snake.score}', True, WHITE)
        self.screen.blit(score_text, (10, 10))

        length_text = self.font.render(
            f'长度: {len(self.snake.positions)}', True, WHITE)
        self.screen.blit(length_text, (10, 40))

    def draw_game_over(self):
        overlay = pygame.Surface((WIDTH, HEIGHT))
        overlay.set_alpha(180)
        overlay.fill(BLACK)
        self.screen.blit(overlay, (0, 0))

        game_over_text = self.big_font.render('游戏结束!', True, RED)
        score_text = self.font.render(f'最终得分: {self.snake.score}', True, WHITE)
        restart_text = self.font.render('按R键重新开始，按ESC键退出', True, GREEN)

        self.screen.blit(game_over_text, (WIDTH//2 -
                         game_over_text.get_width()//2, HEIGHT//2 - 60))
        self.screen.blit(
            score_text, (WIDTH//2 - score_text.get_width()//2, HEIGHT//2))
        self.screen.blit(
            restart_text, (WIDTH//2 - restart_text.get_width()//2, HEIGHT//2 + 60))

    def draw_pause(self):
        overlay = pygame.Surface((WIDTH, HEIGHT))
        overlay.set_alpha(180)
        overlay.fill(BLACK)
        self.screen.blit(overlay, (0, 0))

        pause_text = self.big_font.render('游戏暂停', True, BLUE)
        continue_text = self.font.render('按P键继续游戏', True, WHITE)

        self.screen.blit(
            pause_text, (WIDTH//2 - pause_text.get_width()//2, HEIGHT//2 - 30))
        self.screen.blit(continue_text, (WIDTH//2 -
                         continue_text.get_width()//2, HEIGHT//2 + 30))

    def check_food_collision(self):
        if self.snake.get_head_position() == self.food.position:
            self.snake.grow()
            self.food.randomize_position()
            # 确保食物不出现在蛇身上
            while self.food.position in self.snake.positions:
                self.food.randomize_position()

            # 每得100分加快速度
            if self.snake.score % 100 == 0:
                self.speed += 1

    def run(self):
        while True:
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    pygame.quit()
                    sys.exit()

                if event.type == pygame.KEYDOWN:
                    if self.game_over:
                        if event.key == pygame.K_r:
                            self.snake.reset()
                            self.food.randomize_position()
                            self.game_over = False
                            self.speed = FPS
                        elif event.key == pygame.K_ESCAPE:
                            pygame.quit()
                            sys.exit()

                    elif self.paused:
                        if event.key == pygame.K_p:
                            self.paused = False

                    else:
                        if event.key == pygame.K_UP:
                            self.snake.turn(UP)
                        elif event.key == pygame.K_DOWN:
                            self.snake.turn(DOWN)
                        elif event.key == pygame.K_LEFT:
                            self.snake.turn(LEFT)
                        elif event.key == pygame.K_RIGHT:
                            self.snake.turn(RIGHT)
                        elif event.key == pygame.K_p:
                            self.paused = True
                        elif event.key == pygame.K_ESCAPE:
                            pygame.quit()
                            sys.exit()

            if not self.game_over and not self.paused:
                if not self.snake.move():
                    self.game_over = True

                self.check_food_collision()

            # 绘制
            self.screen.fill(BLACK)
            self.draw_grid()
            self.snake.draw(self.screen)
            self.food.draw(self.screen)
            self.draw_score()

            if self.game_over:
                self.draw_game_over()
            elif self.paused:
                self.draw_pause()

            pygame.display.flip()
            self.clock.tick(self.speed)


if __name__ == "__main__":
    print("贪吃蛇游戏开始！")
    print("控制键：↑↓←→ 方向键控制移动")
    print("P键：暂停/继续  ESC键：退出游戏")
    print("游戏结束后按R键重新开始")
    print("-" * 30)

    game = Game()
    game.run()
