import pygame
import random
import sys

# 初始化
pygame.init()

# 屏幕设置
SCREEN_WIDTH = 400
SCREEN_HEIGHT = 700
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
pygame.display.set_caption("2D Racing Game")

# 颜色
WHITE = (255, 255, 255)
GRAY = (50, 50, 50)
RED = (200, 0, 0)
BLUE = (0, 100, 255)
YELLOW = (255, 255, 0)
BLACK = (0, 0, 0)

# 时钟
clock = pygame.time.Clock()
FPS = 60

# 道路参数
ROAD_LEFT = 50
ROAD_RIGHT = 350
LANE_CENTER = (ROAD_LEFT + ROAD_RIGHT) // 2

# 玩家车


class PlayerCar:
    def __init__(self):
        self.width = 40
        self.height = 70
        self.x = LANE_CENTER - self.width // 2
        self.y = SCREEN_HEIGHT - 120
        self.speed = 8

    def draw(self, surface):
        # 车身
        pygame.draw.rect(surface, BLUE, (self.x, self.y,
                         self.width, self.height), border_radius=8)
        # 车窗
        pygame.draw.rect(surface, GRAY, (self.x + 5, self.y +
                         10, self.width - 10, 20), border_radius=4)
        # 轮子
        pygame.draw.rect(surface, BLACK, (self.x - 5,
                         self.y + 10, 5, 15), border_radius=2)
        pygame.draw.rect(surface, BLACK, (self.x + self.width,
                         self.y + 10, 5, 15), border_radius=2)
        pygame.draw.rect(surface, BLACK, (self.x - 5, self.y +
                         self.height - 25, 5, 15), border_radius=2)
        pygame.draw.rect(surface, BLACK, (self.x + self.width,
                         self.y + self.height - 25, 5, 15), border_radius=2)

    def move(self, direction):
        if direction == "left" and self.x > ROAD_LEFT:
            self.x -= self.speed
        elif direction == "right" and self.x < ROAD_RIGHT - self.width:
            self.x += self.speed

# 障碍物


class Obstacle:
    def __init__(self, speed):
        self.width = 40
        self.height = 70
        self.x = random.randint(ROAD_LEFT, ROAD_RIGHT - self.width)
        self.y = -self.height
        self.speed = speed

    def update(self):
        self.y += self.speed

    def draw(self, surface):
        pygame.draw.rect(surface, RED, (self.x, self.y,
                         self.width, self.height), border_radius=8)
        pygame.draw.rect(surface, GRAY, (self.x + 5, self.y +
                         10, self.width - 10, 20), border_radius=4)
        pygame.draw.rect(surface, BLACK, (self.x - 5,
                         self.y + 10, 5, 15), border_radius=2)
        pygame.draw.rect(surface, BLACK, (self.x + self.width,
                         self.y + 10, 5, 15), border_radius=2)
        pygame.draw.rect(surface, BLACK, (self.x - 5, self.y +
                         self.height - 25, 5, 15), border_radius=2)
        pygame.draw.rect(surface, BLACK, (self.x + self.width,
                         self.y + self.height - 25, 5, 15), border_radius=2)

    def off_screen(self):
        return self.y > SCREEN_HEIGHT

    def collide(self, player):
        return (self.x < player.x + player.width and
                self.x + self.width > player.x and
                self.y < player.y + player.height and
                self.y + self.height > player.y)

# 道路标记


class RoadLine:
    def __init__(self, x, y, height=40):
        self.x = x
        self.y = y
        self.height = height
        self.speed = 5

    def update(self, speed):
        self.y += speed
        if self.y > SCREEN_HEIGHT:
            self.y = -self.height

    def draw(self, surface):
        pygame.draw.rect(surface, YELLOW, (self.x, self.y, 5, self.height))

# 游戏主函数


def game():
    player = PlayerCar()
    obstacles = []
    road_lines = [RoadLine(LANE_CENTER - 45, i * 80) for i in range(-1, 10)]
    road_lines += [RoadLine(LANE_CENTER + 45, i * 80) for i in range(-1, 10)]

    score = 0
    base_speed = 5
    obstacle_timer = 0
    obstacle_interval = 60  # 帧数间隔

    # 修复：使用 pygame.font.Font(None, size) 加载默认字体
    # 这避免了 SysFont 的内部 bug
    try:
        font = pygame.font.Font(None, 36)
    except:
        # 备用方案：如果默认字体也失败，使用基本渲染
        font = pygame.font.SysFont("simhei", 36)

    running = True
    while running:
        clock.tick(FPS)

        # 事件处理
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()

        keys = pygame.key.get_pressed()
        if keys[pygame.K_LEFT]:
            player.move("left")
        if keys[pygame.K_RIGHT]:
            player.move("right")

        # 更新道路线
        current_speed = base_speed + score // 500
        for line in road_lines:
            line.update(current_speed)

        # 生成障碍物
        obstacle_timer += 1
        if obstacle_timer >= max(obstacle_interval - score // 1000, 20):
            obstacles.append(Obstacle(current_speed))
            obstacle_timer = 0

        # 更新障碍物
        for obs in obstacles[:]:
            obs.speed = current_speed
            obs.update()
            if obs.off_screen():
                obstacles.remove(obs)
                score += 10
            if obs.collide(player):
                running = False

        # 绘制
        screen.fill(GRAY)
        # 道路背景
        pygame.draw.rect(screen, (30, 30, 30), (ROAD_LEFT, 0,
                         ROAD_RIGHT - ROAD_LEFT, SCREEN_HEIGHT))
        # 道路边界
        pygame.draw.rect(screen, WHITE, (ROAD_LEFT, 0, 5, SCREEN_HEIGHT))
        pygame.draw.rect(screen, WHITE, (ROAD_RIGHT - 5, 0, 5, SCREEN_HEIGHT))
        # 道路中线
        for line in road_lines:
            line.draw(screen)
        # 玩家车
        player.draw(screen)
        # 障碍物
        for obs in obstacles:
            obs.draw(screen)

        # 分数
        score_text = font.render(f"Score: {score}", True, WHITE)
        screen.blit(score_text, (10, 10))

        pygame.display.flip()

    # 游戏结束画面
    try:
        game_over_font = pygame.font.Font(None, 72)
    except:
        game_over_font = pygame.font.SysFont("simhei", 72)

    over_text = game_over_font.render("GAME OVER", True, RED)
    final_score_text = font.render(f"Final Score: {score}", True, WHITE)
    restart_text = font.render("Press R to Restart or Q to Quit", True, WHITE)

    waiting = True
    while waiting:
        clock.tick(FPS)
        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:
                    game()
                    return
                if event.key == pygame.K_q:
                    pygame.quit()
                    sys.exit()

        screen.fill(GRAY)
        screen.blit(over_text, (SCREEN_WIDTH//2 -
                    over_text.get_width()//2, SCREEN_HEIGHT//2 - 60))
        screen.blit(final_score_text, (SCREEN_WIDTH//2 -
                    final_score_text.get_width()//2, SCREEN_HEIGHT//2 + 20))
        screen.blit(restart_text, (SCREEN_WIDTH//2 -
                    restart_text.get_width()//2, SCREEN_HEIGHT//2 + 70))
        pygame.display.flip()


if __name__ == "__main__":
    game()
