# racing_game.py
import pygame
import math
import sys # 用于退出

# --- 颜色定义 (在每个模块中定义，或从共享文件导入) ---
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (255, 0, 0)
GREEN = (0, 255, 0) # 草地
BLUE = (0, 0, 255) # 赛车
YELLOW = (255, 255, 0)
GRAY = (100, 100, 100) # 墙壁
DARK_GRAY = (50, 50, 50) # 赛道

# --- 字体设置 (在每个模块中定义，或从共享文件导入) ---
pygame.font.init() # 确保字体模块已初始化
font = pygame.font.Font(None, 74)  # 大字体
small_font = pygame.font.Font(None, 36) # 小字体

# --- 赛车游戏变量 (全局，但仅在此模块内使用) ---
car_width = 30
car_height = 50
car_x, car_y = 0, 0 # 运行时根据屏幕大小初始化
car_speed = 0
car_angle = 90 # 初始朝上 (0度是右，90度是上)
car_max_speed = 5
car_acceleration = 0.1
car_friction = 0.05
car_turn_speed = 3
racing_game_over = False

# 赛道墙壁 (使用Rect对象定义)
# 这是一个简单的U形赛道
track_walls = [] # 运行时根据屏幕大小计算

# --- 辅助函数：绘制文本 (在此模块中定义) ---
def draw_text(screen, text, font_obj, color, x, y, center=False):
    text_surface = font_obj.render(text, True, color)
    if center:
        text_rect = text_surface.get_rect(center=(x, y))
        screen.blit(text_surface, text_rect)
    else:
        screen.blit(text_surface, (x, y))

def reset_racing_game(screen_width, screen_height):
    global car_x, car_y, car_speed, car_angle, racing_game_over, track_walls
    car_x, car_y = screen_width // 2, screen_height - 100
    car_speed = 0
    car_angle = 90
    racing_game_over = False

    # 动态调整赛道墙壁以适应屏幕大小
    track_walls = [
        # 外墙
        pygame.Rect(screen_width * 0.0625, screen_height * 0.0833, screen_width * 0.875, screen_height * 0.0333),  # 上 (50, 50, 700, 20)
        pygame.Rect(screen_width * 0.0625, screen_height * 0.0833, screen_width * 0.025, screen_height * 0.8333),  # 左 (50, 50, 20, 500)
        pygame.Rect(screen_width * 0.9125, screen_height * 0.0833, screen_width * 0.025, screen_height * 0.8333), # 右 (730, 50, 20, 500)
        pygame.Rect(screen_width * 0.0625, screen_height * 0.8833, screen_width * 0.875, screen_height * 0.0333), # 下 (50, 530, 700, 20)

        # 内墙
        pygame.Rect(screen_width * 0.1875, screen_height * 0.25, screen_width * 0.625, screen_height * 0.0333), # 内上 (150, 150, 500, 20)
        pygame.Rect(screen_width * 0.1875, screen_height * 0.25, screen_width * 0.025, screen_height * 0.5), # 内左 (150, 150, 20, 300)
        pygame.Rect(screen_width * 0.7875, screen_height * 0.25, screen_width * 0.025, screen_height * 0.5), # 内右 (630, 150, 20, 300)
        pygame.Rect(screen_width * 0.1875, screen_height * 0.7167, screen_width * 0.625, screen_height * 0.0333), # 内下 (150, 430, 500, 20)
    ]


