import pygame
import random
import sys

# --- 初始化 Pygame ---
pygame.init()

# --- 常量定义 ---
SCREEN_WIDTH = 800
SCREEN_HEIGHT = 400
FPS = 60

# 颜色定义 (R, G, B)
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
BLUE = (50, 150, 255)   # 玩家颜色
RED = (255, 50, 50)     # 障碍物颜色
GROUND_COLOR = (50, 50, 50)

# 物理参数
GRAVITY = 0.8
JUMP_STRENGTH = -16
GAME_SPEED = 6
OBSTACLE_SPAWN_RATE = 90  # 帧数间隔，越小生成越快

# 设置屏幕
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
pygame.display.set_caption("Pygame 简易跑酷")
clock = pygame.time.Clock()
font = pygame.font.SysFont("Arial", 36)

class Player:
    def __init__(self):
        self.width = 40
        self.height = 60
        self.x = 100
        self.y = SCREEN_HEIGHT - self.height
        self.vel_y = 0
        self.is_jumping = False
        self.rect = pygame.Rect(self.x, self.y, self.width, self.height)

    def jump(self):
        if not self.is_jumping:
            self.vel_y = JUMP_STRENGTH
            self.is_jumping = True

    def update(self):
        # 应用重力
        self.vel_y += GRAVITY
        self.y += self.vel_y

        # 地面碰撞检测
        ground_level = SCREEN_HEIGHT - self.height
        if self.y >= ground_level:
            self.y = ground_level
            self.vel_y = 0
            self.is_jumping = False

        # 更新矩形位置用于碰撞检测
        self.rect.y = int(self.y)

    def draw(self, surface):
        pygame.draw.rect(surface, BLUE, self.rect)

class Obstacle:
    def __init__(self):
        self.width = 30
        self.height = random.randint(30, 70) # 随机高度
        self.x = SCREEN_WIDTH
        self.y = SCREEN_HEIGHT - self.height
        self.speed = GAME_SPEED
        self.rect = pygame.Rect(self.x, self.y, self.width, self.height)
        self.marked_for_deletion = False

    def update(self):
        self.x -= self.speed
        self.rect.x = int(self.x)
        
        # 如果移出屏幕左侧，标记删除
        if self.x + self.width < 0:
            self.marked_for_deletion = True

    def draw(self, surface):
        pygame.draw.rect(surface, RED, self.rect)

def main():
    player = Player()
    obstacles = []
    score = 0
    frame_count = 0
    game_over = False

    running = True
    while running:
        clock.tick(FPS)
        
        # 1. 事件处理
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False
            
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_SPACE:
                    if game_over:
                        # 重置游戏
                        player = Player()
                        obstacles = []
                        score = 0
                        frame_count = 0
                        game_over = False
                    else:
                        player.jump()

        if not game_over:
            # 2. 游戏逻辑更新
            
            # 生成障碍物
            frame_count += 1
            if frame_count % OBSTACLE_SPAWN_RATE == 0:
                obstacles.append(Obstacle())
                # 稍微增加难度：随分数增加，生成频率略微加快（可选）
                # if score > 500: spawn_rate = 80 ...

            # 更新玩家
            player.update()

            # 更新障碍物
            for obs in obstacles[:]:
                obs.update()
                if obs.marked_for_deletion:
                    obstacles.remove(obs)
                
                # 碰撞检测
                if player.rect.colliderect(obs.rect):
                    game_over = True

            # 增加分数
            score += 1

        # 3. 绘图渲染
        screen.fill(WHITE) # 背景色

        # 画地面
        pygame.draw.line(screen, GROUND_COLOR, (0, SCREEN_HEIGHT), (SCREEN_WIDTH, SCREEN_HEIGHT), 2)

        # 画玩家和障碍物
        player.draw(screen)
        for obs in obstacles:
            obs.draw(screen)

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

        # 游戏结束提示
        if game_over:
            over_text = font.render("GAME OVER! Press SPACE to restart", True, RED)
            text_rect = over_text.get_rect(center=(SCREEN_WIDTH/2, SCREEN_HEIGHT/2))
            screen.blit(over_text, text_rect)

        pygame.display.flip()

    pygame.quit()
    sys.exit()

if __name__ == "__main__":
    main()