import pygame
import random
import math
import sys
from typing import List, Tuple
import time

# 初始化pygame
pygame.init()
pygame.mixer.init()

# 游戏常量
SCREEN_WIDTH, SCREEN_HEIGHT = 1000, 700
FPS = 60
ROAD_WIDTH = 500
LANE_WIDTH = 100
CAR_WIDTH, CAR_HEIGHT = 40, 80
ENEMY_CAR_WIDTH, ENEMY_CAR_HEIGHT = 40, 80
OBSTACLE_WIDTH, OBSTACLE_HEIGHT = 60, 60
COIN_SIZE = 20
FUEL_SIZE = 25
NITRO_SIZE = 30
SHIELD_SIZE = 30

# 颜色定义
COLORS = {
    'BLACK': (0, 0, 0),
    'WHITE': (255, 255, 255),
    'RED': (255, 50, 50),
    'GREEN': (50, 255, 50),
    'BLUE': (0, 100, 255),
    'YELLOW': (255, 255, 0),
    'PURPLE': (180, 0, 180),
    'ORANGE': (255, 150, 0),
    'CYAN': (0, 200, 255),
    'PINK': (255, 100, 180),
    'GRAY': (100, 100, 100),
    'DARK_GRAY': (50, 50, 50),
    'LIGHT_GRAY': (200, 200, 200),
    'ROAD': (40, 40, 40),
    'GRASS': (0, 100, 0),
    'LANE': (200, 200, 0),
    'COIN': (255, 215, 0),
    'FUEL': (255, 0, 0),
    'NITRO': (0, 200, 255),
    'SHIELD': (150, 200, 255)
}

# 获取字体


def get_font(size, bold=False):
    """安全获取字体"""
    try:
        if bold:
            return pygame.font.SysFont("arial", size, bold=True)
        return pygame.font.SysFont("arial", size)
    except:
        return pygame.font.Font(None, size)


# 字体
font_small = get_font(20)
font_medium = get_font(30)
font_large = get_font(50, bold=True)
font_title = get_font(60, bold=True)


class Particle:
    def __init__(self, x, y, color, velocity, lifetime=30):
        self.x = x
        self.y = y
        self.color = color
        self.vx, self.vy = velocity
        self.lifetime = lifetime
        self.size = random.randint(2, 6)

    def update(self):
        self.x += self.vx
        self.y += self.vy
        self.vx *= 0.95
        self.vy *= 0.95
        self.lifetime -= 1
        self.size = max(1, self.size * 0.9)
        return self.lifetime > 0

    def draw(self, screen):
        if self.lifetime > 0:
            alpha = int(255 * (self.lifetime / 30))
            color = (*self.color, alpha) if len(self.color) == 3 else self.color
            size = int(self.size)

            if len(color) == 4:  # RGBA
                temp_surface = pygame.Surface(
                    (size*2, size*2), pygame.SRCALPHA)
                pygame.draw.circle(temp_surface, color, (size, size), size)
                screen.blit(temp_surface, (int(self.x)-size, int(self.y)-size))
            else:  # RGB
                pygame.draw.circle(
                    screen, color, (int(self.x), int(self.y)), size)


