import pygame
import random
import sys

# 初始化pygame
pygame.init()

# 游戏常量设置
SCREEN_WIDTH = 400
SCREEN_HEIGHT = 600
FPS = 60
PLAYER_SPEED = 5
OBSTACLE_SPEED = 3
OBSTACLE_SPAWN_RATE = 60  # 每60帧生成一个障碍物

# 颜色定义
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (255, 0, 0)
BLUE = (0, 0, 255)

# 设置游戏窗口
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
pygame.display.set_caption("飞行躲避游戏")
clock = pygame.time.Clock()

# 玩家飞机类


class Player(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        # 创建飞机图形（蓝色矩形代替，也可以替换为图片）
        self.image = pygame.Surface((40, 50))
        self.image.fill(BLUE)
        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

# 障碍物类


class Obstacle(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        # 随机生成障碍物大小
        self.width = random.randint(30, 60)
        self.height = random.randint(20, 40)
        self.image = pygame.Surface((self.width, self.height))
        self.image.fill(RED)
        self.rect = self.image.get_rect()
        # 随机生成障碍物水平位置
        self.rect.x = random.randint(0, SCREEN_WIDTH - self.width)
        self.rect.y = -self.height  # 从屏幕顶部外开始

    def update(self):
        # 障碍物向下移动
        self.rect.y += OBSTACLE_SPEED
        # 超出屏幕底部则删除
        if self.rect.top > SCREEN_HEIGHT:
            self.kill()


# 创建精灵组
all_sprites = pygame.sprite.Group()
obstacles = pygame.sprite.Group()

# 创建玩家
player = Player()
all_sprites.add(player)

# 游戏主循环
running = True
game_over = False
frame_count = 0
score = 0

while running:
    # 控制帧率
    clock.tick(FPS)

    # 事件处理
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        # 游戏结束后按空格键重新开始
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_SPACE and game_over:
                # 重置游戏状态
                game_over = False
                score = 0
                frame_count = 0
                # 清空精灵组并重新创建玩家
                all_sprites.empty()
                obstacles.empty()
                player = Player()
                all_sprites.add(player)

    if not game_over:
        # 计数帧数，控制障碍物生成频率
        frame_count += 1
        if frame_count % OBSTACLE_SPAWN_RATE == 0:
            # 创建新障碍物
            obstacle = Obstacle()
            all_sprites.add(obstacle)
            obstacles.add(obstacle)
            # 每生成一个障碍物加分
            score += 10

        # 更新所有精灵
        all_sprites.update()

        # 碰撞检测（玩家碰到障碍物则游戏结束）
        if pygame.sprite.spritecollide(player, obstacles, False):
            game_over = True

    # 绘制画面
    screen.fill(WHITE)
    all_sprites.draw(screen)

    # 显示分数
    font = pygame.font.Font(None, 40)
    score_text = font.render(f"Score: {score}", True, BLACK)
    screen.blit(score_text, (10, 10))

    # 游戏结束提示
    if game_over:
        game_over_font = pygame.font.Font(None, 60)
        game_over_text = game_over_font.render("Game Over!", True, RED)
        restart_text = font.render("Press SPACE to restart", True, BLACK)
        screen.blit(game_over_text, (SCREEN_WIDTH //
                    2 - 120, SCREEN_HEIGHT//2 - 50))
        screen.blit(restart_text, (SCREEN_WIDTH //
                    2 - 150, SCREEN_HEIGHT//2 + 10))

    # 更新显示
    pygame.display.flip()

# 退出游戏
pygame.quit()
sys.exit()
