import pygame
import sys
import random

# ===================== 基础配置 =====================
pygame.init()
# 窗口大小
WIDTH, HEIGHT = 800, 600
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)
GREEN = (34, 139, 34)
GRAY = (80, 80, 80)
YELLOW = (255, 220, 0)
RED = (220, 30, 30)
BLUE = (30, 144, 255)

# 道路参数
ROAD_WIDTH = 400
road_left = (WIDTH - ROAD_WIDTH) // 2
road_right = road_left + ROAD_WIDTH
line_speed = 6  # 道路标线移动速度
road_lines = []
# 初始化道路白色虚线
for y in range(-HEIGHT, HEIGHT * 2, 80):
    road_lines.append(y)

# 汽车类
class Car:
    def __init__(self):
        self.width = 40
        self.height = 70
        self.x = WIDTH // 2 - self.width // 2
        self.y = HEIGHT - 120
        self.speed_x = 0
        self.speed_y = 0
        self.max_speed = 8
        self.acc = 0.3
        self.friction = 0.92
        self.angle = 0

    def update(self, keys):
        # 加速减速
        if keys[pygame.K_UP]:
            self.speed_y -= self.acc
        if keys[pygame.K_DOWN]:
            self.speed_y += self.acc
        # 左右转向
        if keys[pygame.K_LEFT]:
            self.speed_x -= self.acc
        if keys[pygame.K_RIGHT]:
            self.speed_x += self.acc

        # 摩擦力减速
        self.speed_x *= self.friction
        self.speed_y *= self.friction

        # 最大速度限制
        self.speed_x = max(-self.max_speed, min(self.speed_x, self.max_speed))
        self.speed_y = max(-self.max_speed, min(self.speed_y, self.max_speed))

        # 坐标更新
        self.x += self.speed_x
        self.y += self.speed_y

        # 道路边界检测（出道路强制回拉+减速）
        if self.x < road_left:
            self.x = road_left
            self.speed_x *= 0.5
        if self.x + self.width > road_right:
            self.x = road_right - self.width
            self.speed_x *= 0.5

        # 屏幕上下边界
        if self.y < 0:
            self.y = 0
        if self.y + self.height > HEIGHT:
            self.y = HEIGHT - self.height

    def draw(self):
        # 绘制车身 + 车窗
        car_rect = pygame.Rect(self.x, self.y, self.width, self.height)
        pygame.draw.rect(screen, RED, car_rect, border_radius=8)
        # 车窗
        win_rect = pygame.Rect(self.x + 6, self.y + 12, self.width - 12, 22)
        pygame.draw.rect(screen, BLUE, win_rect, border_radius=3)

# 游戏变量
player_car = Car()
score = 0

# ========== 修复字体部分：兼容所有Windows环境，不会报错 ==========
try:
    # 优先微软雅黑
    font_ui = pygame.font.SysFont("msyh", 22)
    font_title = pygame.font.SysFont("msyh", 28)
except:
    try:
        # 备选黑体
        font_ui = pygame.font.SysFont("simhei", 22)
        font_title = pygame.font.SysFont("simhei", 28)
    except:
        # 终极兜底：使用系统默认字体，必定不会报错（中文可能方框，游戏功能正常）
        font_ui = pygame.font.Font(None, 22)
        font_title = pygame.font.Font(None, 28)

# ===================== 游戏主循环 =====================
running = True
while running:
    dt = clock.tick(FPS) / 1000
    screen.fill(GREEN)  # 草地底色

    # 事件监听
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    keys = pygame.key.get_pressed()
    player_car.update(keys)

    # 绘制马路底色
    pygame.draw.rect(screen, GRAY, (road_left, 0, ROAD_WIDTH, HEIGHT))
    # 更新并绘制道路黄色虚线
    for i in range(len(road_lines)):
        road_lines[i] += line_speed
        if road_lines[i] > HEIGHT:
            road_lines[i] = -80
        # 画分段虚线
        pygame.draw.rect(screen, YELLOW, (WIDTH//2 - 4, road_lines[i], 8, 40))

    # 绘制左右白色路肩线
    pygame.draw.rect(screen, WHITE, (road_left - 4, 0, 4, HEIGHT))
    pygame.draw.rect(screen, WHITE, (road_right, 0, 4, HEIGHT))

    # 车辆前进加分
    if player_car.speed_y < -1:
        score += abs(player_car.speed_y) * 0.02

    # 绘制玩家车辆
    player_car.draw()

    # ========== 绘制UI界面（右上角信息面板） ==========
    # 面板底色
    panel_rect = pygame.Rect(WIDTH - 170, 10, 160, 110)
    pygame.draw.rect(screen, (20, 20, 20), panel_rect, border_radius=6)
    pygame.draw.rect(screen, WHITE, panel_rect, 2, border_radius=6)

    # 文字内容
    speed_val = abs(player_car.speed_y) * 12
    text_speed = font_ui.render(f"当前车速: {speed_val:.1f} km/h", True, WHITE)
    text_score = font_ui.render(f"行驶分数: {int(score)}", True, WHITE)
    text_tip = font_ui.render("↑↓前进后退 ←→转向", True, (180,180,180))

    screen.blit(text_speed, (WIDTH - 160, 20))
    screen.blit(text_score, (WIDTH - 160, 50))
    screen.blit(text_tip, (WIDTH - 160, 80))

    pygame.display.flip()

pygame.quit()
sys.exit()