import pygame
import sys
import random

# 初始化Pygame
pygame.init()

# ===================== 游戏常量 =====================
# 窗口尺寸
SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600
# 帧率
FPS = 60
# 基础速度
PLAYER_SPEED = 7
OBSTACLE_BASE_SPEED = 5
OBSTACLE_SPAWN_INTERVAL = 60  # 每60帧生成一个障碍物（初始）

# 颜色定义 (RGB)
COLORS = {
    "bg": (15, 20, 35),        # 背景色
    "player": (0, 200, 255),   # 玩家飞行器颜色
    "obstacle": (255, 100, 50),# 障碍物颜色
    "text": (255, 255, 255),   # 文字颜色
    "border": (50, 50, 100)    # 边框颜色
}

# ===================== 游戏类 =====================
class Player(pygame.sprite.Sprite):
    """玩家飞行器类"""
    def __init__(self):
        super().__init__()
        # 创建飞行器（三角形，更有飞行感）
        self.image = pygame.Surface((40, 40), pygame.SRCALPHA)  # 透明背景
        pygame.draw.polygon(
            self.image, 
            COLORS["player"],
            [(20, 0), (0, 40), (40, 40)]  # 三角形顶点坐标
        )
        self.rect = self.image.get_rect()
        # 初始位置：屏幕底部中间
        self.rect.centerx = SCREEN_WIDTH // 2
        self.rect.bottom = SCREEN_HEIGHT - 20

    def update(self):
        """更新位置（响应键盘/鼠标控制）"""
        # 键盘控制：左右移动
        keys = pygame.key.get_pressed()
        if keys[pygame.K_LEFT] and self.rect.left > 0:
            self.rect.x -= PLAYER_SPEED
        if keys[pygame.K_RIGHT] and self.rect.right < SCREEN_WIDTH:
            self.rect.x += PLAYER_SPEED
        
        # 鼠标控制（可选，更灵活）
        mouse_x, _ = pygame.mouse.get_pos()
        if pygame.mouse.get_pressed()[0]:  # 按住鼠标左键时跟随鼠标
            self.rect.centerx = mouse_x
            # 限制在屏幕内
            if self.rect.left < 0:
                self.rect.left = 0
            if self.rect.right > SCREEN_WIDTH:
                self.rect.right = SCREEN_WIDTH

class Obstacle(pygame.sprite.Sprite):
    """障碍物类"""
    def __init__(self, speed):
        super().__init__()
        # 随机生成障碍物大小（增加随机性）
        self.width = random.randint(20, 60)
        self.height = random.randint(20, 60)
        self.image = pygame.Surface((self.width, self.height))
        self.image.fill(COLORS["obstacle"])
        self.rect = self.image.get_rect()
        # 随机生成位置（屏幕顶部外）
        self.rect.x = random.randint(0, SCREEN_WIDTH - self.width)
        self.rect.y = random.randint(-100, -self.height)
        # 移动速度（随游戏难度变化）
        self.speed = speed

    def update(self):
        """向下移动，超出屏幕则销毁"""
        self.rect.y += self.speed
        if self.rect.top > SCREEN_HEIGHT:
            self.kill()  # 从精灵组中移除

# ===================== 游戏主逻辑 =====================
def main():
    # 创建游戏窗口
    screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
    pygame.display.set_caption("Python 飞行躲避游戏")
    
    # 时钟（控制帧率）
    clock = pygame.time.Clock()
    
    # 字体（显示分数和提示）
    font_small = pygame.font.Font(None, 36)
    font_large = pygame.font.Font(None, 60)
    
    # 创建精灵组
    all_sprites = pygame.sprite.Group()
    obstacles = pygame.sprite.Group()
    
    # 创建玩家
    player = Player()
    all_sprites.add(player)
    
    # 游戏状态
    score = 0
    game_over = False
    frame_count = 0
    obstacle_speed = OBSTACLE_BASE_SPEED
    spawn_interval = OBSTACLE_SPAWN_INTERVAL

    # 游戏主循环
    while True:
        # ========== 事件处理 ==========
        for event in pygame.event.get():
            # 关闭窗口
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()
            
            # 游戏结束后按空格键重新开始
            if event.type == pygame.KEYDOWN and game_over:
                if event.key == pygame.K_SPACE:
                    # 重置游戏状态
                    all_sprites.empty()
                    obstacles.empty()
                    player = Player()
                    all_sprites.add(player)
                    score = 0
                    game_over = False
                    obstacle_speed = OBSTACLE_BASE_SPEED
                    spawn_interval = OBSTACLE_SPAWN_INTERVAL
                    frame_count = 0

        # ========== 游戏逻辑 ==========
        if not game_over:
            # 生成障碍物（随分数增加，生成更快、移动更快）
            frame_count += 1
            if frame_count % spawn_interval == 0:
                obstacle = Obstacle(obstacle_speed)
                all_sprites.add(obstacle)
                obstacles.add(obstacle)
            
            # 更新分数（每帧加1）
            score += 1
            
            # 难度递增：每得500分，障碍物变快、生成更频繁
            if score % 500 == 0 and score > 0:
                obstacle_speed += 0.5
                spawn_interval = max(20, spawn_interval - 5)  # 最低间隔20帧
            
            # 更新所有精灵
            all_sprites.update()
            
            # 碰撞检测（玩家撞障碍物则游戏结束）
            if pygame.sprite.spritecollide(player, obstacles, False):
                game_over = True

        # ========== 绘制界面 ==========
        # 填充背景
        screen.fill(COLORS["bg"])
        
        # 绘制边框
        pygame.draw.rect(screen, COLORS["border"], (0, 0, SCREEN_WIDTH, SCREEN_HEIGHT), 2)
        
        # 绘制所有精灵
        all_sprites.draw(screen)
        
        # 绘制分数
        score_text = font_small.render(f"分数: {score}", True, COLORS["text"])
        screen.blit(score_text, (10, 10))
        
        # 绘制操作提示
        hint_text = font_small.render("方向键/鼠标左键：控制移动 | 撞障碍物游戏结束", True, COLORS["text"])
        screen.blit(hint_text, (10, 50))
        
        # 游戏结束提示
        if game_over:
            over_text = font_large.render("游戏结束!", True, COLORS["text"])
            restart_text = font_small.render(f"最终分数: {score} | 按空格键重开", True, COLORS["text"])
            # 居中显示
            over_rect = over_text.get_rect(center=(SCREEN_WIDTH//2, SCREEN_HEIGHT//2 - 30))
            restart_rect = restart_text.get_rect(center=(SCREEN_WIDTH//2, SCREEN_HEIGHT//2 + 20))
            screen.blit(over_text, over_rect)
            screen.blit(restart_text, restart_rect)

        # 更新屏幕
        pygame.display.flip()
        # 控制帧率
        clock.tick(FPS)

# 启动游戏
if __name__ == "__main__":
    main()