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, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 120, 255)
GRAY = (80, 80, 80)

# ========== 修复字体加载【核心改动】==========
def create_font(size):
    # 优先使用系统自带微软雅黑，找不到自动切换默认字体，不会触发文件读取报错
    try:
        return pygame.font.SysFont("Microsoft YaHei", size)
    except:
        try:
            return pygame.font.SysFont("SimHei", size)
        except:
            # 终极兜底：pygame自带默认字体，百分百不会报错
            return pygame.font.Font(None, size)

font_big = create_font(48)
font_mid = create_font(30)
font_small = create_font(20)

# 玩家飞机类
class Plane:
    def __init__(self):
        self.width = 40
        self.height = 50
        self.x = WIDTH // 2 - self.width // 2
        self.y = HEIGHT - 120
        self.speed = 7
        self.rect = pygame.Rect(self.x, self.y, self.width, self.height)

    def move(self):
        keys = pygame.key.get_pressed()
        if keys[pygame.K_LEFT] or keys[pygame.K_a]:
            self.rect.x -= self.speed
        if keys[pygame.K_RIGHT] or keys[pygame.K_d]:
            self.rect.x += self.speed
        if keys[pygame.K_UP] or keys[pygame.K_w]:
            self.rect.y -= self.speed
        if keys[pygame.K_DOWN] or keys[pygame.K_s]:
            self.rect.y += self.speed
        self.rect.clamp_ip(screen.get_rect())

    def draw(self):
        pygame.draw.polygon(screen, BLUE, [
            (self.rect.centerx, self.rect.top),
            (self.rect.left, self.rect.bottom),
            (self.rect.right, self.rect.bottom)
        ])
        pygame.draw.rect(screen, GREEN, (self.rect.centerx - 6, self.rect.top + 10, 12, 25))

# 陨石障碍物类
class Meteor:
    def __init__(self):
        self.radius = random.randint(15, 35)
        self.x = random.randint(self.radius, WIDTH - self.radius)
        self.y = random.randint(-80, -self.radius)
        self.speed = random.randint(4, 9)
        self.rect = pygame.Rect(self.x - self.radius, self.y - self.radius, self.radius*2, self.radius*2)

    def update(self):
        self.y += self.speed
        self.rect.center = (self.x, self.y)

    def draw(self):
        pygame.draw.circle(screen, GRAY, (self.x, self.y), self.radius)
        pygame.draw.circle(screen, BLACK, (self.x, self.y), self.radius, 2)

# 按钮绘制函数
def draw_button(x, y, w, h, text, color, hover_color, action=None):
    mouse_pos = pygame.mouse.get_pos()
    click = pygame.mouse.get_pressed()[0]
    btn_rect = pygame.Rect(x, y, w, h)
    current_color = hover_color if btn_rect.collidepoint(mouse_pos) else color
    pygame.draw.rect(screen, current_color, btn_rect, border_radius=8)
    pygame.draw.rect(screen, WHITE, btn_rect, 2, border_radius=8)
    text_surf = font_mid.render(text, True, WHITE)
    screen.blit(text_surf, text_surf.get_rect(center=btn_rect.center))
    if click and btn_rect.collidepoint(mouse_pos) and action:
        pygame.time.delay(150)
        action()

# 游戏重置、退出
def reset_game():
    global player, meteors, score, game_over
    player = Plane()
    meteors = []
    score = 0
    game_over = False

def quit_game():
    pygame.quit()
    sys.exit()

# 全局变量初始化
player = Plane()
meteors = []
score = 0
game_over = False
spawn_timer = 0

# 主循环
running = True
while running:
    dt = clock.tick(FPS) / 1000
    screen.fill(BLACK)

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    if not game_over:
        # 生成陨石
        spawn_timer += dt
        if spawn_timer > 0.3:
            meteors.append(Meteor())
            spawn_timer = 0

        player.move()
        # 遍历陨石
        for met in meteors[:]:
            met.update()
            if met.y > HEIGHT + met.radius:
                meteors.remove(met)
                score += 1
            # 碰撞判定
            if player.rect.colliderect(met.rect):
                game_over = True

        player.draw()
        for m in meteors:
            m.draw()
        # 绘制分数
        score_text = font_mid.render(f"得分：{score}", True, WHITE)
        screen.blit(score_text, (20, 20))

    else:
        # 结束界面
        over_text = font_big.render("游戏结束", True, RED)
        screen.blit(over_text, over_text.get_rect(center=(WIDTH//2, HEIGHT//2 - 100)))
        final_score = font_mid.render(f"最终得分：{score}", True, WHITE)
        screen.blit(final_score, final_score.get_rect(center=(WIDTH//2, HEIGHT//2 - 40)))
        draw_button(WIDTH//2 - 100, HEIGHT//2, 200, 50, "重新开始", (30,100,180), (50,140,220), reset_game)
        draw_button(WIDTH//2 - 100, HEIGHT//2 + 70, 200, 50, "退出游戏", (180,30,30), (220,50,50), quit_game)

    pygame.display.flip()

pygame.quit()