import pygame
import random
import sys

# 初始化Pygame
pygame.init()

# 窗口基础配置
SCREEN_WIDTH = 800
SCREEN_HEIGHT = 400
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
pygame.display.set_caption("像素跑酷小游戏")

# 配色常量
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 140, 255)
DARK_GRAY = (60, 60, 60)
GROUND_COLOR = (40, 40, 40)

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

# 玩家角色类
class RunnerPlayer:
    def __init__(self):
        self.width = 40
        self.height = 60
        self.x = 100
        self.y = SCREEN_HEIGHT - self.height - 50
        self.velocity_y = 0
        self.jump_strength = -18
        self.gravity = 0.8
        self.is_grounded = True
        self.rect = pygame.Rect(self.x, self.y, self.width, self.height)

    def physics_update(self):
        # 重力持续施加
        self.velocity_y += self.gravity
        self.y += self.velocity_y
        # 地面边界限制
        ground_limit = SCREEN_HEIGHT - self.height - 50
        if self.y >= ground_limit:
            self.y = ground_limit
            self.velocity_y = 0
            self.is_grounded = True
        else:
            self.is_grounded = False
        self.rect.topleft = (self.x, self.y)

    def jump_action(self):
        if self.is_grounded:
            self.velocity_y = self.jump_strength

    def draw_self(self):
        # 绘制身体+眼睛
        pygame.draw.rect(screen, BLUE, self.rect, border_radius=6)
        pygame.draw.circle(screen, WHITE, (self.x + 20, self.y + 20), 8)

# 障碍物类
class Barrier:
    def __init__(self, move_speed):
        self.width = 32
        self.height = random.randint(45, 85)
        self.x = SCREEN_WIDTH
        self.y = SCREEN_HEIGHT - self.height - 50
        self.move_speed = move_speed
        self.rect = pygame.Rect(self.x, self.y, self.width, self.height)

    def update_pos(self):
        self.x -= self.move_speed
        self.rect.topleft = (self.x, self.y)

    def draw_self(self):
        pygame.draw.rect(screen, RED, self.rect, border_radius=4)

# 文字渲染工具
def render_text(content, font_size, color, pos_x, pos_y):
    font = pygame.font.SysFont("simhei", font_size)
    text_surface = font.render(content, True, color)
    screen.blit(text_surface, (pos_x, pos_y))

# 游戏主逻辑
def game_loop():
    player = RunnerPlayer()
    obstacle_list = []
    current_score = 0
    base_speed = 6.0
    spawn_cooldown = 0
    game_over_flag = False
    game_start_flag = False

    while True:
        # 背景填充
        screen.fill(DARK_GRAY)
        # 绘制地面
        pygame.draw.rect(screen, GROUND_COLOR, (0, SCREEN_HEIGHT - 50, SCREEN_WIDTH, 50))

        # 事件监听
        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:
                    if not game_start_flag:
                        game_start_flag = True
                    elif game_over_flag:
                        game_loop()
                    else:
                        player.jump_action()

        # 开局欢迎界面
        if not game_start_flag:
            render_text("像素跑酷游戏", 65, WHITE, SCREEN_WIDTH//2 - 210, 110)
            render_text("空格键开始游戏", 38, WHITE, SCREEN_WIDTH//2 - 150, 190)
            render_text("空格跳跃，躲避红色障碍物", 30, WHITE, SCREEN_WIDTH//2 - 175, 240)
            pygame.display.flip()
            clock.tick(FPS)
            continue

        # 游戏结束界面
        if game_over_flag:
            render_text(f"游戏结束 最终得分：{current_score}", 52, RED, SCREEN_WIDTH//2 - 230, 120)
            render_text("按空格键重新游玩", 36, WHITE, SCREEN_WIDTH//2 - 160, 200)
            pygame.display.flip()
            clock.tick(FPS)
            continue

        # 玩家物理更新与绘制
        player.physics_update()
        player.draw_self()

        # 障碍物生成计时器
        spawn_cooldown += 1
        # 分数越高，障碍物生成越快
        min_spawn_gap = max(30, 90 - current_score // 4)
        if spawn_cooldown >= min_spawn_gap:
            obstacle_list.append(Barrier(base_speed))
            spawn_cooldown = 0

        # 障碍物遍历更新
        for obs in obstacle_list[:]:
            obs.update_pos()
            obs.draw_self()
            # 跑出屏幕销毁+加分
            if obs.x + obs.width < 0:
                obstacle_list.remove(obs)
                current_score += 1
                # 每5分小幅提速
                if current_score % 5 == 0:
                    base_speed += 0.35
            # 碰撞判定触发结束
            if player.rect.colliderect(obs.rect):
                game_over_flag = True

        # HUD信息显示
        render_text(f"得分：{current_score}", 34, WHITE, 15, 15)
        render_text(f"当前速度：{base_speed:.1f}", 34, WHITE, 15, 55)

        pygame.display.flip()
        clock.tick(FPS)

# 程序入口
if __name__ == "__main__":
    game_loop()