import pygame
import sys
import random
import time
from enum import Enum
import math

# 初始化Pygame
pygame.init()

# -------------------------- 常量定义 --------------------------
SCREEN_WIDTH = 900
SCREEN_HEIGHT = 600
FPS = 60
ROAD_WIDTH = 400
LANE_WIDTH = 100

# 颜色定义（赛车风格高级配色）
COLORS = {
    "bg": (17, 24, 39),          # 深色背景
    "road": (31, 41, 55),        # 赛道底色
    "road_line": (243, 244, 246),# 赛道标线
    "player_car": (234, 179, 8), # 黄色玩家车辆
    "enemy_car": (239, 68, 68),  # 红色敌方车辆
    "coin": (251, 191, 36),      # 金色金币
    "nitro": (59, 130, 246),     # 蓝色氮气道具
    "shield": (16, 185, 129),    # 绿色护盾道具
    "magnet": (217, 70, 239),    # 紫色磁铁道具
    "text": (243, 244, 246),     # 白色文字
    "highlight": (236, 72, 153), # 粉色高亮
    "shield_effect": (16, 185, 129, 100),  # 半透明护盾
    "health": (239, 68, 68),     # 红色血条
    "time_warning": (249, 115, 22), # 黄色时间警告
}

# 道具类型枚举
class PropType(Enum):
    NITRO = 1      # 氮气加速
    SHIELD = 2     # 护盾（无敌）
    MAGNET = 3     # 磁铁（吸金币）
    COIN = 4       # 金币（加分）
    HEALTH = 5     # 生命值道具

# 游戏结束类型
class GameOverType(Enum):
    WIN = 1        # 通关
    FAIL_COLLISION = 2  # 碰撞失败
    FAIL_TIMEOUT = 3    # 超时失败

