import pygame
import random
import sys

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

# 常量
WIDTH, HEIGHT = 400, 600
FPS = 60
ROAD_LEFT = 50
ROAD_RIGHT = 350
LANE_WIDTH = 75

# 颜色
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
GRAY = (80, 80, 80)
GREEN = (34, 139, 34)
RED = (220, 20, 20)
BLUE = (30, 120, 200)
YELLOW = (255, 215, 0)
DARK_GRAY = (40, 40, 40)

screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("🚗 极速驾驶")
clock = pygame.time.Clock()

# 字体
font_big = pygame.font.SysFont("simhei", 48)
font_mid = pygame.font.SysFont("simhei", 32)
font_small = pygame.font.SysFont("simhei", 22)


class PlayerCar:
    """玩家车辆"""
    def __init__(self):
        self.width = 40
        self.height = 70
        self.x = WIDTH // 2 - self.width // 2
        self.y = HEIGHT - 100
        self.speed = 6
        self.color = RED

    def draw(self):
        # 车身
        pygame.draw.rect(screen, self.color, (self.x, self.y, self.width, self.height), border_radius=8)
        # 车窗
        pygame.draw.rect(screen, DARK_GRAY, (self.x + 4, self.y + 10, self.width - 8, 18), border_radius=3)
        pygame.draw.rect(screen, DARK_GRAY, (self.x + 4, self.y + 42, self.width - 8, 18), border_radius=3)
        # 车灯
        pygame.draw.circle(screen, YELLOW, (self.x + 8, self.y + self.height), 5)
        pygame.draw.circle(screen, YELLOW, (self.x + self.width - 8, self.y + self.height), 5)

    def move(self, keys):
        if keys[pygame.K_LEFT] and self.x > ROAD_LEFT:
            self.x -= self.speed
        if keys[pygame.K_RIGHT] and self.x + self.width < ROAD_RIGHT:
            self.x += self.speed

    def get_rect(self):
        return pygame.Rect(self.x, self.y, self.width, self.height)


class ObstacleCar:
    """障碍物车辆"""
    COLORS = [BLUE, (0, 150, 0), (150, 0, 150), (255, 140, 0)]

    def __init__(self, speed):
        self.width = 40
        self.height = 70
        lane_positions = [ROAD_LEFT + 15, ROAD_LEFT + 90, ROAD_LEFT + 165]
        self.x = random.choice(lane_positions)
        self.y = -self.height
        self.speed = speed
        self.color = random.choice(self.COLORS)

    def draw(self):
        pygame.draw.rect(screen, self.color, (self.x, self.y, self.width, self.height), border_radius=8)
        pygame.draw.rect(screen, DARK_GRAY, (self.x + 4, self.y + 10, self.width - 8, 18), border_radius=3)
        pygame.draw.rect(screen, DARK_GRAY, (self.x + 4, self.y + 42, self.width - 8, 18), border_radius=3)
        # 尾灯
        pygame.draw.circle(screen, RED, (self.x + 8, self.y + 5), 4)
        pygame.draw.circle(screen, RED, (self.x + self.width - 8, self.y + 5), 4)

    def update(self):
        self.y += self.speed

    def get_rect(self):
        return pygame.Rect(self.x, self.y, self.width, self.height)


def draw_road(offset):
    """绘制道路"""
    # 草地背景
    screen.fill(GREEN)
    # 路面
    pygame.draw.rect(screen, GRAY, (ROAD_LEFT, 0, ROAD_RIGHT - ROAD_LEFT, HEIGHT))
    # 路肩
    pygame.draw.line(screen, WHITE, (ROAD_LEFT, 0), (ROAD_LEFT, HEIGHT), 3)
    pygame.draw.line(screen, WHITE, (ROAD_RIGHT, 0), (ROAD_RIGHT, HEIGHT), 3)
    # 虚线
    dash_height = 30
    gap = 25
    for i in range(-dash_height, HEIGHT, dash_height + gap):
        y = i + offset % (dash_height + gap)
        pygame.draw.rect(screen, YELLOW, (WIDTH // 2 - 3, y, 6, dash_height))


def show_start_screen():
    """开始界面"""
    while True:
        screen.fill(BLACK)
        title = font_big.render("🚗 极速驾驶", True, YELLOW)
        hint1 = font_mid.render("← → 方向键控制方向", True, WHITE)
        hint2 = font_mid.render("躲避其他车辆！", True, WHITE)
        start_text = font_small.render("按 SPACE 开始游戏", True, GREEN)

        screen.blit(title, (WIDTH // 2 - title.get_width() // 2, 180))
        screen.blit(hint1, (WIDTH // 2 - hint1.get_width() // 2, 260))
        screen.blit(hint2, (WIDTH // 2 - hint2.get_width() // 2, 310))
        screen.blit(start_text, (WIDTH // 2 - start_text.get_width() // 2, 420))

        pygame.display.flip()

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_SPACE:
                    return


def show_game_over(score):
    """游戏结束界面"""
    while True:
        screen.fill(BLACK)
        over_text = font_big.render("💥 游戏结束", True, RED)
        score_text = font_mid.render(f"最终得分：{score}", True, WHITE)
        restart_text = font_small.render("按 R 重新开始", True, GREEN)
        quit_text = font_small.render("按 Q 退出游戏", True, GRAY)

        screen.blit(over_text, (WIDTH // 2 - over_text.get_width() // 2, 180))
        screen.blit(score_text, (WIDTH // 2 - score_text.get_width() // 2, 260))
        screen.blit(restart_text, (WIDTH // 2 - restart_text.get_width() // 2, 360))
        screen.blit(quit_text, (WIDTH // 2 - quit_text.get_width() // 2, 410))

        pygame.display.flip()

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_r:
                    return
                if event.key == pygame.K_q:
                    pygame.quit()
                    sys.exit()


def main():
    """主游戏循环"""
    while True:
        show_start_screen()

        player = PlayerCar()
        obstacles = []
        score = 0
        base_speed = 4
        obstacle_timer = 0
        road_offset = 0
        game_active = True

        while game_active:
            clock.tick(FPS)

            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    pygame.quit()
                    sys.exit()

            keys = pygame.key.get_pressed()
            player.move(keys)

            # 道路滚动
            current_speed = base_speed + min(score // 500, 6)
            road_offset += current_speed

            # 生成障碍物
            obstacle_timer += 1
            spawn_rate = max(20, 45 - score // 300)
            if obstacle_timer >= spawn_rate:
                obstacles.append(ObstacleCar(current_speed + random.randint(0, 2)))
                obstacle_timer = 0

            # 更新障碍物
            for obs in obstacles[:]:
                obs.update()
                if obs.y > HEIGHT:
                    obstacles.remove(obs)
                    score += 10

            # 碰撞检测
            player_rect = player.get_rect()
            for obs in obstacles:
                if player_rect.colliderect(obs.get_rect()):
                    game_active = False
                    break

            # 绘制
            draw_road(road_offset)
            player.draw()
            for obs in obstacles:
                obs.draw()

            # 计分板
            score += 1
            score_surf = font_small.render(f"得分: {score}", True, WHITE)
            screen.blit(score_surf, (10, 10))

            # 速度等级
            level = 1 + min(score // 2000, 9)
            level_surf = font_small.render(f"Lv.{level}", True, YELLOW)
            screen.blit(level_surf, (WIDTH - level_surf.get_width() - 10, 10))

            pygame.display.flip()

        show_game_over(score // 10)


if __name__ == "__main__":
    main()