import pygame
import random
import sys

# 初始化
pygame.init()

# 窗口
WIDTH, HEIGHT = 600, 700
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("2D赛车")
clock = pygame.time.Clock()
FPS = 60

# 颜色
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
GRAY = (60, 60, 60)
ROAD_LINE = (220, 220, 220)
PLAYER_CAR = (0, 150, 255)
ENEMY_CAR = (220, 30, 30)
UI_BG = (20, 20, 20)
NITRO_FULL = (0, 255, 120)
NITRO_EMPTY = (80, 80, 80)
RED = (255,50,50)

# 赛道
road_w = 400
road_x = (WIDTH - road_w) // 2
lane_num = 4
lane_w = road_w // lane_num

# -------------------------- 赛道 --------------------------
class Road:
    def __init__(self):
        self.line_y1 = 0
        self.line_y2 = -HEIGHT
        self.base_speed = 5
        self.speed = self.base_speed

    def update(self):
        self.line_y1 += self.speed
        self.line_y2 += self.speed
        if self.line_y1 >= HEIGHT:
            self.line_y1 = -HEIGHT
        if self.line_y2 >= HEIGHT:
            self.line_y2 = -HEIGHT

    def draw(self):
        pygame.draw.rect(screen, GRAY, (road_x, 0, road_w, HEIGHT))
        for i in range(1, lane_num):
            x = road_x + i * lane_w
            pygame.draw.rect(screen, ROAD_LINE, (x - 3, self.line_y1, 6, 40))
            pygame.draw.rect(screen, ROAD_LINE, (x - 3, self.line_y2, 6, 40))

# -------------------------- 玩家 --------------------------
class PlayerCar(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.w, self.h = 40, 70
        self.image = pygame.Surface((self.w, self.h))
        self.image.fill(PLAYER_CAR)
        self.rect = self.image.get_rect()
        self.rect.centerx = road_x + road_w // 2
        self.rect.bottom = HEIGHT - 30
        self.move_speed = 7
        self.is_nitro = False
        self.nitro_power = 100

    def update(self):
        if self.is_nitro and self.nitro_power > 0:
            self.nitro_power -= 0.8
        else:
            self.is_nitro = False

        keys = pygame.key.get_pressed()
        if keys[pygame.K_LEFT] and self.rect.left > road_x:
            self.rect.x -= self.move_speed
        if keys[pygame.K_RIGHT] and self.rect.right < road_x + road_w:
            self.rect.x += self.move_speed
        if keys[pygame.K_SPACE] and self.nitro_power > 0:
            self.is_nitro = True

        if not self.is_nitro and self.nitro_power < 100:
            self.nitro_power += 0.3

# -------------------------- 敌人 --------------------------
class EnemyCar(pygame.sprite.Sprite):
    def __init__(self, road_speed):
        super().__init__()
        self.w, self.h = 40, 70
        self.image = pygame.Surface((self.w, self.h))
        self.image.fill(ENEMY_CAR)
        self.rect = self.image.get_rect()
        lane_x = road_x + random.randint(0, lane_num - 1) * lane_w + lane_w // 2
        self.rect.centerx = lane_x
        self.rect.y = random.randint(-120, -60)
        self.speed = road_speed + random.randint(1, 4)

    def update(self):
        self.rect.y += self.speed
        if self.rect.top > HEIGHT:
            self.kill()

# -------------------------- 纯图形UI（无任何字体） --------------------------
def draw_ui(score, nitro_val, game_over):
    # 右侧面板
    pygame.draw.rect(screen, UI_BG, (road_x + road_w, 0, WIDTH - road_x - road_w, HEIGHT))
    
    # 分数条
    pygame.draw.rect(screen, WHITE, (road_x+road_w+10, 20, 100, 10))
    bar = min(100, score // 10)
    pygame.draw.rect(screen, NITRO_FULL, (road_x+road_w+10, 20, bar, 10))
    
    # 氮气条
    pygame.draw.rect(screen, NITRO_EMPTY, (road_x+road_w+10, 50, 100, 15))
    fill = int(nitro_val)
    pygame.draw.rect(screen, NITRO_FULL, (road_x+road_w+10, 50, fill, 15))

    # 游戏结束：红色全屏方块
    if game_over:
        pygame.draw.rect(screen, RED, (100, 250, 400, 150))

# -------------------------- 游戏初始化 --------------------------
road = Road()
player = PlayerCar()
all_sprites = pygame.sprite.Group(player)
enemy_group = pygame.sprite.Group()

SPAWN_ENEMY = pygame.USEREVENT + 1
pygame.time.set_timer(SPAWN_ENEMY, 1200)

score = 0
game_over = False

# -------------------------- 主循环 --------------------------
while True:
    clock.tick(FPS)

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
        if event.type == SPAWN_ENEMY and not game_over:
            enemy = EnemyCar(road.speed)
            all_sprites.add(enemy)
            enemy_group.add(enemy)
        if event.type == pygame.KEYDOWN and game_over:
            if event.key == pygame.K_r:
                game_over = False
                score = 0
                road.speed = road.base_speed
                enemy_group.empty()
                all_sprites.empty()
                player = PlayerCar()
                all_sprites.add(player)

    if not game_over:
        road.speed = road.base_speed + score // 80
        road.update()
        all_sprites.update()
        if pygame.sprite.spritecollide(player, enemy_group, True):
            game_over = True
        score += 1

    # 绘制
    screen.fill(BLACK)
    road.draw()
    all_sprites.draw(screen)
    draw_ui(score, player.nitro_power, game_over)

    pygame.display.flip()