# 《披萨大亨》中的交通模拟:25 MHz 顺畅运行
在《披萨大亨》中,交通系统采用简单机制,在时钟频率为 25 MHz 的 386 处理器上运行。每辆车每游戏 tick 前进一个像素。主循环检查障碍并调整坐标:向东时 X +1,向北时 Y -1。
progress 计数器从 16 倒数到 0,到达零时重置为 16,并触发图块边界逻辑:选择方向并更新精灵。16x16 像素图块确保同步——繁重计算频率仅为逐像素移动的 1/16。
生成时,progress 随机初始化(1–16),分散帧负载。
道路布局与方向规则
地图由 landsym.vga 中的 160x120 图块网格构成。道路单向:图块 0x16 向东,0x06 向西,0x26/0x36 处理垂直路径。
弯道增加分支。图块 0x56(CORNER_SW)允许向西或向南。选择:50% 概率转弯/直行。禁止连续两次左转保持自然流动。
地图设计逻辑严谨——相邻图块始终支持有效路径。
- 直行图块:固定方向。
- 弯道:概率选择 + 防循环。
- T/X 路口:弯道组合。
成对检查实现碰撞检测
25 辆车 O(n²) 需每帧 625 次检查。优化:方向预判早退。东+西对直接跳过坐标检查,因为单向路避免迎头相撞。
检查顺序:
- 方向(过滤一半对)。
- 车道(同路匹配)。
- 坐标计算(罕见,<10 对)。
碰撞时暂停 10 tick。拥堵自然消散:领头车先动。
bug(如穿模)是优化副产物,视觉模拟可接受。
车辆生成与回收
进入街道模式:扫描视口 132 图块(12x11)。道路上根据邻域密度掷骰生成。弯道排除。
驶出屏幕:同图块替换为反方向/颜色的新车。滚动时新车道类似处理。
// 生成伪代码
for each road_tile in viewport:
if random(traffic_density) > threshold:
spawn_car(tile, random_direction, random_progress)
反汇编与现代陷阱
《披萨传奇》作者花 14 年搞过度图、A* 和碰撞。原版更简:图块决定路径,无物理/速度。
汇编分析 + LLM 揭开机制。复现:在 decide_desired_direction(Car.cpp)按图块类型 switch。
| 方法 | 复杂度 | 效率 |
|----------|------------|-----------------------|
| 原版 | 简单规则 | 25 MHz,30 辆车 |
| 现代版 | 图、物理 | 2010+ CPU 死锁 |
关键要点
- 单向图块免除路径寻找。
- 碰撞早退最小化循环。
- 逐像素移动 + 不频繁 更新 = 低 CPU 负载。
- 概率转向 + 防循环 = 无 AI 的真实感。
- 车辆回收省去列表管理。
— Editorial Team
暂无评论。