import pygame
import random
import sys
import os

# 初始化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)
SKY_BLUE = (135, 206, 235)

# ======修复字体报错核心：不用None，改用兜底渲染======
try:
    # 优先系统黑体
    font = pygame.font.SysFont("simhei", 40)
except:
    # 系统字体失效改用内置字体模块，彻底规避sysfont读取bug
    font = pygame.font.Font(None, 40)

# 玩家参数
player_size = 40
player_x = 100
player_y = HEIGHT - player_size - 50
player_y_vel = 0
gravity = 1.2
jump_power = -22
is_jump = False

# 地面
ground_h = 50

# 障碍物
obs_list = []
obs_speed = 7
spawn_timer = 0

# 分数
score = 0

def create_obstacle():
    """生成障碍物"""
    h = random.randint(35, 75)
    w = 30
    x = WIDTH
    y = HEIGHT - h - ground_h
    return [x, y, w, h]

# 游戏主循环
running = True
game_over = False
while running:
    screen.fill(SKY_BLUE)
    # 事件监听
    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 is_jump and not game_over:
                player_y_vel = jump_power
                is_jump = True
            # 游戏结束按R重置
            if event.key == pygame.K_r and game_over:
                # 重置所有数据
                player_y = HEIGHT - player_size - 50
                player_y_vel = 0
                obs_list.clear()
                score = 0
                game_over = False

    if not game_over:
        # 玩家重力下落
        player_y += player_y_vel
        player_y_vel += gravity
        # 落地判定
        ground_pos = HEIGHT - ground_h - player_size
        if player_y >= ground_pos:
            player_y = ground_pos
            player_y_vel = 0
            is_jump = False

        # 生成障碍物
        spawn_timer += 1
        if spawn_timer > random.randint(60, 120):
            obs_list.append(create_obstacle())
            spawn_timer = 0

        # 障碍物移动+计分
        for obs in obs_list[:]:
            obs[0] -= obs_speed
            # 跑出屏幕删除+加分
            if obs[0] + obs[2] < 0:
                obs_list.remove(obs)
                score += 1

        # 碰撞检测
        player_rect = pygame.Rect(player_x, player_y, player_size, player_size)
        for obs in obs_list:
            obs_rect = pygame.Rect(obs[0], obs[1], obs[2], obs[3])
            if player_rect.colliderect(obs_rect):
                game_over = True

    # 绘制地面
    pygame.draw.rect(screen, (80, 50, 30), (0, HEIGHT-ground_h, WIDTH, ground_h))
    # 绘制玩家
    pygame.draw.rect(screen, GREEN, (player_x, player_y, player_size, player_size))
    # 绘制障碍物
    for obs in obs_list:
        pygame.draw.rect(screen, RED, obs)
    # 绘制分数
    score_text = font.render(f"Score: {score}", True, BLACK)
    screen.blit(score_text, (10, 10))

    # 游戏结束提示
    if game_over:
        over_text = font.render("Game Over! Press R Restart", True, RED)
        screen.blit(over_text, (WIDTH//2 - 220, HEIGHT//2))

    pygame.display.update()
    clock.tick(FPS)

pygame.quit()
sys.exit()