import pygame
import random

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

# 玩家参数
player_x = 100
player_y = 300
player_width = 40
player_height = 60
player_vel_y = 0
gravity = 1
jump_power = -18
is_jumping = False

ground_y = 350

# 障碍物
obstacles = []
obstacle_width = 30
obstacle_height = 50
obstacle_speed = 7
spawn_timer = 0
spawn_interval = 1500

score = 0
font = pygame.font.SysFont(None, 48)
game_over = False

def draw_player(x, y):
    pygame.draw.rect(screen, GREEN, (x, y, player_width, player_height))

def draw_obstacle(obs):
    pygame.draw.rect(screen, RED, obs)

# 游戏主循环
running = True
last_spawn = pygame.time.get_ticks()

while running:
    clock.tick(FPS)
    now = pygame.time.get_ticks()
    screen.fill(SKY_BLUE)
    # 绘制地面
    pygame.draw.rect(screen, (80, 60, 40), (0, ground_y, WIDTH, HEIGHT-ground_y))

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        if event.type == pygame.KEYDOWN:
            if game_over:
                # 按空格重启游戏
                if event.key == pygame.K_SPACE:
                    # 重置所有数据
                    player_y = 300
                    player_vel_y = 0
                    is_jumping = False
                    obstacles.clear()
                    score = 0
                    obstacle_speed = 7
                    game_over = False
            else:
                # 跳跃
                if event.key == pygame.K_SPACE and not is_jumping:
                    player_vel_y = jump_power
                    is_jumping = True

    if not game_over:
        # 玩家重力
        player_vel_y += gravity
        player_y += player_vel_y
        # 落地检测
        if player_y >= ground_y - player_height:
            player_y = ground_y - player_height
            player_vel_y = 0
            is_jumping = False

        # 生成障碍物
        if now - last_spawn > spawn_interval:
            obs_x = WIDTH
            obs_y = ground_y - obstacle_height
            obstacles.append(pygame.Rect(obs_x, obs_y, obstacle_width, obstacle_height))
            last_spawn = now
            spawn_interval = max(800, spawn_interval - 10) # 越来越快

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

        # 碰撞检测
        player_rect = pygame.Rect(player_x, player_y, player_width, player_height)
        for obs in obstacles:
            if player_rect.colliderect(obs):
                game_over = True

    # 绘制物体
    draw_player(player_x, player_y)
    for obs in obstacles:
        draw_obstacle(obs)

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

    if game_over:
        over_text = font.render("游戏结束!空格重启", True, RED)
        screen.blit(over_text, (WIDTH//2-220, HEIGHT//2))

    pygame.display.update()

pygame.quit()
