import pygame
import random
import sys

# ===================== 初始化设置 =====================
pygame.init()
WIDTH, HEIGHT = 900, 500
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("跑酷")
clock = pygame.time.Clock()
FPS = 60

# 古风水墨配色
COLOR_BG = (245, 242, 235)      # 宣纸底色
COLOR_CHAR = (60, 50, 40)       # 墨黑人物
COLOR_OBSTACLE = (110, 80, 50)  # 山石障碍物
COLOR_TEXT = (30, 30, 30)
COLOR_GROUND = (130, 110, 90)

# 玩家参数
player_width = 40
player_height = 70
player_x = 120
player_y = HEIGHT - player_height - 80
vel_y = 0
gravity = 1.2
jump_power = -22
is_jump = False

# 障碍物
obstacle_list = []
obstacle_speed = 7
spawn_timer = 0
spawn_interval = 1200

# 分数 【修复字体：使用默认字体，规避sysfont崩溃bug】
try:
    font = pygame.font.SysFont(None, 32)
except:
    font = pygame.font.Font(None, 32)

# ===================== 游戏函数 =====================

def draw_player(x, y):
    """绘制古风侠客，带明显斗笠帽"""

    pygame.draw.circle(screen, (220, 190, 160), (x + player_width // 2, y + 18), 14)
    
    # 身体
    pygame.draw.rect(screen, COLOR_CHAR, (x, y + 30, player_width, player_height - 30))
    
    # 长剑
    pygame.draw.rect(screen, (200, 180, 140), (x + player_width, y + 35, 6, 45))


def create_obstacle():
    """生成山石障碍物"""
    w = random.randint(35, 65)
    h = random.randint(45, 80)
    x = WIDTH
    y = HEIGHT - h - 80
    return [x, y, w, h]

def draw_obstacle(obs):
    x, y, w, h = obs
    pygame.draw.rect(screen, COLOR_OBSTACLE, (x, y, w, h))
    # 山石纹理线条
    pygame.draw.line(screen, (70, 55, 40), (x+5, y+10), (x+w-8, y+h-10), 2)

def check_collision(px, py, pw, ph, obs):
    ox, oy, ow, oh = obs
    rect1 = pygame.Rect(px, py, pw, ph)
    rect2 = pygame.Rect(ox, oy, ow, oh)
    return rect1.colliderect(rect2)

# ===================== 主循环 =====================
running = True
game_over = False
score = 0

while running:
    dt = clock.tick(FPS)
    screen.fill(COLOR_BG)
    # 地面
    pygame.draw.rect(screen, COLOR_GROUND, (0, HEIGHT-80, WIDTH, 80))

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        if event.type == pygame.KEYDOWN:
            if game_over:
                # 重新开始
                game_over = False
                player_y = HEIGHT - player_height - 80
                vel_y = 0
                obstacle_list.clear()
                score = 0
                obstacle_speed = 7
            else:
                if event.key == pygame.K_SPACE and not is_jump:
                    vel_y = jump_power
                    is_jump = True

    if not game_over:
        # 重力
        vel_y += gravity
        player_y += vel_y
        ground_y = HEIGHT - player_height - 80
        if player_y >= ground_y:
            player_y = ground_y
            vel_y = 0
            is_jump = False

        # 生成障碍物
        spawn_timer += dt
        if spawn_timer > spawn_interval:
            obstacle_list.append(create_obstacle())
            spawn_timer = 0
            # 随分数加快速度
            obstacle_speed += 0.015

        # 更新障碍物
        for obs in obstacle_list[:]:
            obs[0] -= obstacle_speed
            if obs[0] + obs[2] < 0:
                obstacle_list.remove(obs)
                score += 1

        # 碰撞检测
        for obs in obstacle_list:
            if check_collision(player_x, player_y, player_width, player_height, obs):
                game_over = True

        # 绘制所有元素
        draw_player(player_x, player_y)
        for o in obstacle_list:
            draw_obstacle(o)

        # 分数文字
        score_text = font.render(f"得分：{score}", True, COLOR_TEXT)
        screen.blit(score_text, (20, 20))
    else:
        # 游戏结束界面
        over_text = font.render("游戏结束！按空格重新开始", True, (180, 20, 20))
        screen.blit(over_text, (WIDTH//2 - 220, HEIGHT//2))
        final_score = font.render(f"最终得分：{score}", True, COLOR_TEXT)
        screen.blit(final_score, (WIDTH//2 - 100, HEIGHT//2 + 50))

    pygame.display.flip()

pygame.quit()
sys.exit()