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)
RED = (255, 50, 50)
BLUE = (30, 144, 255)
BLACK = (0, 0, 0)
GRAY = (80, 80, 80)

# ========== 修复字体代码 ==========
try:
    # Windows通用微软雅黑系统字体（不需要文件，系统自带）
    font = pygame.font.SysFont("Microsoft YaHei", 24)
    big_font = pygame.font.SysFont("Microsoft YaHei", 40)
except:
    try:
        # 备选宋体
        font = pygame.font.SysFont("SimSun", 24)
        big_font = pygame.font.SysFont("SimSun", 40)
    except:
        # 兜底默认字体，百分百不会报错
        font = pygame.font.Font(None, 24)
        big_font = pygame.font.Font(None, 40)

# 玩家飞机
class Player(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.width = 40
        self.height = 50
        self.image = pygame.Surface((self.width, self.height), pygame.SRCALPHA)
        pygame.draw.polygon(self.image, BLUE, [(20, 0), (0, 50), (40, 50)])
        self.rect = self.image.get_rect()
        self.rect.centerx = WIDTH // 2
        self.rect.bottom = HEIGHT - 30
        self.speed = 7

    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

# 陨石障碍物
class Meteor(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.size = random.randint(20, 50)
        self.image = pygame.Surface((self.size, self.size), pygame.SRCALPHA)
        pygame.draw.circle(self.image, GRAY, (self.size//2, self.size//2), self.size//2)
        self.rect = self.image.get_rect()
        self.reset()
        self.speed = random.randint(4, 9)

    def update(self):
        self.rect.y += self.speed
        if self.rect.top > HEIGHT:
            self.reset()

    def reset(self):
        self.size = random.randint(20, 50)
        self.image = pygame.Surface((self.size, self.size), pygame.SRCALPHA)
        pygame.draw.circle(self.image, GRAY, (self.size//2, self.size//2), self.size//2)
        self.rect = self.image.get_rect()
        self.rect.x = random.randint(0, WIDTH - self.size)
        self.rect.y = random.randint(-80, -20)
        self.speed = random.randint(4, 9)

# 精灵分组
all_sprites = pygame.sprite.Group()
meteor_group = pygame.sprite.Group()
player = Player()
all_sprites.add(player)

# 生成陨石
for _ in range(8):
    met = Meteor()
    all_sprites.add(met)
    meteor_group.add(met)

score = 0
game_over = False

# 游戏结束界面
def draw_game_over():
    text1 = big_font.render("游戏结束", True, RED)
    text2 = font.render(f"最终分数：{int(score)}", True, WHITE)
    text3 = font.render("按空格键重新开始", True, WHITE)
    screen.blit(text1, (WIDTH/2 - text1.get_width()/2, 220))
    screen.blit(text2, (WIDTH/2 - text2.get_width()/2, 290))
    screen.blit(text3, (WIDTH/2 - text3.get_width()/2, 350))

# 主循环
running = True
while running:
    clock.tick(FPS)
    # 事件处理
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        if event.type == pygame.KEYDOWN:
            if game_over and event.key == pygame.K_SPACE:
                # 重置游戏数据
                game_over = False
                score = 0
                meteor_group.empty()
                all_sprites.empty()
                player = Player()
                all_sprites.add(player)
                for _ in range(8):
                    m = Meteor()
                    all_sprites.add(m)
                    meteor_group.add(m)

    if not game_over:
        all_sprites.update()
        # 碰撞检测
        if pygame.sprite.spritecollide(player, meteor_group, False):
            game_over = True
        score += 1 / FPS

    # 绘制画面
    screen.fill(BLACK)
    all_sprites.draw(screen)
    score_text = font.render(f"分数：{int(score)}", True, WHITE)
    screen.blit(score_text, (10, 10))

    if game_over:
        draw_game_over()

    pygame.display.flip()

pygame.quit()
sys.exit()