import pygame
import random
import sys

# 初始化pygame
pygame.init()

# 游戏常量设置
WIDTH, HEIGHT = 800, 600
FPS = 60
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (255, 0, 0)
BLUE = (0, 0, 255)
GREEN = (0, 255, 0)

# 创建游戏窗口
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("飞行躲避游戏")
clock = pygame.time.Clock()

# 字体设置
font = pygame.font.Font(None, 40)
game_over_font = pygame.font.Font(None, 80)

# 玩家飞机类
class Player(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        # 创建飞机形状（简化版）：主体+机翼
        self.image = pygame.Surface((40, 40), pygame.SRCALPHA)
        # 绘制飞机主体（三角形）
        pygame.draw.polygon(self.image, BLUE, [(20, 0), (0, 40), (40, 40)])
        # 绘制机翼
        pygame.draw.rect(self.image, BLUE, (5, 15, 30, 10))
        self.rect = self.image.get_rect()
        self.rect.center = (WIDTH // 2, HEIGHT // 2)
        self.speed = 6  # 略微提高玩家速度，适配更多敌人

    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.image = pygame.Surface((30, 30))
        self.image.fill(RED)
        self.rect = self.image.get_rect()
        
        # 随机生成敌人出现的位置（四个边）
        spawn_side = random.choice(['top', 'bottom', 'left', 'right'])
        if spawn_side == 'top':
            self.rect.x = random.randint(0, WIDTH - 30)
            self.rect.y = -30
        elif spawn_side == 'bottom':
            self.rect.x = random.randint(0, WIDTH - 30)
            self.rect.y = HEIGHT
        elif spawn_side == 'left':
            self.rect.x = -30
            self.rect.y = random.randint(0, HEIGHT - 30)
        else:  # right
            self.rect.x = WIDTH
            self.rect.y = random.randint(0, HEIGHT - 30)
        
        # 随机移动方向（提高速度，让敌人更灵活）
        self.speed_x = random.randint(-4, 4)
        self.speed_y = random.randint(-4, 4)
        # 避免敌人静止
        if self.speed_x == 0 and self.speed_y == 0:
            self.speed_x = random.choice([-3, 3])
        
        # 敌人生命周期（帧数），60帧=1秒
        self.lifetime = random.randint(60 * 2, 60 * 6)  # 缩短生命周期，避免敌人堆积

    def update(self):
        # 移动敌人
        self.rect.x += self.speed_x
        self.rect.y += self.speed_y
        # 减少生命周期
        self.lifetime -= 1
        # 生命周期结束则移除敌人
        if self.lifetime <= 0:
            self.kill()

# 初始化精灵组
all_sprites = pygame.sprite.Group()
enemies = pygame.sprite.Group()
player = Player()
all_sprites.add(player)

# 游戏变量
score = 0
game_over = False
spawn_timer = 0
spawn_interval = 30  # 生成间隔从60帧（1秒）缩短到30帧（0.5秒）
max_enemies_at_once = 15  # 限制同时存在的最大敌人数量，避免卡顿

# 游戏主循环
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 and game_over:
            # 重置游戏状态
            game_over = False
            score = 0
            # 清空所有精灵
            all_sprites.empty()
            enemies.empty()
            # 重新添加玩家
            player = Player()
            all_sprites.add(player)

    if not game_over:
        # 计分（每帧加1分）
        score += 1
        
        # 生成敌人：提高生成频率+单次生成多个
        spawn_timer += 1
        if spawn_timer >= spawn_interval and len(enemies) < max_enemies_at_once:
            spawn_timer = 0
            # 单次生成1-3个敌人（核心修改：增加敌人数量）
            num_enemies_to_spawn = random.randint(1, 3)
            for _ in range(num_enemies_to_spawn):
                enemy = Enemy()
                all_sprites.add(enemy)
                enemies.add(enemy)
        
        # 更新所有精灵
        all_sprites.update()
        
        # 碰撞检测
        if pygame.sprite.spritecollide(player, enemies, False):
            game_over = True

    # 绘制背景
    screen.fill(BLACK)
    
    # 绘制所有精灵
    all_sprites.draw(screen)
    
    # 绘制分数和当前敌人数
    score_text = font.render(f"分数: {score}", True, GREEN)
    enemy_count_text = font.render(f"当前敌人: {len(enemies)}", True, WHITE)
    screen.blit(score_text, (10, 10))
    screen.blit(enemy_count_text, (10, 50))
    
    # 游戏结束提示
    if game_over:
        game_over_text = game_over_font.render("游戏结束!", True, RED)
        restart_text = font.render("按任意键重新开始", True, WHITE)
        screen.blit(game_over_text, (WIDTH//2 - 150, HEIGHT//2 - 50))
        screen.blit(restart_text, (WIDTH//2 - 120, HEIGHT//2 + 20))
    
    # 更新屏幕显示
    pygame.display.flip()

# 退出游戏
pygame.quit()
sys.exit()