import pygame
import random
import sys

# 初始化pygame
pygame.init()

# 窗口基础设置
WIDTH, HEIGHT = 480, 700
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("飞行躲避小游戏")

# 颜色常量
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (255, 0, 0)
BLUE = (0, 128, 255)
GRAY = (80, 80, 80)

# 尝试加载系统中文字体，兼容Windows/Mac/Linux
try:
    font_big = pygame.font.SysFont("simhei", 48)
    font_mid = pygame.font.SysFont("simhei", 32)
    font_small = pygame.font.SysFont("simhei", 24)
except:
    font_big = pygame.font.Font(None, 48)
    font_mid = pygame.font.Font(None, 32)
    font_small = pygame.font.Font(None, 24)

# 玩家飞机类
class Player(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        # 绘制简易飞机
        self.image = pygame.Surface((40, 50), 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 Enemy(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.size = random.randint(25, 55)
        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(-120, -self.size)
        self.speed = random.randint(4, 9)

    def update(self):
        self.rect.y += self.speed
        # 飞出屏幕上方重新生成
        if self.rect.top > HEIGHT:
            self.rect.x = random.randint(0, WIDTH - self.size)
            self.rect.y = random.randint(-120, -self.size)
            self.speed = random.randint(4, 9)

# 游戏主函数
def main():
    clock = pygame.time.Clock()
    FPS = 60
    game_state = "start"  # start / playing / gameover
    score = 0

    # 精灵组
    all_sprites = pygame.sprite.Group()
    enemy_group = pygame.sprite.Group()

    # 创建玩家
    player = Player()
    all_sprites.add(player)

    # 生成初始敌机
    for _ in range(8):
        enemy = Enemy()
        all_sprites.add(enemy)
        enemy_group.add(enemy)

    while True:
        clock.tick(FPS)
        screen.fill(BLACK)

        # 事件监听
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()
            # 鼠标点击/空格开始游戏
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_SPACE:
                    if game_state in ("start", "gameover"):
                        # 重置游戏
                        game_state = "playing"
                        score = 0
                        player.rect.centerx = WIDTH // 2
                        player.rect.bottom = HEIGHT - 30
                        for e in enemy_group:
                            e.kill()
                        enemy_group.empty()
                        all_sprites.empty()
                        all_sprites.add(player)
                        for _ in range(8):
                            new_e = Enemy()
                            all_sprites.add(new_e)
                            enemy_group.add(new_e)

        if game_state == "start":
            # 开始界面
            title = font_big.render("飞行躲避", True, WHITE)
            tip = font_mid.render("按 空格键 开始游戏", True, WHITE)
            screen.blit(title, (WIDTH//2 - title.get_width()//2, 220))
            screen.blit(tip, (WIDTH//2 - tip.get_width()//2, 320))

        elif game_state == "playing":
            all_sprites.update()
            # 碰撞检测
            hits = pygame.sprite.spritecollide(player, enemy_group, False)
            if hits:
                game_state = "gameover"

            # 计分
            score += 1 / FPS

            # 绘制所有元素
            all_sprites.draw(screen)
            # 绘制分数
            score_text = font_small.render(f"分数: {int(score)}", True, WHITE)
            screen.blit(score_text, (10, 10))

        elif game_state == "gameover":
            all_sprites.draw(screen)
            over_text = font_big.render("游戏结束", True, RED)
            final_score = font_mid.render(f"最终分数: {int(score)}", True, WHITE)
            restart_tip = font_small.render("按空格重新开始", True, WHITE)
            screen.blit(over_text, (WIDTH//2 - over_text.get_width()//2, 260))
            screen.blit(final_score, (WIDTH//2 - final_score.get_width()//2, 340))
            screen.blit(restart_tip, (WIDTH//2 - restart_tip.get_width()//2, 400))

        pygame.display.flip()

if __name__ == "__main__":
    main()