程序员以上帝视角解读“旅行青蛙”,你的呱真的在旅行嘛?

知乎有位程序员大佬,为了让老母亲老父亲们理解自己的呱究竟在干什么,于是花了五个晚上逆向游戏程序逻辑,提取各种数据。这里相当于动用了上帝视角来解答这些问题。我们也来了解一下。

沉溺学习的青蛙

大佬根据回答的内容,做了一个目录,方便大家按需食用。

  1. 呱真的在旅行么?

  2. 呱是如何选择旅行路径的?

  3. 呱是如何旅行的?

  4. 呱在每条路上的耗时是怎么计算的?

  5. 呱离家出走了怎么办?

  6. 道路有哪些属性?

  7. 每件物品都有什么效果?

  8. 如何科学使用物品?

  9. 旅途中会带回哪些明信片?

  10. 旅途中会带回哪些特产?

  11. 朋友什么时候会来访?

  12. 朋友来访应该投喂什么?

  13. 三叶草多久会长好?

  14. 四叶草获得的概率是?

  15. 抽奖球的概率是?

  16. 如何获得成就?

  17. 有没有免费获得三叶草的方法?

1呱真的在旅行么?

不得不佩服游戏的设计者,为了追求真实,实现了一套非常完整的旅行模拟系统,有严谨的旅游路线设计。

因为旅行的过程并不展示给用户,我原本以为逻辑会十分简单。发现这套旅行模拟系统的时候,我也有些惊讶,也促使我深入研究这款游戏的逻辑。

精雕细琢

下面的解释中间会用到少量计算机图论 (graph theory) 的术语,但应该还是很直观。

2、呱是如何选择旅行路径的?

程序内建东、西、南、北四个区域,呱会选择一个地区旅行,每个区域的设计都是一个连通的无向图 (connected undirected graph),而呱的旅行路线就是在图上某两个点之间走出一条路径 (path)

通过逆向手段,我提取出了程序中的信息,花了一些时间用 Graphviz 生成了每个地图的样子。

东部地区

西部地区

南部地区.jpg

北部地区.jpg

图上的每个节点 (vertex) 都代表了一个地点。每个地点都有可能被蛙经过,并触发一些事件。

除了普通的地点外,还有四种特殊的地点会影响呱旅行的路线:

  • START 起始点(帽绿色)

  • GOAL 目的地(桃红色)

  • PATH 途径地(橘黄色)

  • DETOUR 绕路地(浅黄色)

连接节点之间的是边 (edge),代表连接地点的路,这些路上也会触发遇上伙伴、拍摄照片等事件。

每次开始旅行的时候,根据老母亲打包的物品,呱都会:

1、选择目的地

携带特点食物或道具可以影响到地区的选择,有些物品可以增加特定地区的被选概率,甚至可以直接确定选择的地区。在一个区域内的目的地的选择同样取决于所携带的道具。具体每件物体效果会在后面提到。

2、选择途径地

途径地由目的地决定,每个地点都有对应的途径地,代码中对此的描述是当地的县府/交通枢纽。

3、选择绕路地

这个很有意思,我猜测作者的目的是为了让旅途更有多样性,每次路途会额外添加几个地区内绕路地点,携带物品对决定绕路地似乎没有影响。

4、生成经过所有地点的旅行路径

运用了图论很经典的连通图找最短路径 Dijkstra 算法,配合途径地和绕路地的逻辑,最终计算出旅行路径。

目的地是怎么选择的?

这里的数值不是绝对概率而是相对的优先级

具体目的地的选择就和携带的道具相关,每个物品对应目的地的优先级与 区域加成 叠加就能获得每个地点被选择的概率。

每个目的地的 区域加成 初始值都为 30,道具的 决定地区 属性值可以提升对应地区内目的地的 区域加成,从而增加区域内所有的目的地被选择的概率。

部分道具可以直接限制选择到规定的地区。

3、呱是如何旅行的?

确定了地点之后,呱会开始旅行:

  1. 携带物品会决定蛙最长能旅行多久,6 ~ 72 小时不等。

  2. 初始体力由携带物品决定,以 100 为基数提升。(物品的具体属性参考下面的图鉴)

  3. 经过图上的一条路(边)的时候,道路的地形属性和所携带的物品属性互相作用,会决定呱实际消耗的时间和体力。

  4. 路上可能会遇见小伙伴,会在之后的旅行中结伴而行,从而出现在明信片中。

  5. 根据路途属性,有一定概率会寄相关的明信片。

  6. 当体力不支的时候,蛙必须停下来休息 3 小时,休息完之后体力会恢复到 100。休息时间也算作旅行时间。

  7. 当到达目的或者旅行时间耗尽的时候,蛙就会回家。

