import ntpath
import os

# ========== 修复字体int报错补丁，必须放在最顶部 ==========
origin_splitext = os.path.splitext

def safe_splitext(path_data):
    if not isinstance(path_data, str):
        return ("", "")
    return origin_splitext(path_data)

ntpath.splitext = safe_splitext

import pygame
import random

pygame.init()

# 窗口设置
SCREEN_WIDTH = 900
SCREEN_HEIGHT = 450
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
pygame.display.set_caption("简易横版跑酷")

# 字体（现在不会崩溃）
font_big = pygame.font.SysFont("microsoft yahei", 55)
font_mid = pygame.font.SysFont("microsoft yahei", 30)

# 颜色常量
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (255, 40, 40)
GREEN = (30, 200, 60)
GRAY = (80, 80, 80)

clock = pygame.time.Clock()
FPS = 60

# ---------------------- 游戏变量 ----------------------
ground_y = 350
player_x = 120
player_y = ground_y
player_size = 45
velocity_y = 0
gravity = 0.85
jump_power = -16
is_jumping = False

obstacle_list = []
obstacle_width = 35
obstacle_height = 55
obstacle_speed = 6
spawn_timer = 0

score = 0
game_over = False

def spawn_obstacle():
    """生成障碍物"""
    ox = SCREEN_WIDTH + random.randint(30,180)
    oy = ground_y - obstacle_height
    obstacle_list.append([ox, oy])

running = True
while running:
    clock.tick(FPS)
    screen.fill(GRAY)

    # 事件监听
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        # 游戏结束后按空格重启
        if game_over and event.type == pygame.KEYDOWN:
            if event.key == pygame.K_SPACE:
                # 重置全部参数
                player_y = ground_y
                velocity_y = 0
                is_jumping = False
                obstacle_list.clear()
                spawn_timer = 0
                score = 0
                obstacle_speed = 6
                game_over = False

    keys = pygame.key.get_pressed()
    if not game_over:
        # 空格键跳跃
        if keys[pygame.K_SPACE] and not is_jumping:
            velocity_y = jump_power
            is_jumping = True

        # 重力
        velocity_y += gravity
        player_y += velocity_y

        # 落地判定
        if player_y >= ground_y:
            player_y = ground_y
            velocity_y = 0
            is_jumping = False

        # 生成障碍物
        spawn_timer += 1
        if spawn_timer > 70:
            spawn_obstacle()
            spawn_timer = 0

        # 移动障碍物
        for obs in obstacle_list:
            obs[0] -= obstacle_speed

        # 清除屏幕外障碍物、加分
        for index in range(len(obstacle_list)-1, -1, -1):
            if obstacle_list[index][0] + obstacle_width < 0:
                obstacle_list.pop(index)
                score += 1
                # 难度递增，障碍物越来越快
                obstacle_speed += 0.04

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

    # ---------- 绘制元素 ----------
    # 地面
    pygame.draw.rect(screen, BLACK, (0, ground_y + player_size, SCREEN_WIDTH, SCREEN_HEIGHT-ground_y))
    # 玩家方块
    pygame.draw.rect(screen, GREEN, (player_x, player_y, player_size, player_size))
    # 障碍物
    for obs in obstacle_list:
        pygame.draw.rect(screen, RED, (obs[0], obs[1], obstacle_width, obstacle_height))

    # 分数文字
    score_text = font_mid.render(f"分数：{score}", True, WHITE)
    screen.blit(score_text, (20, 20))

    # 游戏结束界面
    if game_over:
        over_text = font_big.render("游戏结束!", True, RED)
        tip_text = font_mid.render("按下空格键重新开始", True, WHITE)
        screen.blit(over_text,(280,160))
        screen.blit(tip_text,(240,240))

    pygame.display.update()

pygame.quit()