class Car:
    def __init__(self, x, y, color, is_player=False):
        self.x = x
        self.y = y
        self.width = CAR_WIDTH
        self.height = CAR_HEIGHT
        self.color = color
        self.speed = 0
        self.max_speed = 8 if is_player else 5
        self.acceleration = 0.2
        self.deceleration = 0.1
        self.turn_speed = 5
        self.direction = 0  # 0=向上，90=向右，180=向下，270=向左
        self.is_player = is_player
        self.health = 100
        self.fuel = 100
        self.score = 0
        self.coins = 0
        self.nitro = 0
        self.shield = 0
        self.nitro_active = False
        self.shield_active = False
        self.drift_angle = 0
        self.skid_marks = []
        self.particles = []
        self.engine_sound = None
        self.crash_sound = None
        self.nitro_sound = None

    def update(self, keys, dt, road_left, road_right):
        if self.is_player:
            # 玩家控制
            acceleration = 0
            turning = 0

            if keys[pygame.K_w] or keys[pygame.K_UP]:
                acceleration = 1
            if keys[pygame.K_s] or keys[pygame.K_DOWN]:
                acceleration = -0.5

            if keys[pygame.K_a] or keys[pygame.K_LEFT]:
                turning = -1
            if keys[pygame.K_d] or keys[pygame.K_RIGHT]:
                turning = 1

            # 使用氮气加速
            if keys[pygame.K_SPACE] and self.nitro > 0 and not self.nitro_active:
                self.nitro_active = True
                self.max_speed = 15
                if self.nitro_sound:
                    self.nitro_sound.play()

            # 氮气效果
            if self.nitro_active:
                self.nitro -= 0.5
                if self.nitro <= 0:
                    self.nitro_active = False
                    self.max_speed = 8
                # 生成氮气粒子
                if random.random() < 0.3:
                    angle = math.radians(self.direction + 180)
                    speed = random.uniform(2, 5)
                    self.particles.append(Particle(
                        self.x + math.cos(angle) * 20,
                        self.y + math.sin(angle) * 20,
                        COLORS['NITRO'],
                        (-math.cos(angle) * speed, -math.sin(angle) * speed),
                        20
                    ))

            # 更新速度
            if acceleration > 0:
                self.speed = min(self.speed + self.acceleration *
                                 acceleration, self.max_speed)
            elif acceleration < 0:
                self.speed = max(
                    self.speed + self.acceleration * acceleration, 0)
            else:
                # 自然减速
                self.speed *= 0.98

            # 转向
            if abs(self.speed) > 0.1:
                self.direction += turning * self.turn_speed * \
                    (self.speed / self.max_speed)
                self.direction %= 360

                # 漂移效果
                if abs(turning) > 0.5 and self.speed > 3:
                    self.drift_angle = turning * 20
                    # 生成轮胎痕迹粒子
                    if random.random() < 0.2:
                        angle = math.radians(self.direction + 90)
                        offset_x = math.cos(angle) * 15
                        offset_y = math.sin(angle) * 15
                        self.skid_marks.append({
                            'x': self.x + offset_x,
                            'y': self.y + offset_y,
                            'lifetime': 100
                        })
                else:
                    self.drift_angle *= 0.9
        else:
            # AI控制 - 简单跟随道路
            self.speed = self.max_speed
            # 随机轻微转向
            if random.random() < 0.1:
                self.direction += random.uniform(-5, 5)

        # 计算移动
        rad = math.radians(self.direction)
        dx = math.cos(rad) * self.speed
        dy = math.sin(rad) * self.speed

        # 应用移动
        new_x = self.x + dx
        new_y = self.y + dy

        # 检查道路边界
        if self.is_player:
            road_buffer = 20
            if road_left + road_buffer <= new_x <= road_right - road_buffer - self.width:
                self.x = new_x
            if new_y > 0 and new_y < SCREEN_HEIGHT - self.height:
                self.y = new_y
        else:
            # AI车辆可以稍微超出边界
            self.x = new_x
            self.y = new_y

        # 更新轮胎痕迹
        for skid in self.skid_marks[:]:
            skid['lifetime'] -= 1
            if skid['lifetime'] <= 0:
                self.skid_marks.remove(skid)

        # 更新粒子
        for particle in self.particles[:]:
            if not particle.update():
                self.particles.remove(particle)

        # 自然消耗燃料
        if self.is_player and self.speed > 0:
            self.fuel -= 0.01 * (self.speed / self.max_speed)
            self.fuel = max(0, self.fuel)

        # 自然恢复生命值
        if self.is_player and self.health < 100 and random.random() < 0.01:
            self.health = min(100, self.health + 1)

    def draw(self, screen):
        # 绘制轮胎痕迹
        for skid in self.skid_marks:
            alpha = int(255 * (skid['lifetime'] / 100))
            pygame.draw.circle(screen, (100, 100, 100, alpha),
                               (int(skid['x']), int(skid['y'])), 5)

        # 绘制粒子
        for particle in self.particles:
            particle.draw(screen)

        # 计算车辆旋转后的位置
        rad = math.radians(self.direction + self.drift_angle)
        cos_a = math.cos(rad)
        sin_a = math.sin(rad)

        # 车辆四个角的坐标
        half_width = self.width / 2
        half_height = self.height / 2

        # 未旋转的四个角
        corners = [
            (-half_width, -half_height),
            (half_width, -half_height),
            (half_width, half_height),
            (-half_width, half_height)
        ]

        # 旋转后的四个角
        rotated_corners = []
        for x, y in corners:
            rx = x * cos_a - y * sin_a
            ry = x * sin_a + y * cos_a
            rotated_corners.append((self.x + rx, self.y + ry))

        # 绘制车辆主体
        pygame.draw.polygon(screen, self.color, rotated_corners)

        # 绘制车窗
        window_color = (min(self.color[0] + 50, 255),
                        min(self.color[1] + 50, 255),
                        min(self.color[2] + 50, 255))
        window_corners = [
            (-half_width * 0.8, -half_height * 0.3),
            (half_width * 0.8, -half_height * 0.3),
            (half_width * 0.8, half_height * 0.2),
            (-half_width * 0.8, half_height * 0.2)
        ]

        rotated_window = []
        for x, y in window_corners:
            rx = x * cos_a - y * sin_a
            ry = x * sin_a + y * cos_a
            rotated_window.append((self.x + rx, self.y + ry))

        pygame.draw.polygon(screen, window_color, rotated_window)

        # 绘制车灯
        if self.is_player and (pygame.time.get_ticks() // 500) % 2 == 0:
            # 前灯
            light_offset = half_height + 5
            front_light_x = self.x + math.cos(rad) * light_offset
            front_light_y = self.y + math.sin(rad) * light_offset

            pygame.draw.circle(screen, (255, 255, 200),
                               (int(front_light_x), int(front_light_y)), 8)

        # 绘制护盾效果
        if self.shield_active:
            shield_radius = max(self.width, self.height) * 0.8
            shield_alpha = int(
                100 + 155 * (math.sin(time.time() * 5) * 0.5 + 0.5))
            shield_surface = pygame.Surface(
                (shield_radius*2, shield_radius*2), pygame.SRCALPHA)
            pygame.draw.circle(shield_surface, (*COLORS['SHIELD'][:3], shield_alpha),
                               (int(shield_radius), int(shield_radius)), int(shield_radius), 3)
            screen.blit(shield_surface, (int(self.x - shield_radius),
                        int(self.y - shield_radius)))

    def get_rect(self):
        """获取车辆的碰撞矩形"""
        return pygame.Rect(self.x - self.width/2, self.y - self.height/2,
                           self.width, self.height)

    def take_damage(self, amount):
        if not self.shield_active:
            self.health = max(0, self.health - amount)
            if self.crash_sound:
                self.crash_sound.play()
            return True
        return False

    def add_fuel(self, amount):
        self.fuel = min(100, self.fuel + amount)

    def add_nitro(self, amount):
        self.nitro = min(100, self.nitro + amount)

    def add_shield(self, duration):
        self.shield_active = True
        self.shield = duration

    def update_shield(self):
        if self.shield_active:
            self.shield -= 1
            if self.shield <= 0:
                self.shield_active = False


class Obstacle:
    def __init__(self, x, y, obstacle_type):
        self.x = x
        self.y = y
        self.type = obstacle_type
        self.width = OBSTACLE_WIDTH
        self.height = OBSTACLE_HEIGHT
        self.collected = False
        self.animation_offset = random.uniform(0, math.pi * 2)
        self.rotation = 0

    def update(self, speed):
        self.y += speed
        self.rotation += 2
        if self.rotation >= 360:
            self.rotation = 0

    def draw(self, screen):
        if self.collected:
            return

        # 漂浮动画
        float_offset = math.sin(time.time() * 2 + self.animation_offset) * 5
        draw_y = self.y + float_offset

        if self.type == 'coin':
            # 绘制金币
            pygame.draw.circle(screen, COLORS['COIN'],
                               (int(self.x), int(draw_y)), COIN_SIZE)
            # 金币光泽
            pygame.draw.circle(screen, (255, 255, 200),
                               (int(self.x - 5), int(draw_y - 5)), COIN_SIZE//3)
        elif self.type == 'fuel':
            # 绘制燃料
            points = [
                (self.x, draw_y - FUEL_SIZE//2),
                (self.x + FUEL_SIZE//2, draw_y + FUEL_SIZE//2),
                (self.x - FUEL_SIZE//2, draw_y + FUEL_SIZE//2)
            ]
            pygame.draw.polygon(screen, COLORS['FUEL'], points)
        elif self.type == 'nitro':
            # 绘制氮气瓶
            pygame.draw.rect(screen, COLORS['NITRO'],
                             (self.x - NITRO_SIZE//2, draw_y - NITRO_SIZE//2,
                              NITRO_SIZE, NITRO_SIZE), border_radius=5)
            pygame.draw.rect(screen, (0, 100, 200),
                             (self.x - NITRO_SIZE//3, draw_y - NITRO_SIZE//2,
                              NITRO_SIZE*2//3, NITRO_SIZE//4), border_radius=3)
        elif self.type == 'shield':
            # 绘制护盾
            shield_surface = pygame.Surface(
                (SHIELD_SIZE*2, SHIELD_SIZE*2), pygame.SRCALPHA)
            pygame.draw.circle(shield_surface, (*COLORS['SHIELD'][:3], 150),
                               (SHIELD_SIZE, SHIELD_SIZE), SHIELD_SIZE, 5)
            screen.blit(shield_surface, (int(self.x - SHIELD_SIZE),
                        int(draw_y - SHIELD_SIZE)))
        elif self.type == 'cone':
            # 绘制交通锥
            pygame.draw.polygon(screen, COLORS['ORANGE'], [
                (self.x, draw_y - self.height//2),
                (self.x + self.width//2, draw_y + self.height//2),
                (self.x - self.width//2, draw_y + self.height//2)
            ])
        elif self.type == 'barrel':
            # 绘制油桶
            pygame.draw.rect(screen, COLORS['RED'],
                             (self.x - self.width//2, draw_y - self.height//2,
                              self.width, self.height), border_radius=10)
            pygame.draw.rect(screen, (100, 0, 0),
                             (self.x - self.width//3, draw_y - self.height//4,
                              self.width*2//3, self.height//2))

    def get_rect(self):
        return pygame.Rect(self.x - self.width//2, self.y - self.height//2,
                           self.width, self.height)


class RoadSegment:
    def __init__(self, y_pos, speed):
        self.y = y_pos
        self.speed = speed
        self.road_color = COLORS['ROAD']
        self.grass_color = COLORS['GRASS']
        self.lane_color = COLORS['LANE']
        self.curve_offset = 0
        self.curve_speed = random.uniform(-0.5, 0.5)

    def update(self):
        self.y += self.speed
        self.curve_offset += self.curve_speed
        if abs(self.curve_offset) > 100:
            self.curve_speed *= -1

    def draw(self, screen, player_x):
        # 绘制草地
        screen.fill(self.grass_color)

        # 计算道路弯曲
        curve_effect = math.sin(self.y / 200) * 20

        # 道路中心相对于玩家的位置
        road_center = SCREEN_WIDTH // 2 + self.curve_offset + curve_effect

        # 绘制道路
        road_left = road_center - ROAD_WIDTH // 2
        road_right = road_center + ROAD_WIDTH // 2

        pygame.draw.rect(screen, self.road_color,
                         (road_left, int(self.y), ROAD_WIDTH, SCREEN_HEIGHT))

        # 绘制车道线
        lane_count = ROAD_WIDTH // LANE_WIDTH
        for i in range(1, lane_count):
            lane_x = road_left + i * LANE_WIDTH
            # 虚线效果
            for segment in range(0, SCREEN_HEIGHT, 40):
                if (segment // 20) % 2 == 0:
                    pygame.draw.rect(screen, self.lane_color,
                                     (lane_x - 2, self.y + segment, 4, 20))

        # 绘制路肩
        pygame.draw.rect(screen, (150, 150, 150),
                         (road_left - 10, int(self.y), 10, SCREEN_HEIGHT))
        pygame.draw.rect(screen, (150, 150, 150),
                         (road_right, int(self.y), 10, SCREEN_HEIGHT))

        return road_left, road_right


class DrivingGame:
    def __init__(self):
        self.screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
        pygame.display.set_caption("极速驾驶")
        self.clock = pygame.time.Clock()

        # 玩家车辆
        self.player = Car(SCREEN_WIDTH // 2, SCREEN_HEIGHT -
                          150, COLORS['BLUE'], True)

        # 敌方车辆
        self.enemy_cars = []
        self.enemy_colors = [COLORS['RED'], COLORS['GREEN'],
                             COLORS['PURPLE'], COLORS['ORANGE']]

        # 障碍物和道具
        self.obstacles = []
        self.obstacle_types = ['coin', 'fuel',
                               'nitro', 'shield', 'cone', 'barrel']

        # 道路
        self.road_speed = 3
        self.road_segments = []
        for i in range(2):
            self.road_segments.append(RoadSegment(
                i * SCREEN_HEIGHT, self.road_speed))

        # 游戏状态
        self.score = 0
        self.level = 1
        self.distance = 0
        self.game_over = False
        self.paused = False
        self.weather = 'clear'  # clear, rain, fog, night
        self.time_of_day = 0  # 0-24小时
        self.day_length = 300  # 游戏秒数
        self.particles = []
        self.explosions = []

        # 生成初始元素
        self._generate_initial_elements()

    def _generate_initial_elements(self):
        """生成初始的车辆和障碍物"""
        # 生成敌方车辆
        for _ in range(3):
            lane = random.randint(0, 4)
            x = SCREEN_WIDTH // 2 - ROAD_WIDTH // 2 + LANE_WIDTH // 2 + lane * LANE_WIDTH
            y = random.randint(-SCREEN_HEIGHT, 0)
            color = random.choice(self.enemy_colors)
            car = Car(x, y, color, False)
            car.speed = random.uniform(2, 4)
            car.direction = 180  # 向下行驶
            self.enemy_cars.append(car)

        # 生成初始障碍物
        for _ in range(10):
            self._spawn_obstacle()

    def _spawn_obstacle(self):
        """生成新的障碍物或道具"""
        lane = random.randint(0, 4)
        road_center = SCREEN_WIDTH // 2
        x = road_center - ROAD_WIDTH // 2 + LANE_WIDTH // 2 + lane * LANE_WIDTH

        # 随机选择类型
        weights = [5, 2, 1, 1, 3, 2]  # coin, fuel, nitro, shield, cone, barrel
        obstacle_type = random.choices(self.obstacle_types, weights=weights)[0]

        y = random.randint(-SCREEN_HEIGHT, -100)
        obstacle = Obstacle(x, y, obstacle_type)
        self.obstacles.append(obstacle)

    def _spawn_enemy_car(self):
        """生成新的敌方车辆"""
        if len(self.enemy_cars) < 5 + self.level:
            lane = random.randint(0, 4)
            road_center = SCREEN_WIDTH // 2
            x = road_center - ROAD_WIDTH // 2 + LANE_WIDTH // 2 + lane * LANE_WIDTH
            y = random.randint(-200, -100)
            color = random.choice(self.enemy_colors)
            car = Car(x, y, color, False)
            car.speed = random.uniform(3, 5 + self.level * 0.5)
            car.direction = 180
            self.enemy_cars.append(car)

    def update(self, dt):
        if self.game_over or self.paused:
            return

        # 更新玩家
        keys = pygame.key.get_pressed()
        self.player.update(keys, dt, 0, SCREEN_WIDTH)  # 临时边界

        # 更新距离和分数
        self.distance += self.player.speed * 0.1
        self.score = int(self.distance)

        # 更新道路
        for segment in self.road_segments:
            segment.update()
            if segment.y > SCREEN_HEIGHT:
                segment.y -= SCREEN_HEIGHT * 2

        # 更新敌方车辆
        for car in self.enemy_cars[:]:
            car.update({}, dt, 0, SCREEN_WIDTH)  # 空的控制字典
            car.y += self.road_speed

            # 检查是否离开屏幕
            if car.y > SCREEN_HEIGHT + 100:
                self.enemy_cars.remove(car)
                self.score += 10
                continue

            # 检查碰撞
            if self.player.get_rect().colliderect(car.get_rect()):
                if self.player.take_damage(20):
                    # 创建爆炸效果
                    self.explosions.append({
                        'x': car.x,
                        'y': car.y,
                        'size': 50,
                        'max_size': 100,
                        'lifetime': 30
                    })
                self.enemy_cars.remove(car)

        # 更新障碍物
        for obstacle in self.obstacles[:]:
            obstacle.update(self.road_speed)

            # 检查是否离开屏幕
            if obstacle.y > SCREEN_HEIGHT + 100:
                self.obstacles.remove(obstacle)
                continue

            # 检查碰撞
            if (not obstacle.collected and
                    self.player.get_rect().colliderect(obstacle.get_rect())):
                obstacle.collected = True

                if obstacle.type == 'coin':
                    self.player.coins += 1
                    self.score += 50
                elif obstacle.type == 'fuel':
                    self.player.add_fuel(30)
                elif obstacle.type == 'nitro':
                    self.player.add_nitro(50)
                elif obstacle.type == 'shield':
                    self.player.add_shield(300)  # 5秒
                elif obstacle.type in ['cone', 'barrel']:
                    if self.player.take_damage(10):
                        self.score -= 20

        # 移除已收集的障碍物
        self.obstacles = [o for o in self.obstacles if not o.collected]

        # 更新护盾
        self.player.update_shield()

        # 更新粒子
        for particle in self.particles[:]:
            if not particle.update():
                self.particles.remove(particle)

        # 更新爆炸效果
        for explosion in self.explosions[:]:
            explosion['size'] += 2
            explosion['lifetime'] -= 1
            if explosion['lifetime'] <= 0:
                self.explosions.remove(explosion)

        # 随机生成新元素
        if random.random() < 0.02:
            self._spawn_obstacle()
        if random.random() < 0.01:
            self._spawn_enemy_car()

        # 检查游戏结束条件
        if self.player.health <= 0 or self.player.fuel <= 0:
            self.game_over = True

        # 更新等级
        self.level = 1 + self.score // 1000
        self.road_speed = 3 + self.level * 0.5

        # 更新时间
        self.time_of_day = (self.time_of_day + 0.1) % 24

        # 生成环境粒子
        if self.weather == 'rain' and random.random() < 0.3:
            self.particles.append(Particle(
                random.randint(0, SCREEN_WIDTH),
                0,
                (100, 100, 255),
                (0, random.uniform(5, 10)),
                30
            ))

    def handle_input(self, keys):
        """处理输入"""
        if keys[pygame.K_p]:
            self.paused = not self.paused
        if keys[pygame.K_r] and self.game_over:
            self.__init__()  # 重置游戏

    def draw(self):
        """绘制游戏"""
        # 根据时间绘制天空
        if 6 <= self.time_of_day < 18:  # 白天
            sky_color = (135, 206, 235)  # 天蓝色
        elif 18 <= self.time_of_day < 20:  # 黄昏
            t = (self.time_of_day - 18) / 2
            sky_color = (
                int(135 + 120 * t),
                int(206 * (1 - t)),
                int(235 * (1 - t))
            )
        elif 20 <= self.time_of_day or self.time_of_day < 6:  # 夜晚
            if self.time_of_day >= 20:
                t = (self.time_of_day - 20) / 4
            else:
                t = (self.time_of_day + 4) / 4
            darken = min(t, 1)
            sky_color = (
                int(20 + 115 * (1 - darken)),
                int(20 + 186 * (1 - darken)),
                int(40 + 195 * (1 - darken))
            )

        self.screen.fill(sky_color)

        # 绘制道路
        current_road = self.road_segments[0]
        road_left, road_right = current_road.draw(self.screen, self.player.x)

        # 绘制障碍物
        for obstacle in self.obstacles:
            obstacle.draw(self.screen)

        # 绘制敌方车辆
        for car in self.enemy_cars:
            car.draw(self.screen)

        # 绘制玩家车辆
        self.player.draw(self.screen)

        # 绘制爆炸效果
        for explosion in self.explosions:
            alpha = int(255 * (explosion['lifetime'] / 30))
            size = explosion['size']
            pygame.draw.circle(self.screen, (255, 100, 0, alpha),
                               (int(explosion['x']), int(explosion['y'])), size)
            pygame.draw.circle(self.screen, (255, 200, 0, alpha),
                               (int(explosion['x']), int(explosion['y'])), size//2)

        # 绘制粒子
        for particle in self.particles:
            particle.draw(self.screen)

        # 绘制UI
        self.draw_ui(road_left, road_right)

        # 绘制游戏结束画面
        if self.game_over:
            self.draw_game_over()

        # 绘制暂停画面
        if self.paused:
            self.draw_pause_screen()

        pygame.display.flip()

    def draw_ui(self, road_left, road_right):
        """绘制用户界面"""
        # 绘制半透明面板
        panel_height = 100
        panel = pygame.Surface((SCREEN_WIDTH, panel_height), pygame.SRCALPHA)
        panel.fill((0, 0, 0, 150))
        self.screen.blit(panel, (0, 0))

        # 分数
        score_text = font_medium.render(
            f"分数: {self.score}", True, COLORS['WHITE'])
        self.screen.blit(score_text, (20, 20))

        # 等级
        level_text = font_medium.render(
            f"等级: {self.level}", True, COLORS['WHITE'])
        self.screen.blit(level_text, (200, 20))

        # 金币
        coin_text = font_medium.render(
            f"金币: {self.player.coins}", True, COLORS['COIN'])
        self.screen.blit(coin_text, (350, 20))

        # 距离
        distance_text = font_medium.render(
            f"距离: {int(self.distance)}m", True, COLORS['WHITE'])
        self.screen.blit(distance_text, (500, 20))

        # 生命值条
        health_bar_width = 200
        health_bar_height = 20
        health_x = 20
        health_y = 60

        # 背景
        pygame.draw.rect(self.screen, COLORS['DARK_GRAY'],
                         (health_x, health_y, health_bar_width, health_bar_height))
        # 生命值
        health_width = health_bar_width * (self.player.health / 100)
        health_color = (
            int(255 * (1 - self.player.health/100)),
            int(255 * (self.player.health/100)),
            0
        )
        pygame.draw.rect(self.screen, health_color,
                         (health_x, health_y, health_width, health_bar_height))
        # 边框
        pygame.draw.rect(self.screen, COLORS['WHITE'],
                         (health_x, health_y, health_bar_width, health_bar_height), 2)

        # 燃料条
        fuel_bar_width = 200
        fuel_bar_height = 20
        fuel_x = 250
        fuel_y = 60

        pygame.draw.rect(self.screen, COLORS['DARK_GRAY'],
                         (fuel_x, fuel_y, fuel_bar_width, fuel_bar_height))
        fuel_width = fuel_bar_width * (self.player.fuel / 100)
        pygame.draw.rect(self.screen, COLORS['FUEL'],
                         (fuel_x, fuel_y, fuel_width, fuel_bar_height))
        pygame.draw.rect(self.screen, COLORS['WHITE'],
                         (fuel_x, fuel_y, fuel_bar_width, fuel_bar_height), 2)

        # 氮气条
        nitro_bar_width = 200
        nitro_bar_height = 20
        nitro_x = 480
        nitro_y = 60

        pygame.draw.rect(self.screen, COLORS['DARK_GRAY'],
                         (nitro_x, nitro_y, nitro_bar_width, nitro_bar_height))
        nitro_width = nitro_bar_width * (self.player.nitro / 100)
        pygame.draw.rect(self.screen, COLORS['NITRO'],
                         (nitro_x, nitro_y, nitro_width, nitro_bar_height))
        pygame.draw.rect(self.screen, COLORS['WHITE'],
                         (nitro_x, nitro_y, nitro_bar_width, nitro_bar_height), 2)

        # 速度显示
        speed = int(self.player.speed * 20)  # 转换为km/h
        speed_text = font_large.render(f"{speed} km/h", True, COLORS['WHITE'])
        self.screen.blit(speed_text, (SCREEN_WIDTH - 200, 20))

        # 控制说明
        controls = [
            "W/S: 加速/刹车  A/D: 转向  SPACE: 氮气加速  P: 暂停  R: 重新开始"
        ]

        for i, text in enumerate(controls):
            control_text = font_small.render(text, True, COLORS['YELLOW'])
            self.screen.blit(control_text, (20, SCREEN_HEIGHT - 30))

    def draw_game_over(self):
        """绘制游戏结束画面"""
        overlay = pygame.Surface(
            (SCREEN_WIDTH, SCREEN_HEIGHT), pygame.SRCALPHA)
        overlay.fill((0, 0, 0, 200))
        self.screen.blit(overlay, (0, 0))

        # 游戏结束文本
        game_over_text = font_large.render("游戏结束", True, COLORS['RED'])
        self.screen.blit(game_over_text,
                         (SCREEN_WIDTH//2 - game_over_text.get_width()//2,
                          SCREEN_HEIGHT//2 - 100))

        # 最终分数
        score_text = font_medium.render(
            f"最终分数: {self.score}", True, COLORS['YELLOW'])
        self.screen.blit(score_text,
                         (SCREEN_WIDTH//2 - score_text.get_width()//2,
                          SCREEN_HEIGHT//2 - 30))

        # 行驶距离
        distance_text = font_medium.render(
            f"行驶距离: {int(self.distance)}m", True, COLORS['YELLOW'])
        self.screen.blit(distance_text,
                         (SCREEN_WIDTH//2 - distance_text.get_width()//2,
                          SCREEN_HEIGHT//2))

        # 收集金币
        coin_text = font_medium.render(
            f"收集金币: {self.player.coins}", True, COLORS['YELLOW'])
        self.screen.blit(coin_text,
                         (SCREEN_WIDTH//2 - coin_text.get_width()//2,
                          SCREEN_HEIGHT//2 + 30))

        # 重新开始提示
        restart_text = font_medium.render(
            "按R键重新开始，ESC键退出", True, COLORS['WHITE'])
        self.screen.blit(restart_text,
                         (SCREEN_WIDTH//2 - restart_text.get_width()//2,
                          SCREEN_HEIGHT//2 + 100))

    def draw_pause_screen(self):
        """绘制暂停画面"""
        overlay = pygame.Surface(
            (SCREEN_WIDTH, SCREEN_HEIGHT), pygame.SRCALPHA)
        overlay.fill((0, 0, 0, 150))
        self.screen.blit(overlay, (0, 0))

        paused_text = font_large.render("游戏暂停", True, COLORS['YELLOW'])
        self.screen.blit(paused_text,
                         (SCREEN_WIDTH//2 - paused_text.get_width()//2,
                          SCREEN_HEIGHT//2 - 50))

        continue_text = font_medium.render("按P键继续游戏", True, COLORS['WHITE'])
        self.screen.blit(continue_text,
                         (SCREEN_WIDTH//2 - continue_text.get_width()//2,
                          SCREEN_HEIGHT//2 + 20))


def main():
    game = DrivingGame()
    running = True

    while running:
        dt = game.clock.tick(FPS) / 1000.0  # 转换为秒

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False
            elif event.type == pygame.KEYDOWN:
                if event.key == pygame.K_ESCAPE:
                    running = False

        keys = pygame.key.get_pressed()
        game.handle_input(keys)

        if not game.paused:
            game.update(dt)

        game.draw()

    pygame.quit()
    sys.exit()


if __name__ == "__main__":
    main()