# -------------------------- 游戏类 --------------------------
class RacingGame:
    def __init__(self):
        self.screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
        pygame.display.set_caption("高级驾驶闯关游戏 | 完整关卡版")
        self.clock = pygame.time.Clock()
        self.font_large = pygame.font.Font(None, 50)
        self.font_medium = pygame.font.Font(None, 35)
        self.font_small = pygame.font.Font(None, 25)
        
        # 游戏状态
        self.game_state = "start"  # start:开始, game:游戏中, over:关卡结束, select:关卡选择
        self.current_level = 1
        self.max_level = 3        # 可扩展更多关卡
        self.unlocked_levels = 1  # 解锁的关卡数
        self.game_over_type = None  # 关卡结束类型
        
        # 玩家车辆属性
        self.player_x = SCREEN_WIDTH // 2
        self.player_y = SCREEN_HEIGHT - 120
        self.player_speed = 0
        self.max_speed = 15
        self.acceleration = 0.5
        self.deceleration = 0.3
        self.steer_speed = 8
        self.player_size = (60, 100)
        
        # 关卡核心配置（新增）
        self.level_config = {
            1: {"distance": 5000, "time_limit": 180, "health": 3, "enemy_rate": 200, "prop_rate": 150, "base_enemy_speed": 5},
            2: {"distance": 8000, "time_limit": 240, "health": 2, "enemy_rate": 150, "prop_rate": 120, "base_enemy_speed": 7},
            3: {"distance": 12000, "time_limit": 300, "health": 2, "enemy_rate": 100, "prop_rate": 100, "base_enemy_speed": 9}
        }
        
        # 游戏元素
        self.enemies = []         # 敌方车辆: [(x, y, speed), ...]
        self.props = []           # 道具: [(x, y, type), ...]
        self.road_lines = []      # 赛道标线
        
        # 道具效果
        self.prop_effects = {
            "nitro": False, "shield": False, "magnet": False,
            "nitro_time": 0, "shield_time": 0, "magnet_time": 0
        }
        
        # 游戏数据（强化）
        self.start_time = 0
        self.game_time = 0
        self.remaining_time = 0
        self.score = 0
        self.distance = 0         # 行驶距离
        self.coin_count = 0       # 收集金币数
        self.health = 3           # 生命值
        self.collision_count = 0  # 碰撞次数
        
        # 初始化
        self.init_road_lines()
        self.load_level(self.current_level)

    def init_road_lines(self):
        """初始化赛道标线"""
        self.road_lines = []
        for i in range(0, SCREEN_HEIGHT + 100, 80):
            self.road_lines.append(i)

    def load_level(self, level):
        """加载指定关卡（重置所有状态）"""
        # 重置玩家状态
        self.player_x = SCREEN_WIDTH // 2
        self.player_y = SCREEN_HEIGHT - 120
        self.player_speed = 0
        
        # 重置游戏元素
        self.enemies = []
        self.props = []
        
        # 重置道具效果
        self.prop_effects = {
            "nitro": False, "shield": False, "magnet": False,
            "nitro_time": 0, "shield_time": 0, "magnet_time": 0
        }
        
        # 重置关卡数据
        config = self.level_config[level]
        self.health = config["health"]
        self.collision_count = 0
        self.coin_count = 0
        self.score = 0
        self.distance = 0
        self.start_time = time.time()
        self.remaining_time = config["time_limit"]
        self.game_over_type = None
        
        # 关卡难度参数
        self.enemy_spawn_rate = config["enemy_rate"]
        self.prop_spawn_rate = config["prop_rate"]
        self.base_enemy_speed = config["base_enemy_speed"]
        self.target_distance = config["distance"]
        self.time_limit = config["time_limit"]

    def spawn_enemies(self):
        """生成敌方车辆"""
        if random.randint(1, self.enemy_spawn_rate) == 1:
            # 随机车道（避免生成在玩家正前方）
            lanes = [
                SCREEN_WIDTH//2 - ROAD_WIDTH//2 + LANE_WIDTH//2,
                SCREEN_WIDTH//2 - LANE_WIDTH//2,
                SCREEN_WIDTH//2 + ROAD_WIDTH//2 - LANE_WIDTH//2
            ]
            # 避免和玩家同车道
            player_lane = round((self.player_x - (SCREEN_WIDTH-ROAD_WIDTH)//2) / LANE_WIDTH)
            if player_lane >= 0 and player_lane < len(lanes):
                lanes.pop(player_lane)
            
            if lanes:
                x = random.choice(lanes)
                y = -100
                speed = self.base_enemy_speed + random.uniform(0, 3)
                self.enemies.append([x, y, speed])

    def spawn_props(self):
        """生成道具和金币（新增生命值道具）"""
        if random.randint(1, self.prop_spawn_rate) == 1:
            lanes = [
                SCREEN_WIDTH//2 - ROAD_WIDTH//2 + LANE_WIDTH//2,
                SCREEN_WIDTH//2 - LANE_WIDTH//2,
                SCREEN_WIDTH//2 + ROAD_WIDTH//2 - LANE_WIDTH//2
            ]
            x = random.choice(lanes)
            y = -100
            
            # 调整道具概率（新增生命值）
            prop_type = random.choices(
                [PropType.NITRO, PropType.SHIELD, PropType.MAGNET, PropType.COIN, PropType.HEALTH],
                weights=[0.12, 0.12, 0.08, 0.65, 0.03],  # 生命值概率低
                k=1
            )[0]
            
            self.props.append([x, y, prop_type])

    def draw_road(self):
        """绘制赛道"""
        # 赛道背景
        road_rect = pygame.Rect((SCREEN_WIDTH - ROAD_WIDTH) // 2, 0, ROAD_WIDTH, SCREEN_HEIGHT)
        pygame.draw.rect(self.screen, COLORS["road"], road_rect)
        
        # 赛道边界
        pygame.draw.rect(self.screen, COLORS["road_line"], road_rect, 5)
        
        # 赛道中线（动态滚动）
        center_line_y = [y - self.distance % 80 for y in self.road_lines]
        for y in center_line_y:
            pygame.draw.rect(self.screen, COLORS["road_line"], (SCREEN_WIDTH//2 - 2, y, 4, 40))
        
        # 车道分隔线
        lane1_x = SCREEN_WIDTH//2 - LANE_WIDTH
        lane2_x = SCREEN_WIDTH//2 + LANE_WIDTH
        pygame.draw.line(self.screen, COLORS["road_line"], (lane1_x, 0), (lane1_x, SCREEN_HEIGHT), 2)
        pygame.draw.line(self.screen, COLORS["road_line"], (lane2_x, 0), (lane2_x, SCREEN_HEIGHT), 2)

    def draw_player_car(self):
        """绘制玩家车辆"""
        # 车辆主体
        car_rect = pygame.Rect(
            self.player_x - self.player_size[0]//2,
            self.player_y - self.player_size[1]//2,
            self.player_size[0],
            self.player_size[1]
        )
        
        # 绘制车辆
        pygame.draw.rect(self.screen, COLORS["player_car"], car_rect, border_radius=8)
        pygame.draw.rect(self.screen, (255, 255, 255), car_rect, 2)
        
        # 车轮
        wheel_radius = 8
        wheels = [
            (car_rect.left + 15, car_rect.top + 15),
            (car_rect.right - 15, car_rect.top + 15),
            (car_rect.left + 15, car_rect.bottom - 15),
            (car_rect.right - 15, car_rect.bottom - 15)
        ]
        for wheel in wheels:
            pygame.draw.circle(self.screen, (0, 0, 0), wheel, wheel_radius)
            pygame.draw.circle(self.screen, (50, 50, 50), wheel, wheel_radius - 2)
        
        # 护盾效果
        if self.prop_effects["shield"]:
            shield_surface = pygame.Surface((car_rect.width + 20, car_rect.height + 20), pygame.SRCALPHA)
            pygame.draw.ellipse(shield_surface, COLORS["shield_effect"], (0, 0, car_rect.width + 20, car_rect.height + 20))
            self.screen.blit(shield_surface, (car_rect.left - 10, car_rect.top - 10))

    def draw_enemies(self):
        """绘制敌方车辆"""
        for enemy in self.enemies:
            x, y, speed = enemy
            enemy_rect = pygame.Rect(
                x - self.player_size[0]//2 + 5,
                y - self.player_size[1]//2 + 5,
                self.player_size[0] - 10,
                self.player_size[1] - 10
            )
            
            # 绘制敌方车辆
            pygame.draw.rect(self.screen, COLORS["enemy_car"], enemy_rect, border_radius=6)
            pygame.draw.rect(self.screen, (255, 255, 255), enemy_rect, 2)
            
            # 车轮
            wheel_radius = 6
            wheels = [
                (enemy_rect.left + 10, enemy_rect.top + 10),
                (enemy_rect.right - 10, enemy_rect.top + 10),
                (enemy_rect.left + 10, enemy_rect.bottom - 10),
                (enemy_rect.right - 10, enemy_rect.bottom - 10)
            ]
            for wheel in wheels:
                pygame.draw.circle(self.screen, (0, 0, 0), wheel, wheel_radius)

    def draw_props(self):
        """绘制道具和金币（新增生命值道具）"""
        for prop in self.props:
            x, y, prop_type = prop
            
            if prop_type == PropType.COIN:
                # 金币
                pygame.draw.circle(self.screen, COLORS["coin"], (x, y), 15)
                pygame.draw.circle(self.screen, (255, 215, 0), (x, y), 12)
                pygame.draw.line(self.screen, (255, 255, 255), (x-8, y), (x+8, y), 2)
                pygame.draw.line(self.screen, (255, 255, 255), (x, y-8), (x, y+8), 2)
            
            elif prop_type == PropType.NITRO:
                # 氮气道具
                nitro_rect = pygame.Rect(x-12, y-12, 24, 24)
                pygame.draw.rect(self.screen, COLORS["nitro"], nitro_rect, border_radius=4)
                pygame.draw.polygon(self.screen, COLORS["text"], [(x-8, y+5), (x+8, y+5), (x, y-8)])
            
            elif prop_type == PropType.SHIELD:
                # 护盾道具
                pygame.draw.circle(self.screen, COLORS["shield"], (x, y), 15)
                pygame.draw.circle(self.screen, COLORS["text"], (x, y), 12, 2)
            
            elif prop_type == PropType.MAGNET:
                # 磁铁道具
                magnet_surface = pygame.Surface((30, 30), pygame.SRCALPHA)
                pygame.draw.polygon(magnet_surface, COLORS["magnet"], [(15, 5), (5, 15), (15, 25), (25, 15)])
                self.screen.blit(magnet_surface, (x-15, y-15))
            
            elif prop_type == PropType.HEALTH:
                # 生命值道具
                pygame.draw.polygon(self.screen, COLORS["health"], [(x, y-10), (x+8, y+5), (x-8, y+5)])
                pygame.draw.polygon(self.screen, COLORS["text"], [(x, y-8), (x+6, y+3), (x-6, y+3)], 2)

    def draw_ui(self):
        """绘制游戏UI（新增生命值、倒计时）"""
        # 背景半透明面板
        ui_panel = pygame.Surface((SCREEN_WIDTH, 80), pygame.SRCALPHA)
        ui_panel.fill((0, 0, 0, 180))
        self.screen.blit(ui_panel, (0, 0))
        
        # 关卡信息
        level_text = self.font_medium.render(f"关卡: {self.current_level}", True, COLORS["text"])
        self.screen.blit(level_text, (20, 20))
        
        # 距离和进度
        distance_text = self.font_medium.render(f"距离: {int(self.distance)}m", True, COLORS["text"])
        self.screen.blit(distance_text, (20, 50))
        
        # 通关进度条
        progress = min(self.distance / self.target_distance, 1.0)
        progress_rect = pygame.Rect(SCREEN_WIDTH//2 - 200, 20, 400, 20)
        pygame.draw.rect(self.screen, (75, 85, 99), progress_rect, border_radius=10)
        pygame.draw.rect(self.screen, COLORS["player_car"], (SCREEN_WIDTH//2 - 200, 20, 400*progress, 20), border_radius=10)
        progress_text = self.font_small.render(f"进度: {int(progress*100)}%", True, COLORS["text"])
        self.screen.blit(progress_text, (SCREEN_WIDTH//2 - 40, 45))
        
        # 金币和得分
        coin_text = self.font_medium.render(f"金币: {self.coin_count}", True, COLORS["coin"])
        self.screen.blit(coin_text, (SCREEN_WIDTH - 350, 20))
        
        score_text = self.font_medium.render(f"得分: {self.score}", True, COLORS["text"])
        self.screen.blit(score_text, (SCREEN_WIDTH - 350, 50))
        
        # 生命值显示
        health_text = self.font_medium.render(f"生命: ", True, COLORS["text"])
        self.screen.blit(health_text, (SCREEN_WIDTH - 180, 20))
        # 绘制心形生命值
        for i in range(self.health):
            heart_x = SCREEN_WIDTH - 110 + i * 30
            pygame.draw.polygon(self.screen, COLORS["health"], [
                (heart_x, 25), (heart_x+8, 17), (heart_x+16, 25),
                (heart_x+16, 35), (heart_x+8, 43), (heart_x, 35)
            ])
        
        # 倒计时（剩余时间<30秒变红）
        time_color = COLORS["time_warning"] if self.remaining_time < 30 else COLORS["text"]
        time_text = self.font_medium.render(f"剩余时间: {int(self.remaining_time)}s", True, time_color)
        self.screen.blit(time_text, (SCREEN_WIDTH - 180, 50))
        
        # 道具效果提示
        effect_texts = []
        if self.prop_effects["nitro"]:
            effect_texts.append(f"氮气加速! ({int(self.prop_effects['nitro_time'])}s)")
        if self.prop_effects["shield"]:
            effect_texts.append(f"护盾! ({int(self.prop_effects['shield_time'])}s)")
        if self.prop_effects["magnet"]:
            effect_texts.append(f"磁铁! ({int(self.prop_effects['magnet_time'])}s)")
        
        for i, text in enumerate(effect_texts):
            effect_surface = self.font_small.render(text, True, COLORS["highlight"])
            self.screen.blit(effect_surface, (SCREEN_WIDTH//2 - 100, SCREEN_HEIGHT - 60 + i*25))
        
        # 指法指引
        guide_text = self.font_small.render(
            "←→ 转向 | ↑ 加速 | ↓ 减速 | 空格 氮气",
            True,
            COLORS["highlight"]
        )
        self.screen.blit(guide_text, (SCREEN_WIDTH//2 - 200, SCREEN_HEIGHT - 30))

    def draw_start_screen(self):
        """绘制开始界面"""
        self.screen.fill(COLORS["bg"])
        
        # 赛车背景
        car_bg_x = SCREEN_WIDTH//2 - 100
        car_bg_y = SCREEN_HEIGHT//2 - 150
        car_bg_rect = pygame.Rect(car_bg_x, car_bg_y, 200, 150)
        pygame.draw.rect(self.screen, COLORS["player_car"], car_bg_rect, border_radius=15)
        pygame.draw.rect(self.screen, COLORS["text"], car_bg_rect, 3)
        
        # 标题
        title_text = self.font_large.render("高级驾驶闯关游戏", True, COLORS["highlight"])
        self.screen.blit(title_text, title_text.get_rect(center=(SCREEN_WIDTH//2, SCREEN_HEIGHT//2 - 80)))
        
        # 开始按钮
        start_rect = pygame.Rect(SCREEN_WIDTH//2 - 100, SCREEN_HEIGHT//2, 200, 60)
        pygame.draw.rect(self.screen, COLORS["player_car"], start_rect, border_radius=10)
        start_text = self.font_medium.render("开始游戏", True, COLORS["bg"])
        self.screen.blit(start_text, start_text.get_rect(center=start_rect.center))
        
        # 关卡选择按钮
        select_rect = pygame.Rect(SCREEN_WIDTH//2 - 100, SCREEN_HEIGHT//2 + 80, 200, 60)
        pygame.draw.rect(self.screen, COLORS["nitro"], select_rect, border_radius=10)
        select_text = self.font_medium.render("关卡选择", True, COLORS["text"])
        self.screen.blit(select_text, select_text.get_rect(center=select_rect.center))
        
        # 提示文字
        hint_text = self.font_small.render("收集道具获得特殊能力，注意碰撞和时间限制!", True, COLORS["text"])
        self.screen.blit(hint_text, hint_text.get_rect(center=(SCREEN_WIDTH//2, SCREEN_HEIGHT - 50)))
        
        return start_rect, select_rect

    def draw_level_select(self):
        """绘制关卡选择界面"""
        self.screen.fill(COLORS["bg"])
        
        # 标题
        title_text = self.font_large.render("选择关卡", True, COLORS["highlight"])
        self.screen.blit(title_text, title_text.get_rect(center=(SCREEN_WIDTH//2, 80)))
        
        # 关卡按钮
        level_rects = []
        for i in range(1, self.max_level + 1):
            x = SCREEN_WIDTH//2 + (i - (self.max_level + 1)//2) * 150
            y = SCREEN_HEIGHT//2
            rect = pygame.Rect(x - 60, y, 120, 120)
            
            # 解锁/锁定样式
            if i <= self.unlocked_levels:
                pygame.draw.rect(self.screen, COLORS["player_car"], rect, border_radius=15)
                level_text = self.font_large.render(str(i), True, COLORS["bg"])
                
                # 关卡难度提示
                if i == 1:
                    diff_text = self.font_small.render("简单", True, COLORS["bg"])
                elif i == 2:
                    diff_text = self.font_small.render("中等", True, COLORS["bg"])
                else:
                    diff_text = self.font_small.render("困难", True, COLORS["bg"])
                self.screen.blit(diff_text, diff_text.get_rect(center=(x, y + 70)))
            else:
                pygame.draw.rect(self.screen, (107, 114, 128), rect, border_radius=15)
                level_text = self.font_large.render("🔒", True, COLORS["text"])
            
            self.screen.blit(level_text, level_text.get_rect(center=(x, y - 10)))
            level_rects.append(rect)
        
        # 返回按钮
        back_rect = pygame.Rect(50, SCREEN_HEIGHT - 80, 120, 50)
        pygame.draw.rect(self.screen, (107, 114, 128), back_rect, border_radius=10)
        back_text = self.font_medium.render("返回", True, COLORS["text"])
        self.screen.blit(back_text, back_text.get_rect(center=back_rect.center))
        
        return level_rects, back_rect

    def draw_game_over_screen(self):
        """绘制关卡结束界面（通关/失败）"""
        self.screen.fill(COLORS["bg"])
        
        # 半透明遮罩
        mask = pygame.Surface((SCREEN_WIDTH, SCREEN_HEIGHT), pygame.SRCALPHA)
        mask.fill((0, 0, 0, 200))
        self.screen.blit(mask, (0, 0))
        
        # 结束标题
        if self.game_over_type == GameOverType.WIN:
            title_text = self.font_large.render(f"🎉 恭喜通关! 关卡 {self.current_level} 🎉", True, COLORS["shield"])
        elif self.game_over_type == GameOverType.FAIL_COLLISION:
            title_text = self.font_large.render(f"❌ 碰撞次数过多! 关卡失败 ❌", True, COLORS["health"])
        elif self.game_over_type == GameOverType.FAIL_TIMEOUT:
            title_text = self.font_large.render(f"❌ 时间耗尽! 关卡失败 ❌", True, COLORS["health"])
        
        self.screen.blit(title_text, title_text.get_rect(center=(SCREEN_WIDTH//2, SCREEN_HEIGHT//2 - 150)))
        
        # 详细数据
        stats_y = SCREEN_HEIGHT//2 - 70
        time_text = self.font_medium.render(f"总用时: {int(self.game_time)}秒", True, COLORS["text"])
        self.screen.blit(time_text, (SCREEN_WIDTH//2 - 100, stats_y))
        
        distance_text = self.font_medium.render(f"行驶距离: {int(self.distance)}m", True, COLORS["text"])
        self.screen.blit(distance_text, (SCREEN_WIDTH//2 - 100, stats_y + 40))
        
        coin_text = self.font_medium.render(f"收集金币: {self.coin_count}个", True, COLORS["coin"])
        self.screen.blit(coin_text, (SCREEN_WIDTH//2 - 100, stats_y + 80))
        
        score_text = self.font_medium.render(f"最终得分: {self.score}", True, COLORS["highlight"])
        self.screen.blit(score_text, (SCREEN_WIDTH//2 - 100, stats_y + 120))
        
        # 按钮区域
        btn_y = SCREEN_HEIGHT//2 + 80
        
        # 重试按钮
        retry_rect = pygame.Rect(SCREEN_WIDTH//2 - 220, btn_y, 100, 60)
        pygame.draw.rect(self.screen, COLORS["player_car"], retry_rect, border_radius=10)
        retry_text = self.font_medium.render("重试", True, COLORS["bg"])
        self.screen.blit(retry_text, retry_text.get_rect(center=retry_rect.center))
        
        # 下一关/主菜单按钮
        if self.game_over_type == GameOverType.WIN and self.current_level < self.max_level:
            next_rect = pygame.Rect(SCREEN_WIDTH//2 - 60, btn_y, 100, 60)
            pygame.draw.rect(self.screen, COLORS["shield"], next_rect, border_radius=10)
            next_text = self.font_medium.render("下一关", True, COLORS["bg"])
            self.screen.blit(next_text, next_text.get_rect(center=next_rect.center))
            
            menu_rect = pygame.Rect(SCREEN_WIDTH//2 + 100, btn_y, 100, 60)
        else:
            menu_rect = pygame.Rect(SCREEN_WIDTH//2 - 60, btn_y, 100, 60)
        
        # 主菜单按钮
        pygame.draw.rect(self.screen, COLORS["nitro"], menu_rect, border_radius=10)
        menu_text = self.font_medium.render("主菜单", True, COLORS["text"])
        self.screen.blit(menu_text, menu_text.get_rect(center=menu_rect.center))
        
        # 关卡选择按钮
        select_rect = pygame.Rect(SCREEN_WIDTH//2 + 100, btn_y, 120, 60) if self.game_over_type == GameOverType.WIN else None
        if select_rect:
            pygame.draw.rect(self.screen, (107, 114, 128), select_rect, border_radius=10)
            select_text = self.font_medium.render("关卡选择", True, COLORS["text"])
            self.screen.blit(select_text, select_text.get_rect(center=select_rect.center))
        
        return retry_rect, menu_rect, select_rect if self.game_over_type == GameOverType.WIN else None

    def handle_input(self):
        """处理玩家输入（新增重试/下一关逻辑）"""
        keys = pygame.key.get_pressed()
        
        # 游戏中输入
        if self.game_state == "game":
            # 转向控制
            if keys[pygame.K_LEFT]:
                self.player_x = max((SCREEN_WIDTH - ROAD_WIDTH) // 2 + self.player_size[0]//2, self.player_x - self.steer_speed)
            if keys[pygame.K_RIGHT]:
                self.player_x = min((SCREEN_WIDTH + ROAD_WIDTH) // 2 - self.player_size[0]//2, self.player_x + self.steer_speed)
            
            # 加速/减速
            if keys[pygame.K_UP]:
                # 氮气加速效果
                if keys[pygame.K_SPACE] and self.prop_effects["nitro"]:
                    self.player_speed = min(self.player_speed + self.acceleration * 2, self.max_speed * 1.8)
                else:
                    self.player_speed = min(self.player_speed + self.acceleration, self.max_speed)
            elif keys[pygame.K_DOWN]:
                self.player_speed = max(self.player_speed - self.deceleration * 2, 0)
            else:
                # 自然减速
                self.player_speed = max(self.player_speed - self.deceleration / 2, 0)
        
        # 事件处理
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()
            
            # 鼠标点击
            if event.type == pygame.MOUSEBUTTONDOWN:
                mouse_pos = pygame.mouse.get_pos()
                
                # 开始界面
                if self.game_state == "start":
                    start_rect, select_rect = self.draw_start_screen()
                    if start_rect.collidepoint(mouse_pos):
                        self.game_state = "game"
                        self.load_level(self.current_level)
                    elif select_rect.collidepoint(mouse_pos):
                        self.game_state = "select"
                
                # 关卡选择
                elif self.game_state == "select":
                    level_rects, back_rect = self.draw_level_select()
                    for i, rect in enumerate(level_rects):
                        if rect.collidepoint(mouse_pos) and (i+1) <= self.unlocked_levels:
                            self.current_level = i+1
                            self.game_state = "game"
                            self.load_level(self.current_level)
                            break
                    if back_rect.collidepoint(mouse_pos):
                        self.game_state = "start"
                
                # 关卡结束界面
                elif self.game_state == "over":
                    retry_rect, menu_rect, select_rect = self.draw_game_over_screen()
                    
                    # 重试按钮
                    if retry_rect.collidepoint(mouse_pos):
                        self.game_state = "game"
                        self.load_level(self.current_level)
                    
                    # 主菜单按钮
                    if menu_rect.collidepoint(mouse_pos):
                        self.game_state = "start"
                    
                    # 关卡选择按钮（仅通关）
                    if select_rect and select_rect.collidepoint(mouse_pos):
                        self.game_state = "select"
                    
                    # 下一关按钮（仅通关且有下一关）
                    if self.game_over_type == GameOverType.WIN and self.current_level < self.max_level:
                        next_rect = pygame.Rect(SCREEN_WIDTH//2 - 60, SCREEN_HEIGHT//2 + 80, 100, 60)
                        if next_rect.collidepoint(mouse_pos):
                            self.current_level += 1
                            self.unlocked_levels = max(self.unlocked_levels, self.current_level)
                            self.game_state = "game"
                            self.load_level(self.current_level)

    def update_game_elements(self):
        """更新游戏元素（新增倒计时）"""
        # 更新基础数据
        self.distance += self.player_speed
        self.game_time = time.time() - self.start_time
        self.remaining_time = max(self.time_limit - self.game_time, 0)
        
        # 更新敌方车辆
        for enemy in self.enemies[:]:
            enemy[1] += enemy[2] + self.player_speed / 3
            if enemy[1] > SCREEN_HEIGHT + 100:
                self.enemies.remove(enemy)
        
        # 更新道具
        for prop in self.props[:]:
            # 磁铁效果：道具向玩家移动
            if self.prop_effects["magnet"]:
                dx = self.player_x - prop[0]
                dy = self.player_y - prop[1]
                distance = math.hypot(dx, dy)
                if distance > 0:
                    prop[0] += dx / distance * 8
                    prop[1] += dy / distance * 8
            else:
                prop[1] += self.base_enemy_speed + self.player_speed / 3
            
            if prop[1] > SCREEN_HEIGHT + 100:
                self.props.remove(prop)
        
        # 更新道具效果时间
        if self.prop_effects["nitro"]:
            self.prop_effects["nitro_time"] -= 1/FPS
            if self.prop_effects["nitro_time"] <= 0:
                self.prop_effects["nitro"] = False
        
        if self.prop_effects["shield"]:
            self.prop_effects["shield_time"] -= 1/FPS
            if self.prop_effects["shield_time"] <= 0:
                self.prop_effects["shield"] = False
        
        if self.prop_effects["magnet"]:
            self.prop_effects["magnet_time"] -= 1/FPS
            if self.prop_effects["magnet_time"] <= 0:
                self.prop_effects["magnet"] = False

    def check_collisions(self):
        """检查碰撞（新增生命值扣减）"""
        # 玩家碰撞盒
        player_rect = pygame.Rect(
            self.player_x - self.player_size[0]//2,
            self.player_y - self.player_size[1]//2,
            self.player_size[0],
            self.player_size[1]
        )
        
        # 敌方车辆碰撞
        for enemy in self.enemies[:]:
            enemy_rect = pygame.Rect(
                enemy[0] - self.player_size[0]//2 + 5,
                enemy[1] - self.player_size[1]//2 + 5,
                self.player_size[0] - 10,
                self.player_size[1] - 10
            )
            
            if player_rect.colliderect(enemy_rect):
                if not self.prop_effects["shield"]:
                    # 扣生命值
                    self.health -= 1
                    self.collision_count += 1
                    self.score -= 50
                    self.player_speed = max(self.player_speed - 5, 0)
                    
                    # 生命值为0则关卡失败
                    if self.health <= 0:
                        self.game_over_type = GameOverType.FAIL_COLLISION
                        self.game_state = "over"
                else:
                    # 护盾生效，移除敌方车辆
                    self.enemies.remove(enemy)
        
        # 道具碰撞
        for prop in self.props[:]:
            prop_rect = pygame.Rect(prop[0] - 20, prop[1] - 20, 40, 40)
            
            if player_rect.colliderect(prop_rect):
                prop_type = prop[2]
                
                # 金币
                if prop_type == PropType.COIN:
                    self.coin_count += 1
                    self.score += 10
                
                # 氮气加速
                elif prop_type == PropType.NITRO:
                    self.prop_effects["nitro"] = True
                    self.prop_effects["nitro_time"] = 5
                    self.score += 50
                
                # 护盾
                elif prop_type == PropType.SHIELD:
                    self.prop_effects["shield"] = True
                    self.prop_effects["shield_time"] = 8
                    self.score += 50
                
                # 磁铁
                elif prop_type == PropType.MAGNET:
                    self.prop_effects["magnet"] = True
                    self.prop_effects["magnet_time"] = 10
                    self.score += 50
                
                # 生命值道具
                elif prop_type == PropType.HEALTH:
                    self.health = min(self.health + 1, self.level_config[self.current_level]["health"])
                    self.score += 80
                
                # 移除已收集的道具
                self.props.remove(prop)

    def check_level_end(self):
        """检查关卡是否结束（核心升级）"""
        # 通关条件：达到目标距离
        if self.distance >= self.target_distance:
            self.game_over_type = GameOverType.WIN
            self.game_state = "over"
            # 通关加分（时间越短加分越多）
            self.score += int(2000 / max(self.game_time, 1))
            self.score += self.coin_count * 20
            # 解锁下一关
            if self.current_level >= self.unlocked_levels:
                self.unlocked_levels = min(self.current_level + 1, self.max_level)
        
        # 超时条件：剩余时间为0
        elif self.remaining_time <= 0:
            self.game_over_type = GameOverType.FAIL_TIMEOUT
            self.game_state = "over"

    def run(self):
        """游戏主循环"""
        while True:
            # 处理输入
            self.handle_input()
            
            if self.game_state == "game":
                # 生成游戏元素
                self.spawn_enemies()
                self.spawn_props()
                
                # 更新游戏状态
                self.update_game_elements()
                self.check_collisions()
                self.check_level_end()
                
                # 绘制游戏内容
                self.draw_road()
                self.draw_enemies()
                self.draw_props()
                self.draw_player_car()
                self.draw_ui()
            
            elif self.game_state == "start":
                self.draw_start_screen()
            
            elif self.game_state == "select":
                self.draw_level_select()
            
            elif self.game_state == "over":
                self.draw_game_over_screen()
            
            # 更新屏幕
            pygame.display.flip()
            self.clock.tick(FPS)

# -------------------------- 运行游戏 --------------------------
if __name__ == "__main__":
    # 安装依赖（如果未安装）
    try:
        import pygame
    except ImportError:
        import os
        os.system("pip install pygame")
        import pygame
    
    game = RacingGame()
    game.run()