import pygame
import random
import sys
import os

# ===================== 初始化配置 =====================
pygame.init()
WIDTH, HEIGHT = 800, 500
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, 200, 0)
BLUE = (0, 150, 255)
GRAY = (80, 80, 80)
SKY_BLUE = (135, 206, 235)

# 【修复字体】分层安全加载，杜绝报错
def get_font(size):
    try:
        # 优先微软雅黑
        return pygame.font.SysFont("Microsoft YaHei", size)
    except:
        try:
            # 备选黑体
            return pygame.font.SysFont("SimHei", size)
        except:
            # 系统默认字体兜底，百分百不会报错
            return pygame.font.Font(None, size)

font_big = get_font(48)
font_mid = get_font(30)
font_small = get_font(22)

# 玩家参数
player_size = 40
player_x = 100
player_y = HEIGHT - player_size - 60
player_vel_y = 0
gravity = 1.2
jump_force = -22
on_ground = True

# 地面
ground_height = 60
ground_y = HEIGHT - ground_height

# 障碍物配置
obstacle_list = []
obstacle_width = 30
obstacle_min_h = 40
obstacle_max_h = 90
obstacle_speed = 7
spawn_timer = 0
spawn_interval = 1200  # 毫秒生成一个障碍

# 游戏数据
score = 0
game_state = "menu"  # menu菜单 / running游戏中 / gameover结束
high_score = 0

# ===================== 工具函数 =====================
def reset_game():
    global player_y, player_vel_y, on_ground, obstacle_list, score, spawn_timer
    player_y = HEIGHT - player_size - ground_height
    player_vel_y = 0
    on_ground = True
    obstacle_list.clear()
    score = 0
    spawn_timer = pygame.time.get_ticks()

def draw_menu():
    screen.fill(BLUE)
    title = font_big.render("极简跑酷游戏", True, WHITE)
    screen.blit(title, (WIDTH//2 - title.get_width()//2, 120))

    tip1 = font_mid.render("按 空格键 开始游戏", True, WHITE)
    screen.blit(tip1, (WIDTH//2 - tip1.get_width()//2, 220))
    tip2 = font_small.render("游戏操作：空格 / ↑ 跳跃，躲避柱子", True, WHITE)
    screen.blit(tip2, (WIDTH//2 - tip2.get_width()//2, 270))
    tip3 = font_small.render(f"历史最高分：{high_score}", True, WHITE)
    screen.blit(tip3, (WIDTH//2 - tip3.get_width()//2, 320))

def draw_game_over():
    screen.fill((30, 30, 30))
    over_text = font_big.render("游戏结束", True, RED)
    screen.blit(over_text, (WIDTH//2 - over_text.get_width()//2, 130))

    now_score = font_mid.render(f"本次得分：{score}", True, WHITE)
    screen.blit(now_score, (WIDTH//2 - now_score.get_width()//2, 210))

    best = font_mid.render(f"最高得分：{high_score}", True, GREEN)
    screen.blit(best, (WIDTH//2 - best.get_width()//2, 260))

    restart = font_small.render("按 空格键 重新开始 | ESC退出", True, WHITE)
    screen.blit(restart, (WIDTH//2 - restart.get_width()//2, 340))

# ===================== 主游戏循环 =====================
running = True
while running:
    dt = clock.tick(FPS)
    current_tick = pygame.time.get_ticks()

    # 事件监听
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_ESCAPE:
                running = False
            # 空格切换状态
            if event.key == pygame.K_SPACE:
                if game_state == "menu":
                    game_state = "running"
                    reset_game()
                elif game_state == "gameover":
                    game_state = "running"
                    reset_game()
            # 跳跃按键
            if event.key == pygame.K_UP and game_state == "running" and on_ground:
                player_vel_y = jump_force
                on_ground = False

    # 菜单界面
    if game_state == "menu":
        draw_menu()

    # 游戏运行
    elif game_state == "running":
        screen.fill(SKY_BLUE)
        # 绘制地面
        pygame.draw.rect(screen, GRAY, (0, ground_y, WIDTH, ground_height))

        # 重力演算
        player_vel_y += gravity
        player_y += player_vel_y
        # 落地锁定
        if player_y + player_size >= ground_y:
            player_y = ground_y - player_size
            player_vel_y = 0
            on_ground = True

        # 绘制玩家方块
        pygame.draw.rect(screen, RED, (player_x, player_y, player_size, player_size))

        # 生成障碍物
        if current_tick - spawn_timer > spawn_interval:
            obs_h = random.randint(obstacle_min_h, obstacle_max_h)
            obstacle_list.append([WIDTH, ground_y - obs_h, obstacle_width, obs_h])
            spawn_timer = current_tick
            # 分数越高刷新越快，最低600ms间隔
            spawn_interval = max(600, 1200 - score * 8)

        # 更新障碍物位置
        for obs in obstacle_list[:]:
            obs[0] -= obstacle_speed
            pygame.draw.rect(screen, BLACK, obs)
            # 跑出屏幕销毁+加分
            if obs[0] + obs[2] < 0:
                obstacle_list.remove(obs)
                score += 1

        # 碰撞检测
        player_rect = pygame.Rect(player_x, player_y, player_size, player_size)
        for obs in obstacle_list:
            if player_rect.colliderect(pygame.Rect(obs)):
                game_state = "gameover"
                if score > high_score:
                    high_score = score
                break

        # 绘制分数
        score_text = font_mid.render(f"分数：{score}", True, BLACK)
        screen.blit(score_text, (20, 20))

    # 游戏结束界面
    elif game_state == "gameover":
        draw_game_over()

    pygame.display.update()

pygame.quit()
sys.exit()