下载 App

《公交公司》开发者日志2

修改于10/2217 浏览

《公交公司》开发者日志 02 · 每位乘客,都真的被送到目的地

这一期聊城市与乘客。听起来是最基础的系统,但恰恰是这里藏着我们踩过最深的坑。
TapTap

一、乘客不是数字,是一条计划

在很多模拟游戏里,「乘客」就是一个计数:来了 N 个人,运力够就消掉。
我们没这么做。每位乘客身上带着一条真实的行程计划:
  • 出发站、目的站;
  • 经过哪些线路、在哪一站换乘;
  • 当前在第几段、这一段该上哪辆车。
而且规则很严格:只有线路真的把他送到目的站,才算送达。经过、路过都不算。
车上每个座位格子里显示的是乘客的目的站编号,站台上候车方块里显示的也是目的站编号。玩家扫一眼就能知道:这辆车接下来该往哪开、哪个站的人在等什么。

二、站台方块为什么有红黑两色

站台上每个候车方块有两种颜色,这是我们刻意保留的语义:
颜色  含义
深墨色  该目的地已有可乘路线,正常等待
红色  该目的地暂无路线,需要玩家处理
红色方块是「这里有人去不了」,是玩家该动手的信号。后面做视觉极简的时候,我们差点把颜色语义砍掉——这是整个视觉重设计里最容易被弄丢的一层信息,所以写进方案时专门加了「不可为极简牺牲」的条款。

三、坑一:乘客为什么永远等不到车

有一次测试发现:5 号站有乘客要去 3 号和 7 号站,金线的车来回跑了很多趟,一辆都不接他。
明明有可行路径:5→4(金线)→2(红线)→3(蓝线)。但游戏就是不让他走。
查了半天,根因不在「登车逻辑」,而在路线规划:
我们的路径规划只支持一次换乘——实现方式是两重循环,先找直达,再枚举「第一条线 × 第二条线 × 换乘站」。上面那条路径需要两次换乘(三段),枚举不出来,于是 plan 是空的。
而更隐蔽的是:同一个假设散落在三个地方——
  • 规划的两重循环假设最多换乘一次;
  • 登车条件写死「最多两次上车」;
  • 换乘统计只认「换乘 1 次」。
三者一致地错,所以不会报错、不会崩,只会表现为「乘客不上车」。
修复方案是把问题看成带权最短路:
  • 状态 =(站点,上一条乘坐的线路);
  • 边 =「在一条线上从 A 到 B」,可行性与成本复用已有的行程计算;
  • 换乘时加一个固定代价,所以最短路不会绕回去重复乘同一条线,换乘次数天然不超过线路数。
规模其实很小(站点数 × 线路数,当时也就 90 个状态),线性扫描就够,不需要额外的数据结构。直达仍然走原来的快速路径,命中即返回。
顺带把登车和统计里的硬上限一起放开了。

四、坑二:「预约」被当成了「锁定」

第二个坑更反直觉。
玩家反馈:站 4 有两位乘客,一辆空的红车开过来,掉头走了,一个都没接。
探针打出来的状态是:车与乘客在线路、方向、站点上全部匹配,却判为不可登车。原因是登车条件里有一句:
and (leg.busId == 0 or leg.busId == bus.id)
busId 是「下一段预约到的那辆具体车」。于是乘客的第二段被锁死在某一辆车上——那辆车没来之前,任何同线、同向、同起点的车都被拒绝。
但「预约」的本意只是确认下一段确实有车,不是「只能坐这一辆」。一旦那辆车被延迟或安排回收,乘客就在站台上白等。
修改后,判据从「下一段预约到车了吗」变成「下一段的线路有车吗」:
下一段状态  旧行为  新行为
预约到具体车  放行  放行
线路有车,但那辆车在旧班次收尾/空驶转场  拒载本段  放行
线路根本没有车  拒载本段  拒载本段(不变)
一句话总结这次修复的教训:「暂时不可用」不等于「不可服务」。 判据应该是「资源是否存在」,而不是「此刻是否就绪」。

五、坑三:被「冻住」的候车段

