import pygame
import random
import sys

# 初始化 pygame
pygame.init()

# -------------------------- 游戏基础设置 --------------------------
WIDTH, HEIGHT = 800, 400
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("简易跑酷游戏")
clock = pygame.time.Clock()
FPS = 60

# 颜色定义
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
GRAY = (128, 128, 128)

# -------------------------- 玩家类 --------------------------


class Player(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        # 用矩形代替角色（你可以 later 换成图片）
        self.image = pygame.Surface((40, 60))
        self.image.fill(GREEN)
        self.rect = self.image.get_rect()
        self.rect.x = 80
        self.rect.y = HEIGHT - 100

        # 跳跃参数
        self.jump_speed = -15
        self.gravity = 0.8
        self.vel_y = 0
        self.on_ground = True

    def update(self):
        # 重力
        self.vel_y += self.gravity
        self.rect.y += self.vel_y

        # 贴地
        if self.rect.y >= HEIGHT - 100:
            self.rect.y = HEIGHT - 100
            self.vel_y = 0
            self.on_ground = True

    def jump(self):
        if self.on_ground:
            self.vel_y = self.jump_speed
            self.on_ground = False

# -------------------------- 障碍物类 --------------------------


class Obstacle(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image = pygame.Surface((30, 50))
        self.image.fill(RED)
        self.rect = self.image.get_rect()
        self.rect.x = WIDTH
        self.rect.y = HEIGHT - 100

    def update(self):
        # 向左移动
        self.rect.x -= 8
        # 超出屏幕删除
        if self.rect.right < 0:
            self.kill()


# -------------------------- 游戏初始化 --------------------------
all_sprites = pygame.sprite.Group()
obstacles = pygame.sprite.Group()

player = Player()
all_sprites.add(player)

# 障碍物生成计时器
obstacle_timer = 0
score = 0
game_over = False

# -------------------------- 主循环 --------------------------
while True:
    # 事件处理
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
        # 跳跃：空格 / 上键
        if event.type == pygame.KEYDOWN:
            if not game_over and (event.key == pygame.K_SPACE or event.key == pygame.K_UP):
                player.jump()
            # 游戏结束后按 R 重启
            if game_over and event.key == pygame.K_r:
                # 重置游戏
                player.rect.y = HEIGHT - 100
                obstacles.empty()
                score = 0
                game_over = False
                obstacle_timer = 0

    if not game_over:
        # 更新
        all_sprites.update()
        obstacles.update()

        # 生成障碍物
        obstacle_timer += 1
        if obstacle_timer > random.randint(40, 80):
            obs = Obstacle()
            all_sprites.add(obs)
            obstacles.add(obs)
            obstacle_timer = 0

        # 碰撞检测
        if pygame.sprite.spritecollide(player, obstacles, True):
            game_over = True

        # 加分
        score += 1

    # -------------------------- 绘制 --------------------------
    screen.fill(WHITE)

    # 地面
    pygame.draw.rect(screen, GRAY, (0, HEIGHT - 50, WIDTH, 50))

    all_sprites.draw(screen)

    # 显示分数
    font = pygame.font.SysFont(None, 40)
    score_text = font.render(f"分数: {score}", True, BLACK)
    screen.blit(score_text, (10, 10))

    # 游戏结束文字
    if game_over:
        game_over_text = font.render("游戏结束！按 R 重新开始", True, RED)
        screen.blit(game_over_text, (WIDTH//2 - 180, HEIGHT//2))

    pygame.display.flip()
    clock.tick(FPS)
