import pygame
import math

# 初始化pygame
pygame.init()

# 窗口设置
WIDTH, HEIGHT = 800, 600
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("2D小车驾驶模拟器")

# 颜色定义
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (220, 30, 30)
GRAY = (60, 60, 60)
GREEN = (30, 180, 50)
YELLOW = (255, 220, 0)

# 时钟控制帧率
clock = pygame.time.Clock()
FPS = 60

# 小车类
class Car:
    def __init__(self):
        # 小车位置、角度、速度
        self.x = WIDTH // 2
        self.y = HEIGHT // 2
        self.angle = 0  # 角度 0=朝上
        self.speed = 0
        self.max_speed = 8
        self.acc = 0.2    # 加速度
        self.friction = 0.05  # 摩擦力减速
        self.turn_speed = 3  # 转向灵敏度
        
        # 小车尺寸
        self.width = 20
        self.height = 40

    def update(self, keys):
        # 加速后退
        if keys[pygame.K_UP]:
            self.speed += self.acc
        if keys[pygame.K_DOWN]:
            self.speed -= self.acc
        
        # 摩擦力减速
        if not keys[pygame.K_UP] and not keys[pygame.K_DOWN]:
            if self.speed > 0:
                self.speed -= self.friction
            elif self.speed < 0:
                self.speed += self.friction

        # 限速
        self.speed = max(-self.max_speed, min(self.speed, self.max_speed))

        # 只有有速度时才能转向
        if abs(self.speed) > 0.1:
            turn_dir = 1 if self.speed > 0 else -1
            if keys[pygame.K_LEFT]:
                self.angle += self.turn_speed * turn_dir
            if keys[pygame.K_RIGHT]:
                self.angle -= self.turn_speed * turn_dir

        # 坐标更新
        rad = math.radians(self.angle)
        self.x += math.sin(rad) * self.speed
        self.y -= math.cos(rad) * self.speed

        # 边界碰撞反弹
        if self.x < self.height//2:
            self.x = self.height//2
            self.speed *= -0.5
        if self.x > WIDTH - self.height//2:
            self.x = WIDTH - self.height//2
            self.speed *= -0.5
        if self.y < self.height//2:
            self.y = self.height//2
            self.speed *= -0.5
        if self.y > HEIGHT - self.height//2:
            self.y = HEIGHT - self.height//2
            self.speed *= -0.5

    def draw(self, surf):
        # 创建小车表面并旋转
        car_surf = pygame.Surface((self.width, self.height), pygame.SRCALPHA)
        pygame.draw.rect(car_surf, RED, (0, 0, self.width, self.height))
        pygame.draw.rect(car_surf, YELLOW, (2, 2, self.width-4, 10))  # 车顶
        pygame.draw.rect(car_surf, BLACK, (2, self.height-12, self.width-4, 10)) # 车尾
        
        rotated = pygame.transform.rotate(car_surf, self.angle)
        rect = rotated.get_rect(center=(self.x, self.y))
        surf.blit(rotated, rect)  # 补上缺失的括号

# 创建小车实例
player_car = Car()

# 字体容错处理，避免字体报错
try:
    font = pygame.font.SysFont("Microsoft YaHei", 24)
except:
    try:
        font = pygame.font.SysFont("Arial", 24)
    except:
        font = pygame.font.Font(None, 24)

# 游戏主循环
running = True
while running:
    # 事件监听
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    # 按键状态
    key_states = pygame.key.get_pressed()
    
    # 更新小车
    player_car.update(key_states)

    # 绘制背景（道路+草地）
    screen.fill(GREEN)
    pygame.draw.rect(screen, GRAY, (100, 100, WIDTH-200, HEIGHT-200))
    # 道路标线
    for i in range(120, WIDTH-120, 40):
        pygame.draw.rect(screen, YELLOW, (i, HEIGHT//2 - 3, 20, 6))
    for i in range(120, HEIGHT-120, 40):
        pygame.draw.rect(screen, YELLOW, (WIDTH//2 - 3, i, 6, 20))

    # 绘制小车
    player_car.draw(screen)

    # UI文字（无中文乱码方案，改用英文）
    speed_text = font.render(f"Speed: {abs(player_car.speed):.1f}", True, WHITE)
    control_text = font.render("UP=Gas  DOWN=Back  LEFT/RIGHT=Steer", True, WHITE)
    screen.blit(speed_text, (10, 10))
    screen.blit(control_text, (10, 40))

    # 更新画面
    pygame.display.flip()
    clock.tick(FPS)

pygame.quit()