这个坑最有意思,因为我们第一次判断错了方向。
现象是「反复改线后,车停在旧版本不再接管新线路」。我们照着这个描述去查车,查了很久没结果。
后来加了诊断追踪(把每帧的车状态和乘客状态并排打印),才抓到决定性的一行:
车6(线3@站4 方向-1 normal svcV4) 乘客38(去11 在站4 已登2 段3) 段=线3 版本2
逐项对比:线路吻合、方向吻合、站点吻合,只有版本对不上(车是 V4,乘客的段停在 V2)。
所以根本不是「车不接管」,而是乘客的计划被冻住了。根因是一句看似合理的提前返回:
if trip.boardings > 0 then return end
原意是「乘客已经出发了,剩余行程不该被普通重规划改写」。但这句把乘客尚未开始的候车段版本也一起冻结了。线路改版后,所有车都接管了新版本,而该段仍停在旧版本号,版本永远对不上 → 乘客在站台无限期等待。
修复的关键是区分对象:
段的状态  处理  理由
在途  不动  当前段正被承运,改写会让乘客中途改乘
候车 + 有车承接  保持冻结  那辆车还要把它送完
候车 + 无车承接  同步到当前版本  没人送它,冻结版本纯属死锁
同一个「冻结」策略,用在不同状态的对象上,结果完全相反。

六、这一期最大的教训

不是某个具体 bug,而是方法论上的三条:
  1. 现象描述错了会误导修复方向。 我们一开始把问题记成「车卡住」,方向完全错了。后来要求:描述现象前,先确认观测工具本身没影响结果。
  2. 只有车或只有乘客的状态都不够。 只看车,看到的是「车经过却不接」;只看乘客,看到的是「一直在等」。把两者的字段并排打出来,svcV4 vs 版本2 才一眼可见。
  3. 测试不变量要跟着模型一起改。 我们有好几条测试断言编码了「最多一次换乘」「预约即锁定」这类旧假设。产品逻辑一放宽,这些断言反而会拦住正确的修复。
