import pygame
import random

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

# --- 常量设置 ---
WIDTH, HEIGHT = 800, 600
FPS = 60

# 颜色 (科技霓虹风)
COLOR_BG = (10, 10, 15)           # 深空灰
COLOR_PLAYER = (0, 255, 255)      # 霓虹青
COLOR_OBSTACLE = (255, 50, 50)    # 霓虹红
COLOR_GROUND = (50, 50, 80)       # 地面
COLOR_GRID = (30, 30, 40)         # 背景网格

screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("霓虹极速跑酷")
clock = pygame.time.Clock()
font = pygame.font.Font(None, 48)

# --- 玩家类 ---
class Player:
    def __init__(self):
        self.size = 40
        self.x = 100
        self.y = HEIGHT - 150
        self.vel_y = 0
        self.jump_power = -15
        self.gravity = 0.8
        self.grounded = False

    def jump(self):
        if self.grounded:
            self.vel_y = self.jump_power
            self.grounded = False

    def move(self):
        # 应用重力
        self.vel_y += self.gravity
        self.y += self.vel_y

        # 地面检测
        if self.y >= HEIGHT - self.size - 50:
            self.y = HEIGHT - self.size - 50
            self.vel_y = 0
            self.grounded = True

    def draw(self):
        # 绘制玩家
        pygame.draw.rect(screen, COLOR_PLAYER, (self.x, self.y, self.size, self.size))
        # 内部核心
        pygame.draw.rect(screen, (255, 255, 255), (self.x + 10, self.y + 10, self.size - 20, self.size - 20))

# --- 障碍物类 ---
class Obstacle:
    def __init__(self, speed):
        self.width = random.randint(30, 60)
        self.height = random.randint(40, 80)
        self.x = WIDTH + random.randint(0, 200) # 在屏幕右侧生成
        self.y = HEIGHT - self.height - 50
        self.speed = speed
        self.passed = False # 是否已经通过玩家

    def update(self):
        self.x -= self.speed

    def draw(self):
        pygame.draw.rect(screen, COLOR_OBSTACLE, (self.x, self.y, self.width, self.height))
        # 科技感线条
        pygame.draw.line(screen, (255, 255, 255), (self.x, self.y), (self.x + self.width, self.y + self.height), 2)

    def is_off_screen(self):
        return self.x + self.width < -100

# --- 游戏主循环 ---
def main():
    player = Player()
    obstacles = []
    score = 0
    game_speed = 7
    spawn_timer = 0
    
    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 or event.key == pygame.K_UP:
                    player.jump()

        # 2. 游戏逻辑更新
        player.move()

        # 生成障碍物
        spawn_timer += 1
        # 随机生成间隔，随着速度增加，间隔变短
        if spawn_timer > random.randint(60, 150) - (score // 50):
            obstacles.append(Obstacle(game_speed))
            spawn_timer = 0

        # 更新障碍物
        for obs in obstacles:
            obs.update()
            
            # 碰撞检测 (简单的矩形碰撞)
            player_rect = pygame.Rect(player.x, player.y, player.size, player.size)
            obs_rect = pygame.Rect(obs.x, obs.y, obs.width, obs.height)
            
            if player_rect.colliderect(obs_rect):
                print(f"游戏结束! 最终得分: {score}")
                running = False # 撞到游戏结束

            # 计分
            if not obs.passed and obs.x + obs.width < player.x:
                score += 1
                obs.passed = True
                # 每得10分加速
                if score % 10 == 0:
                    game_speed += 0.5

        # 移除屏幕外的障碍物
        if obstacles and obstacles[0].is_off_screen():
            obstacles.pop(0)

        # 3. 画面渲染
        screen.fill(COLOR_BG)
        
        # 绘制动态网格背景 (制造向前移动的错觉)
        grid_offset = (score * 5) % 40
        for x in range(0, WIDTH, 40):
            pygame.draw.line(screen, COLOR_GRID, (x - grid_offset, 0), (x - grid_offset, HEIGHT))
        for y in range(0, HEIGHT, 40):
            pygame.draw.line(screen, COLOR_GRID, (0, y), (WIDTH, y))

        # 绘制地面
        pygame.draw.rect(screen, COLOR_GROUND, (0, HEIGHT - 50, WIDTH, 50))
        pygame.draw.line(screen, COLOR_PLAYER, (0, HEIGHT - 50), (WIDTH, HEIGHT - 50), 2)

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

        # 绘制分数
        score_text = font.render(f"Score: {score}", True, COLOR_PLAYER)
        speed_text = font.render(f"Speed: {game_speed:.1f}", True, COLOR_OBSTACLE)
        screen.blit(score_text, (20, 20))
        screen.blit(speed_text, (20, 60))

        pygame.display.flip()

    # 游戏结束画面
    screen.fill(COLOR_BG)
    over_text = font.render("GAME OVER", True, COLOR_OBSTACLE)
    final_score = font.render(f"Final Score: {score}", True, COLOR_PLAYER)
    screen.blit(over_text, (WIDTH//2 - 100, HEIGHT//2 - 40))
    screen.blit(final_score, (WIDTH//2 - 100, HEIGHT//2 + 20))
    pygame.display.flip()
    
    pygame.time.delay(3000)
    pygame.quit()

if __name__ == "__main__":
    main()