a、回家时会携带三叶草和抽奖券。

b、如果在时间耗尽前到达了目的地,蛙会在此基础上带回当地特产和收藏品。

所以如果你的蛙很久都没回家,回家了也没有带土特产,可能是路途上多次体力不支,晕倒在路边。(再也不怪蛙儿不想着给娘带土特产了,原来是娘把你饿着了)

4、呱在每条路上的耗时是怎么计算的?

5、呱离家出走了怎么办?

如果长时间没有准备便当,包里和桌上都没有食物,呱会愤然离家出走(どこかへ出かけています)。

这个时候在桌子上放上吃的,呱就会在 5~30 分钟内回家。

有趣的是,离家出走也算作成就计算中的旅行次数...emmmm。

6、道路有哪些属性?

连接不同地点之间的每条路 (edge) 都有以下几个属性:

  • **地形:**四种地形分别是 普通、大海、山地、洞穴

  • **耗时:**途径这条路的体力和时间损耗,分为基础耗时和地形增加耗时;呱需要跋山涉水自然会耗时久一点

  • **明信片概率:**明信片上不同元素出现的概率。据说所有的地图元素都有真实原型

  • **遇见伙伴:**遇见特定伙伴的概率

具体如下,不能再详细了

image.png

7、每件物品都有什么效果?

奉上这张吐血整理的物品效果图鉴:

有五类不同的物品:

  • **便当:**商店购买或者抽奖获得的食物

  • **幸运符:**除了四叶草和可以购买的幸 (tǔ) 运 (háo) 铃之外,都要抽奖获得

  • **道具:**商店购买

  • **特产:**呱旅游时获得

  • **收藏品:**特别的特产,通常在县府获得,无法使用

属性分类

HP

最大时间(小时)

决定蛙的旅行时间

初始体力提升(%)

增加一开始一鼓作气能旅行的距离

随机体力提升(%)

随机额外增加体力提升的最高百分点

物品几率:

  • 三叶草

获得三叶草数量

额外随机三叶草

随机额外获得的最大三叶草数量

  • 抽奖券

奖券数量

物品数量增多

增加获得目的地收藏品的概率

**决定地区:**对应地区被选中的概率,如果值为 D 则可以直接决定目的地所在区域

**移动速度:**根据地形不同,提升移动速度,减少途径所耗费的时间,在相同旅行时间内可以走更远

**朋友:**遇到特定旅行伙伴的概率

**遭遇地形:**途径特定地形时候获得相应明信片的概率

**FLAG 属性:**立一些特定的 Flag,主要影响成就系统,下面会写到

8、如何科学使用物品?

这里用几个例子来展示物品和路线结合的效果

1、决定想去的地区

携带的便当和抽奖获得的护身符(お守り)可以提升选择特定地区的概率。 抽奖获得的车票(きっぷ)可以直接决定所去到的地区。 例:想去北方,使用北国きっぷ。

2、影响路途的距离和时间

带 最大时间 值高的食物吃走得远,带 体力提升 值高的食物吃走得快耗时少。

3、快速通过沿途路线的地形

带有地区速度加成的食物或者道具,可以增加特定地形的移动速度。

不同物品的 移动速度 效果可以叠加,详情查看上面的解释。

4、匹配在道路上遇到的伙伴

如果在途径会遭遇伙伴的道路,特定物品可以增加实际遭遇概率

**例:**抽奖抽到的黄色ぼうろ(饼干)可以增加路途中遇到螃蟹的几率。

综合运用(敲黑板!!!)

呱想去秋田県男鹿市看灯塔


  1. 在地图上找到 秋田県(3022) 在北方。

  2. 便当选择 あさつきのピロシキ (葱饼?)可以提升去北方的概率。

  3. 携带  青色のお守り (蓝色护身符)可以提升去北方的概率。

  4. 如果有 北国きっぷ(北方车票?)可以直接决定去北方,上面的便当和护身符可以换别的。

  5. 通过目的地概率表发现携带各类帐篷前往 3022 目的地的概率更高。

  6. 查看可能的路线发现从起始点 3000 到 3022 之间会途径很多山路。

  7. 携带 ハイテクテント (高级帐篷?)增加山地移动速度更显著。

  8. 如果还有空余,可以带上 よつ葉(四叶草)或者 幸撙吴彛嵘匚锲返母怕省