def draw_racing_game(screen, screen_width, screen_height):
    screen.fill(GREEN) # 草地背景

    # 绘制赛道
    for wall in track_walls:
        pygame.draw.rect(screen, GRAY, wall) # 墙壁
    
    # 绘制赛道中间区域（路面）
    pygame.draw.rect(screen, DARK_GRAY, (screen_width * 0.0875, screen_height * 0.1167, screen_width * 0.825, screen_height * 0.7667)) # 外层路面 (70, 70, 660, 460)
    pygame.draw.rect(screen, GREEN, (screen_width * 0.2125, screen_height * 0.2833, screen_width * 0.575, screen_height * 0.4667)) # 内层草地 (170, 170, 460, 280)

    # 绘制起点线
    pygame.draw.line(screen, WHITE, (car_x - 50, car_y + car_height // 2), (car_x + 50, car_y + car_height // 2), 5)


    # 绘制赛车
    car_surface = pygame.Surface((car_width, car_height), pygame.SRCALPHA)
    car_surface.fill(BLUE) # 赛车颜色
    
    # 绘制车顶
    pygame.draw.rect(car_surface, RED, (car_width // 4, car_height // 4, car_width // 2, car_height // 2))

    rotated_car = pygame.transform.rotate(car_surface, car_angle)
    car_rect = rotated_car.get_rect(center=(car_x, car_y))
    screen.blit(rotated_car, car_rect)

    if racing_game_over:
        draw_text(screen, "撞车了！", font, RED, screen_width // 2, screen_height // 2 - 50, center=True)
        draw_text(screen, "按 'R' 重新开始，'Esc' 返回菜单", small_font, WHITE, screen_width // 2, screen_height // 2 + 20, center=True)

def update_racing_game(keys, screen_width, screen_height):
    global car_x, car_y, car_speed, car_angle, racing_game_over

    if racing_game_over:
        return

    # --- 移动控制 ---
    if keys[pygame.K_UP]:
        car_speed = min(car_speed + car_acceleration, car_max_speed)
    elif keys[pygame.K_DOWN]:
        car_speed = max(car_speed - car_acceleration * 2, -car_max_speed / 2) # 倒车速度减半
    else:
        # 摩擦力减速
        if car_speed > 0:
            car_speed = max(0, car_speed - car_friction)
        elif car_speed < 0:
            car_speed = min(0, car_speed + car_friction)

    # 转向 (只有在移动时才能转向)
    if abs(car_speed) > 0.1: # 只有当车有一定速度时才能转向
        if keys[pygame.K_LEFT]:
            car_angle += car_turn_speed * (1 if car_speed > 0 else -1) # 倒车时转向相反
        if keys[pygame.K_RIGHT]:
            car_angle -= car_turn_speed * (1 if car_speed > 0 else -1) # 倒车时转向相反

    # 更新位置
    rad_angle = math.radians(car_angle)
    car_x += car_speed * math.cos(rad_angle)
    car_y -= car_speed * math.sin(rad_angle) # Pygame的Y轴向下递增

    # --- 碰撞检测 ---
    # 创建一个代表赛车当前位置和大小的矩形
    # 注意: pygame.transform.rotate 会改变矩形大小，这里为了简化碰撞检测，
    # 我们用一个非旋转的矩形来近似碰撞。更精确的碰撞需要更复杂的几何计算。
    car_collision_rect = pygame.Rect(car_x - car_width // 2, car_y - car_height // 2, car_width, car_height)
    
    for wall in track_walls:
        if car_collision_rect.colliderect(wall):
            racing_game_over = True
            car_speed = 0 # 撞墙后停止
            break # 只要撞到一个墙就停止

# --- 赛车游戏主循环函数 ---
def run_racing_game(screen):
    # 获取屏幕尺寸
    screen_width, screen_height = screen.get_size()

    reset_racing_game(screen_width, screen_height)
    
    clock = pygame.time.Clock()
    FPS = 60
    
    game_running = True
    while game_running:
        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 and racing_game_over: # 重新开始
                    reset_racing_game(screen_width, screen_height)
                if event.key == pygame.K_ESCAPE: # 返回菜单
                    game_running = False # 退出当前游戏循环

        keys = pygame.key.get_pressed() # 获取所有按键状态，用于持续按压
        update_racing_game(keys, screen_width, screen_height)

        draw_racing_game(screen, screen_width, screen_height)
        pygame.display.flip()
        clock.tick(FPS)

# 如果单独运行此文件进行测试
if __name__ == "__main__":
    pygame.init()
    test_screen = pygame.display.set_mode((800, 600))
    pygame.display.set_caption("赛车游戏测试")
    run_racing_game(test_screen)
    pygame.quit()