import pygame
import random
import sys

# 初始化pygame
pygame.init()

# 游戏窗口设置
WIDTH, HEIGHT = 800, 400
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("简易跑酷游戏")

# 颜色定义
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
GROUND_COLOR = (139, 69, 19)

# 帧率控制
clock = pygame.time.Clock()
FPS = 60

# 角色类（玩家）
class Player(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        # 角色外观（简易矩形代替）
        self.width = 40
        self.height = 60
        self.image = pygame.Surface((self.width, self.height))
        self.image.fill(GREEN)
        self.rect = self.image.get_rect()
        # 角色初始位置
        self.rect.x = 100
        self.rect.y = HEIGHT - self.height - 50  # 地面上方
        # 跳跃相关参数
        self.velocity = 0
        self.gravity = 0.8
        self.jump_strength = -18
        self.on_ground = True  # 是否在地面

    def update(self):
        # 应用重力
        self.velocity += self.gravity
        self.rect.y += self.velocity

        # 限制角色在地面上（防止掉下去）
        if self.rect.y >= HEIGHT - self.height - 50:
            self.rect.y = HEIGHT - self.height - 50
            self.velocity = 0
            self.on_ground = True

    def jump(self):
        # 只有在地面时才能跳跃
        if self.on_ground:
            self.velocity = self.jump_strength
            self.on_ground = False

# 障碍物类
class Obstacle(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        # 随机生成障碍物大小（增加游戏难度变化）
        self.width = random.randint(30, 60)
        self.height = random.randint(40, 80)
        self.image = pygame.Surface((self.width, self.height))
        self.image.fill(RED)
        self.rect = self.image.get_rect()
        # 障碍物初始位置（屏幕右侧）
        self.rect.x = WIDTH
        self.rect.y = HEIGHT - self.height - 50  # 地面上方

    def update(self):
        # 障碍物向左移动（模拟角色向前跑）
        self.rect.x -= 8
        # 超出屏幕左侧则删除
        if self.rect.x < -self.width:
            self.kill()

# 初始化精灵组
all_sprites = pygame.sprite.Group()
obstacles = pygame.sprite.Group()

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

# 计分
score = 0
font = pygame.font.Font(None, 40)

# 生成障碍物的计时器
obstacle_timer = 0

# 游戏主循环
running = True
game_over = False

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 not game_over:
                player.jump()
            # 游戏结束后按R键重新开始
            if event.key == pygame.K_r and game_over:
                # 重置游戏状态
                game_over = False
                score = 0
                all_sprites.empty()
                obstacles.empty()
                player = Player()
                all_sprites.add(player)
                obstacle_timer = 0

    if not game_over:
        # 生成障碍物（随机间隔）
        obstacle_timer += 1
        if obstacle_timer > random.randint(60, 120):  # 1-2秒生成一个
            obstacle = Obstacle()
            all_sprites.add(obstacle)
            obstacles.add(obstacle)
            obstacle_timer = 0
            # 生成障碍物则加分
            score += 1

        # 更新所有精灵
        all_sprites.update()

        # 碰撞检测（玩家碰到障碍物则游戏结束）
        if pygame.sprite.spritecollide(player, obstacles, False):
            game_over = True

    # 绘制画面
    # 填充背景
    screen.fill(WHITE)
    # 绘制地面
    pygame.draw.rect(screen, GROUND_COLOR, (0, HEIGHT - 50, WIDTH, 50))
    # 绘制所有精灵
    all_sprites.draw(screen)
    # 绘制分数
    score_text = font.render(f"分数: {score}", True, BLACK)
    screen.blit(score_text, (10, 10))
    # 游戏结束提示
    if game_over:
        game_over_text = font.render(f"游戏结束！分数: {score} 按R重新开始", True, RED)
        screen.blit(game_over_text, (WIDTH//2 - 200, HEIGHT//2))

    # 更新显示
    pygame.display.flip()

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