import pygame
import random
import sys

# ===================== 初始化游戏 =====================
pygame.init()
pygame.mixer.init()

# 屏幕设置
SCREEN_WIDTH = 800
SCREEN_HEIGHT = 400
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
pygame.display.set_caption("🏃‍♂️ 顶级跑酷游戏")

# 帧率
clock = pygame.time.Clock()
FPS = 60

# 颜色
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
GRAY = (128, 128, 128)
RED = (200, 0, 0)
GREEN = (0, 200, 0)

# ===================== 游戏变量 =====================
gravity = 0.8
player_speed = 5
jump_power = -15
scroll_speed = 5
score = 0
game_over = False

# ===================== 玩家类 =====================


class Player(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        # 简单方块代替角色（可替换图片）
        self.image = pygame.Surface((40, 60))
        self.image.fill(GREEN)
        self.rect = self.image.get_rect()
        self.rect.x = 80
        self.rect.y = SCREEN_HEIGHT - 120
        self.vel_y = 0
        self.jumping = False

    def update(self):
        global game_over
        if game_over:
            return

        # 重力
        self.vel_y += gravity
        self.rect.y += self.vel_y

        # 地面碰撞
        if self.rect.bottom >= SCREEN_HEIGHT - 60:
            self.rect.bottom = SCREEN_HEIGHT - 60
            self.vel_y = 0
            self.jumping = False

    def jump(self):
        if not self.jumping and not game_over:
            self.jumping = True
            self.vel_y = jump_power

# ===================== 障碍物类 =====================


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 = SCREEN_WIDTH
        self.rect.y = SCREEN_HEIGHT - 110

    def update(self):
        if game_over:
            return
        self.rect.x -= scroll_speed
        if self.rect.right < 0:
            self.kill()

# ===================== 背景滚动 =====================


class Background:
    def __init__(self):
        self.bg1 = pygame.Surface((SCREEN_WIDTH, SCREEN_HEIGHT))
        self.bg1.fill((135, 206, 235))
        self.bg2 = self.bg1.copy()
        self.bg1_rect = self.bg1.get_rect()
        self.bg2_rect = self.bg2.get_rect()
        self.bg2_rect.x = SCREEN_WIDTH

    def update(self):
        if game_over:
            return
        self.bg1_rect.x -= scroll_speed
        self.bg2_rect.x -= scroll_speed
        if self.bg1_rect.right <= 0:
            self.bg1_rect.x = SCREEN_WIDTH
        if self.bg2_rect.right <= 0:
            self.bg2_rect.x = SCREEN_WIDTH

    def draw(self, surface):
        surface.blit(self.bg1, self.bg1_rect)
        surface.blit(self.bg2, self.bg2_rect)


# ===================== 创建对象 =====================
player = Player()
bg = Background()

all_sprites = pygame.sprite.Group()
all_sprites.add(player)

obstacle_group = pygame.sprite.Group()

# 字体
font = pygame.font.SysFont(None, 40)
big_font = pygame.font.SysFont(None, 60)

# 障碍物计时器
obstacle_timer = 0
OBSTACLE_INTERVAL = 1200  # 毫秒

# ===================== 游戏主循环 =====================
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:
            if event.key == pygame.K_SPACE:
                player.jump()
            if event.key == pygame.K_r and game_over:
                # 重启游戏
                game_over = False
                score = 0
                obstacle_group.empty()
                player.rect.y = SCREEN_HEIGHT - 120
                player.vel_y = 0

    if not game_over:
        # 生成障碍物
        if pygame.time.get_ticks() - obstacle_timer > OBSTACLE_INTERVAL:
            obstacle = Obstacle()
            obstacle_group.add(obstacle)
            obstacle_timer = pygame.time.get_ticks()

        # 更新
        bg.update()
        all_sprites.update()
        obstacle_group.update()

        # 碰撞检测
        if pygame.sprite.spritecollide(player, obstacle_group, True):
            game_over = True

        # 计分
        score += 1

    # 绘制
    bg.draw(screen)
    all_sprites.draw(screen)
    obstacle_group.draw(screen)

    # 地面
    pygame.draw.rect(screen, GRAY, (0, SCREEN_HEIGHT - 60, SCREEN_WIDTH, 60))

    # 分数
    score_text = font.render(f"分数: {score}", True, BLACK)
    screen.blit(score_text, (20, 20))

    # 游戏结束
    if game_over:
        over_text = big_font.render("游戏结束！按 R 重启", True, RED)
        screen.blit(over_text, (SCREEN_WIDTH//2 - 200, SCREEN_HEIGHT//2 - 50))

    pygame.display.update()

pygame.quit()
sys.exit()
