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("简易Pygame跑酷游戏")

# 颜色定义
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
SKY_BLUE = (135, 206, 235)
BROWN = (139, 69, 19)

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

# 玩家属性
player_x = 80
player_y = HEIGHT - 80
player_width = 40
player_height = 60
jump_speed = 0
gravity = 1
is_jump = False

# 障碍物列表
obstacles = []
obstacle_speed = 6
spawn_timer = 0
score = 0
game_over = False

# ========== 修复字体报错核心修改 ==========
try:
    # 优先使用系统默认宋体，避免None参数报错
    font = pygame.font.SysFont("simsun", 48)
except:
    try:
        font = pygame.font.SysFont("arial", 48)
    except:
        # 终极兜底：使用pygame默认基础字体
        font = pygame.font.Font(None, 48)

def reset_game():
    """重置游戏所有参数"""
    global player_y, jump_speed, is_jump, obstacles, obstacle_speed, score, game_over, spawn_timer
    player_y = HEIGHT - 80
    jump_speed = 0
    is_jump = False
    obstacles = []
    obstacle_speed = 6
    score = 0
    game_over = False
    spawn_timer = 0

# 主游戏循环
while True:
    clock.tick(FPS)
    screen.fill(SKY_BLUE)

    # 事件监听
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
        # 空格跳跃
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_SPACE and not is_jump and not game_over:
                is_jump = True
                jump_speed = -18
            # R键重新开始
            if event.key == pygame.K_r and game_over:
                reset_game()

    if not game_over:
        # 跳跃物理逻辑
        if is_jump:
            player_y += jump_speed
            jump_speed += gravity
            # 落地判定
            if player_y >= HEIGHT - 80:
                player_y = HEIGHT - 80
                is_jump = False
                jump_speed = 0

        # 生成障碍物
        spawn_timer += 1
        if spawn_timer > random.randint(60, 120):
            obs_w = random.randint(30, 50)
            obs_h = random.randint(40, 70)
            obs_x = WIDTH
            obs_y = HEIGHT - obs_h
            obstacles.append([obs_x, obs_y, obs_w, obs_h])
            spawn_timer = 0

        # 移动障碍物 + 移除出屏幕障碍
        for obs in obstacles[:]:
            obs[0] -= obstacle_speed
            if obs[0] + obs[2] < 0:
                obstacles.remove(obs)
                score += 1
                # 随分数小幅提速
                if obstacle_speed < 12:
                    obstacle_speed += 0.02

        # 碰撞检测
        player_rect = pygame.Rect(player_x, player_y, player_width, player_height)
        for obs in obstacles:
            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, BROWN, (0, HEIGHT - 20, WIDTH, 20))

    # 绘制玩家
    pygame.draw.rect(screen, GREEN, (player_x, player_y, player_width, player_height))

    # 绘制障碍物
    for obs in obstacles:
        pygame.draw.rect(screen, RED, obs)

    # 绘制分数
    score_text = font.render(f"分数: {score}", True, BLACK)
    screen.blit(score_text, (10, 10))

    # 游戏结束界面
    if game_over:
        over_text = font.render("游戏结束！按R重新开始", True, RED)
        screen.blit(over_text, (WIDTH//2 - 320, HEIGHT//2 - 30))

    pygame.display.update()