猜你想搜
聚光灯游戏创作挑战 开发者日志2
【童谣镇】聚光灯第二次开发日志截图
【童谣镇】聚光灯第二次开发日志
开发进度: 美术 1、主角人物立绘已细化完成 2、所有NPC的QQ人形象与呼吸动画已设计完成 3、大部分UI界面已设计完成 4、面包房建模与树屋建模以及基础房屋、路灯、树木模型已完成。 5、制作过场动效,制作通用动效材质ing 6、广场资产替换、永续桥和植被的资产替换、房屋资产替换,河流制作 7、学校模型的材质完成 8、石墩子、小道具模型制作ing 9、NPC正比胸像绘制ing 策划 1、任务系统
11 赞
10 回复
00:34
《荒原复苏指南》开发日志④:关卡演示堂堂袭来!!截图
《荒原复苏指南》开发日志④:关卡演示堂堂袭来!!
- 人类曾因掌握元素合成技术而一度辉煌,又因滥用元素能量而逐渐从内里衰败。 - 30世纪80年代。社会文化充斥着激进乐观主义与庞大机械美学,在这里,污染和能源共生,幸福与痛苦并存。官方广播和宣传画里依旧在宣扬“科学将战胜一切”、“元素能量将再造新农田”的口号,而世界主城却已经因为污染过度而濒临崩溃、空间挤压严重。为了寻找新的生存空间与无污染能源,官方启动了“重构拓荒计划”。 - 玩家将作为前线拓展
18 赞
6 回复
《卡牌工业》开发日志 01|从“涌现”到产线对打截图
《卡牌工业》开发日志 01|从“涌现”到产线对打
大家好,我们正在用 Godot 做一个暂名《卡牌工业》的游戏。目前已经跑通了最小的生产与战斗循环,也做了两轮迭代。这篇先记录一下:面对“涌现”这个题目,我们讨论过什么,又为什么最后收敛到卡牌和工厂。 第一步:头脑风暴,涌现可以是什么? 刚看到“涌现”这个题目时,我们的想法几乎朝每个方向散开了。塔防、物理搭建、探索、解谜、经济系统、叙事,甚至增量游戏,都能让简单规则在玩家的操作中长出新的结果。再想下
1 回复
00:30
《失心》游戏开发者日志01|游戏UI迭代及实机演示截图
《失心》游戏开发者日志01|游戏UI迭代及实机演示
进入《失心》之前,玩家首先看到的是我们工作室 UNLOOK 的标识。我们将原来的标识转成 SVG,并让其中的红色瞳点转动、观察,再逐步显露完整字形,希望这个短暂的开场能带出一点好奇和不安。 这次《失心》的开局 UI,我们围绕小灵通(因为游戏的主要交互道具就是小灵通)做了几轮调整,希望玩家从打开游戏开始,就能感受到故事里的年代和气氛(故事年代背景为2000s)。 早期版本先确定了一个方向:把菜单放进
15 赞
10 回复
《气味之城》开发日志#1|为什么"涌现"和猫是天作之合截图
《气味之城》开发日志#1|为什么"涌现"和猫是天作之合
大家好,我是一个人报名了 2026 聚光灯 21 天游戏创作挑战 的独立开发者。今年主题公布那一刻我就笑出了声——涌现。因为我已经想做这个游戏很久了: 《气味之城》:你不是猫神,你只是一只猫。 先说一个所有养猫人都懂的事实:你永远无法"教会"一只猫任何它自己不想学会的事。但你家猫可能自己学会了——听见冰箱开门就瞬移到厨房;你心情不好时过来踩奶;凌晨三点准时在你身上练马拉松。没人教过它,这些行为是它
3 赞
6 回复
【2026聚光灯日志01】什么叫你把手牌,骰子和战棋融合了?截图
【2026聚光灯日志01】什么叫你把手牌,骰子和战棋融合了?
大家好啊,我是官方小编,一位还在学校的独自开发的苦逼带学生 这次算是第二次正式参加GameJam,而这回的比赛主题是【涌现】 嗯…老实说,一开始我还真只是从中文语义上来看,理解成“大量的出现”,直到询问ai哦哦哦我这就才想起来还有英文的“整体大于部分之和”意思来着 说起这个主题的意思,立马想起的类 吸血鬼幸存者 ,或者是 文明 系列的各种爆怪,爆兵的设计,即大量的出现敌人或者单位 而从第二个
4 赞
4 回复
00:10
群迹·上取其下,下取其上截图
群迹·上取其下,下取其上
#聚光灯gamejam开发者日志 向大家汇报一下今日进度,目前在和蚁群的默认移动算法进行斗智斗勇。或许是我的AI对蚂蚁有别样的理解,其实最初写出的方案更接近于围绕着恒星公转的行星。 哦我还以为文章里可以插入多支视频视频,想要展示一些其它的运动方式,可惜了。那么就简单在上方传一个比较典型的,有点类似于蟑螂的运行方式。 目前仍在解决蚁群的随机运动,和玩家可操纵性之间的平衡问题。以及如各位所见,目前的
4 赞
1 回复
开发者日志#01:涌现!! 披着科幻外衣的涌现式增量游戏!!!!截图
开发者日志#01:涌现!! 披着科幻外衣的涌现式增量游戏!!!!
随着Game Jam 主题公示,我们团队立马着手维持了三天的激烈讨论!决定做一个披着科幻外衣的蚂蚁农场以boids算法为灵感的涌现式增量游戏!!! 至此,方案敲定,我们团队将开发一个可升级的自主群体模拟,并且初步规划了玩家游戏时的体验流程: (1)阶段1(开局30s,触发痛点,会有一次提升,但是游戏仍然艰难):一张地图分布着资源点和仓库,玩家此时只能徒手采集资源点的矿石拖入仓库,矿石可以造机器人;
14 赞
7 回复
00:07
雨天決行 开发者日志02-人工智能的自我修养截图
雨天決行 开发者日志02-人工智能的自我修养
又和大家见面啦!第二篇日志,说实话一开始不知道该怎么编排,但团队里惊喜的成果越来越多,我们已经迫不及待把更新的内容端上来给大家啦!那么事不宜迟,快来看看都有什么新情报吧ദ്ദി˶ー̀֊ー́ )✧ 一.美术(重磅升级) 以主美小为的生命力作为燃料(bushi)本次美术组取得了大进程!首先是各个ui界面的优化和细化,上次大家看到时还只是初具雏形的草稿,现在大多都完整起来了哦! 同时,随着配色的补全,手
43 赞
36 回复
00:48
Day1 《逆种》截图
Day1 《逆种》
《逆种》 俯视角快节奏近战动作 Roguelite。 你的打法是自然选择,5 层进化的终点,最终 Boss「逆种」是你亲手培育的克星。 一局 8-15 分钟,死亡即收获,你的怪物通过分享码替你和全世界打。 一、九项核心决定 # 决定项 结论 1 战斗手感 近战为主·哈迪斯风(轻三连段/蓄力重击/冲刺割裂/处决) 2 进化透明度 渐进式透明(表型可视化 → 仪式 diff → 扫描仪 DNA 面板)
4 赞
6 回复