import pygame
import random
import sys

# 初始化Pygame
pygame.init()

# 游戏基础设置
WIDTH, HEIGHT = 480, 700
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("顶级飞行躲避")
clock = pygame.time.Clock()
FPS = 60

# 颜色定义
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (255, 50, 50)
BLUE = (50, 150, 255)
YELLOW = (255, 255, 0)
GRAY = (100, 100, 100)

# 玩家飞机类


class Player(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        # 自制飞机图形
        self.image = pygame.Surface((40, 60), pygame.SRCALPHA)
        pygame.draw.polygon(self.image, BLUE, [(20, 0), (0, 60), (40, 60)])
        pygame.draw.circle(self.image, YELLOW, (20, 30), 8)
        self.rect = self.image.get_rect()
        self.rect.centerx = WIDTH // 2
        self.rect.bottom = HEIGHT - 50
        self.speed = 8

    def update(self):
        # 鼠标控制
        keys = pygame.key.get_pressed()
        if keys[pygame.K_LEFT] and self.rect.left > 0:
            self.rect.x -= self.speed
        if keys[pygame.K_RIGHT] and self.rect.right < WIDTH:
            self.rect.x += self.speed
        if keys[pygame.K_UP] and self.rect.top > 0:
            self.rect.y -= self.speed
        if keys[pygame.K_DOWN] and self.rect.bottom < HEIGHT:
            self.rect.y += self.speed

    def move_mouse(self, x, y):
        self.rect.centerx = x
        self.rect.centery = y

# 障碍物类


class Obstacle(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        w = random.randint(30, 80)
        h = random.randint(30, 80)
        self.image = pygame.Surface((w, h))
        self.image.fill(RED)
        self.rect = self.image.get_rect()
        self.rect.x = random.randint(0, WIDTH - self.rect.width)
        self.rect.y = random.randint(-100, -40)
        self.speed = random.randint(5, 10)

    def update(self):
        self.rect.y += self.speed
        # 飞出屏幕后删除
        if self.rect.top > HEIGHT:
            self.kill()

# 显示文字函数


def draw_text(text, size, x, y, color=WHITE):
    font = pygame.font.Font(None, size)
    text_surface = font.render(text, True, color)
    text_rect = text_surface.get_rect()
    text_rect.midtop = (x, y)
    screen.blit(text_surface, text_rect)

# 开始界面


def show_start_screen():
    screen.fill(BLACK)
    draw_text("顶级飞行躲避", 60, WIDTH//2, HEIGHT//4, BLUE)
    draw_text("鼠标/方向键控制飞机", 30, WIDTH//2, HEIGHT//2)
    draw_text("点击或按任意键开始", 30, WIDTH//2, HEIGHT*3//4, YELLOW)
    pygame.display.flip()
    waiting = True
    while waiting:
        clock.tick(FPS)
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()
            if event.type == pygame.KEYUP or event.type == pygame.MOUSEBUTTONUP:
                waiting = False

# 游戏结束界面


def show_go_screen(score):
    screen.fill(BLACK)
    draw_text("游戏结束", 60, WIDTH//2, HEIGHT//4, RED)
    draw_text(f"得分：{score}", 40, WIDTH//2, HEIGHT//2)
    draw_text("点击再玩一次", 30, WIDTH//2, HEIGHT*3//4, YELLOW)
    pygame.display.flip()
    waiting = True
    while waiting:
        clock.tick(FPS)
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()
            if event.type == pygame.MOUSEBUTTONUP or event.type == pygame.KEYUP:
                waiting = False

# 主游戏函数


def new_game():
    player = Player()
    all_sprites = pygame.sprite.Group()
    all_sprites.add(player)
    obstacles = pygame.sprite.Group()
    score = 0
    spawn_timer = 0

    running = True
    game_over = False

    while running:
        clock.tick(FPS)

        if not game_over:
            # 生成障碍物
            if pygame.time.get_ticks() - spawn_timer > 400:
                obs = Obstacle()
                all_sprites.add(obs)
                obstacles.add(obs)
                spawn_timer = pygame.time.get_ticks()

            # 事件处理
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    running = False
                if event.type == pygame.MOUSEMOTION:
                    player.move_mouse(*event.pos)

            # 更新
            all_sprites.update()
            score += 0.2

            # 碰撞检测
            hits = pygame.sprite.spritecollide(player, obstacles, True)
            if hits:
                game_over = True

        else:
            show_go_screen(int(score))
            return

        # 绘制
        screen.fill(BLACK)
        all_sprites.draw(screen)
        draw_text(f"得分：{int(score)}", 30, WIDTH//2, 10)
        pygame.display.flip()

    pygame.quit()


# 启动游戏
if __name__ == "__main__":
    show_start_screen()
    while True:
        new_game()
