旅行青蛙完整代碼解析!青蛙旅行居然有路線圖!(物品獲得機率、訪客觸發條件、離家出走時間分析)

(原文由於知乎網友黃小秋撰寫,蘋果仁授權轉載)

青蛙走火入魔-逆向遊戲代碼-終結玄學迷信

看到很多人對物品的使用上的很多猜測,很多都不是很準確。

為了理解你們的青蛙究竟在幹什麼,花了五個晚上逆向遊戲程序邏輯,提取各種數據。

這里相當於動用了上帝視角來解答這些問題。

答案將會陸續更新。


2018/1/31 更新4

  • 更正區域、目的地選擇的邏輯

2018/1/30 更新3

  • 更正收藏品收集機率為15%,並非100%

2018/1/30 更新2

  • 增加4.青蛙在每條路上的耗時是怎麼計算的?

2018/1/30 更新

  • 增加5.青蛙離家出走了怎麼辦?
  • 增加8.如何科學使用物品?
  • 增加17.有沒有免費獲得三葉草的方法?

2018/1/29 更新

  • 增加15.抽獎球的機率是?


  1. 青蛙真的在旅行嗎?
  2. 青蛙是如何選擇旅行路徑的?
  3. 青蛙是如何旅行的?
  4. 青蛙在每條路上的耗時是怎麼計算的?
  5. 青蛙離家出走了怎麼辦?
  6. 道路有哪些屬性?
  7. 每件物品都有什麼效果?
  8. 如何科學使用物品?
  9. 旅途中會帶回哪些明信片?
  10. 旅途中會帶回哪些特產?
  11. 朋友什麼時候會來訪?
  12. 朋友來訪應該投餵什麼?
  13. 三葉草多久會長好?
  14. 四葉草獲得的機率是?
  15. 抽獎球的機率是?
  16. 如何獲得成就?
  17. 有沒有免費獲得三葉草的方法?

青蛙真的在旅行麼?

不得不佩服遊戲的設計者,為了追求真實,實現了一套非常完整的旅行模擬系統,有嚴謹的旅遊路線設計。

因為旅行的過程並不展示給用戶,我原本以為邏輯會十分簡單。發現這套旅行模擬系統的時候,我也有些驚訝,也促使我深入研究這款遊戲的邏輯。



下面的解釋中間會用到少量計算機圖論(graph theory) 的術語,但應該還是很直觀。

青蛙是如何選擇旅行路徑的?

程序內建東、西、南、北四個區域,青蛙會選擇一個地區旅行

每個區域的設計都是一個連通的無向圖(connected undirected graph),而青蛙的旅行路線就是在圖上某兩個點之間走出一條路徑(path)

通過逆向手段,我提取出了程序中的信息,花了一些時間用Graphviz 生成了每個地圖的樣子。

如果大家有興趣的話,我可以把原始數據上傳到Github

東部地區
西部地區
南部地區
北部地區

圖上的每個節點(vertex)都代表了一個地點。每個地點都有可能被蛙經過,並觸發一些事件。

除了普通的地點外,還有四種特殊的地點會影響青蛙旅行的路線:

  • START 起始點(帽綠色)
  • GOAL 目的地(桃紅色)
  • PATH 途徑地(橘黃色)
  • DETOUR 繞路地(淺黃色)

連接節點之間的是邊(edge),代表連接地點的路,這些路上也會觸發遇上夥伴、拍攝照片等事件。

每次開始旅行的時候,根據老母親(?)打包的物品,青蛙都會:

  1. 選擇目的地
    攜帶特點食物或道具可以影響到地區的選擇,有些物品可以增加特定地區的被選機率,甚至可以直接確定選擇的地區。在一個區域內的目的地的選擇同樣取決於所攜帶的道具。具體每件物體效果會在後面提到
  2. 選擇途徑地
    途徑地由目的地決定,每個地點都有對應的途徑地,代碼中對此的描述是當地的縣府/交通樞紐。
  3. 選擇繞路地
    這個很有意思,我猜測作者的目的是為了讓旅途更有多樣性,每次路途會額外添加幾個地區內繞路地點,攜帶物品對決定繞路地似乎沒有影響。
  4. 生成經過所有地點的旅行路徑
    運用了圖論很經典的連通圖找最短路徑Dijkstra算法,配合途徑地和繞路地的邏輯,最終計算出旅行路徑。

目的地是怎麼選擇的?

這裡的數值不是絕對機率而是相對的優先級

具體目的地的選擇就和攜帶的道具相關,每個物品對應目的地的優先級與區域加成疊加就能獲得每個地點被選擇的機率。

每個目的地的區域加成初始值都為30,道具的決定地區屬性值可以提升對應地區內目的地的區域加成,從而增加區域內所有的目的地被選擇的機率。

部分道具可以直接限制選擇到規定的地區(D)。

青蛙是如何旅行的?

確定了地點之後,青蛙會開始旅行:

  1. 攜帶物品會決定蛙最長能旅行多久,6 ~ 72小時不等。
  2. 初始體力由攜帶物品決定,以100為基礎提升。
    * 物品的具體屬性參考下面的圖鑑
  3. 經過圖上的一條路(邊)的時候,道路的地形屬性和所攜帶的物品屬性互相作用,會決定青蛙實際消耗的時間和體力。
  4. 路上可能會遇見小伙伴,會在之後的旅行中結伴而行,從而出現在明信片中。
  5. 根據路途屬性,有一定機率會寄相關的明信片。
  6. 當體力不支的時候,蛙必須停下來休息3小時,休息完之後體力會恢復到100。休息時間也算作旅行時間。
  7. 當到達目的或者旅行時間耗盡的時候,蛙就會回家。
    1. 回家時會攜帶三葉草和抽獎券。
    2. 如果在時間耗盡前到達了目的地,蛙會在此基礎上帶回當地特產和收藏品。

所以如果你的蛙很久都沒回家,回家了也沒有帶土特產,可能是路途上多次體力不支,暈倒在路邊。


青蛙在每條路上的耗時是怎麼計算的?

設:
t_{text{way}}為當前道路耗時
t_{text{plus}}為當前道路的地形增加耗時
w為當前道路的地形,win left{ text{Normal}, text{Mountain}, text{Sea}, text{Cave} right}
n為攜帶物品數量
E_{text{Normal}}(x),E_{text{Mountain}}(x),E_{text{Sea}}(x),E_{text{Cave}}(x),E_{ text{All}}(x)依次為攜帶的第x件物品中所有具有普通、山地、大海、洞穴、任意地形移動速度的效果值。

如果當前道路是普通地形,則耗時因疊加移動速度效果而減少:

t_w= t_{text{way}}timesprod_{x=1}^{n}{(0.01times(100-E_{text{Normal}}{(x)}))}
或者如果當前道路是山地、大海、洞穴地形,基礎耗時不變,地形增加耗時因疊加移動速度效果而減少:
t_w=t_{text{way}}+t_{text{plus}}timesprod_{x=1}^{n}{(0.01times(100-E_{w}{(x)}) )}
如果攜帶了乳蛋餅(のびるのキッシュ)這種全地形移動速度提升的物品,則會在此基礎上再次疊加移動速度效果:
t_{text{final}}=t timesprod_{x=1}^{n}{(0.01times(100-E_{text{All}}{(x)}))}
最終獲得的t_{text{final}}就是該條道路上的實際耗時。

青蛙離家出走了怎麼辦?

如果長時間沒有準備便當,包包裡和桌上都沒有食物,青蛙會憤然離家出走(どこかへ出かけています)。

這個時候在桌子上放上吃的,青蛙就會在5~30 分鐘內回家。

有趣的是,離家出走也算作成就計算中的旅行次數…emmmm。

道路有哪些屬性?

連接不同地點之間的每條路(edge) 都有以下幾個屬性

  • 地形
    四種地形分別是普通、大海、山地、洞穴
  • 耗時
    途徑這條路的體力和時間損耗,分為基礎耗時和地形增加耗時
    青蛙需要跋山涉水自然會耗時久一點
  • 明信片機率
    明信片上不同元素出現的機率
    據說所有的地圖元素都有真實原型
  • 遇見夥伴
    遇見特定夥伴的機率

具體如下,不能再詳細了

每件物品都有什麼效果?

奉上這張吐血整理的物品效果圖鑑:

有五類不同的物品

  • 便當
    商店購買或者抽獎獲得的食物
  • 幸運符
    除了四葉草和可以購買的幸(ㄎㄜˋ)運(ㄐㄧㄣ)鈴之外,都要抽獎獲得
  • 道具
    商店購買
  • 特產
    青蛙旅遊時獲得
  • 收藏品
    特別的特產,通常在縣府獲得,無法使用

屬性分類

  • HP
    • 最大時間(小時
      決定蛙的旅行時間
    • 初始體力提升(%)
      增加一開始一鼓作氣能旅行的距離
    • 隨機體力提升(%)
      隨機額外增加體力提升的最高百分點
  • 物品機率
    • 三葉草
      獲得三葉草數量
    • 額外隨機三葉草
      隨機額外獲得的最大三葉草數量
    • 抽獎券
      獎券數量
    • 物品數量增多
      增加獲得目的地收藏品的機率
  • 決定地區
    對應地區被選中的機率,如果值為D則可以直接決定目的地所在區域
  • 移動速度
    根據地形不同,提升移動速度,減少途徑所耗費的時間,在相同旅行時間內可以走更遠
  • 朋友
    遇到特定旅行夥伴的機率
  • 遭遇地形
    途徑特定地形時候獲得相應明信片的機率
  • FLAG屬性
    立一些特定的Flag,主要影響成就係統,下面會寫到

如何科學使用物品?



這裡用幾個例子來展示物品和路線結合的效果

  1. 決定想去的地區
    攜帶的便當和抽獎獲得的護身符(お守り)可以提升選擇特定地區的機率。抽獎獲得的車票(きっぷ)可以直接決定所去到的地區。
    例:想去北方,使用北國きっぷ。
  2. 影響路途的距離和時間
    最大時間值高的食物吃走得遠,帶體力提升值高的食物吃走得快耗時少。
  3. 快速通過沿途路線的地形
    帶有地區速度加成的食物或者道具,可以增加特定地形的移動速度。
    不同物品的移動速度效果可以疊加,詳情查看上面的解釋。
  4. 匹配在道路上遇到的伙伴
    如果在途徑會遭遇夥伴的道路,特定物品可以增加實際遭遇機率
    例:
    抽獎抽到的黃色ぼうろ(餅乾)可以增加路途中遇到螃蟹的機率。

綜合運用(敲黑板!!!)

青蛙想去秋田県男鹿市看燈塔

  1. 在地圖上找到秋田県(3022) 在北方。
  2. 便當選擇あさつきのピロシキ(蔥餅?)可以提升去北方的機率。
  3. 攜帶 青色のお守り(藍色護身符)可以提升去北方的機率。
  4. 如果有北國きっぷ(北方車票?)可以直接決定去北方,上面的便當和護身符可以換別的。
  5. 通過目的地機率表發現攜帶各類帳篷前往3022 目的地的機率更高。
  6. 查看可能的路線發現從起始點3000 到3022 之間會途徑很多山路。
  7. 攜帶ハイテクテント(高級帳篷?)增加山地移動速度更顯著。
  8. 如果還有空餘,可以帶上よつ葉(四葉草)或者幸運の鈴,提升帶回物品的機率。

旅途中會帶回哪些明信片?

途徑每條道路上會遇到的明信片元素都有很明確的機率。

普通的明信片是自動合成的。根據道路元素、所攜帶道具、遇到的同行小伙伴,程序會選擇合適的背景、前景和青蛙和小伙伴的pose,合成完整的明信片。粗略計算,有120 種左右的組合。

幾種不同的pose

有一些帶有特定的故事情節明信片是單張繪製的,這裡也可以看出遊戲製作者的用心:迷路和小伙伴看地圖通常出現在地圖的邊緣,冷清下水道一般出現在四通八達的城市交通樞紐。

迷路的青蛙
路邊的排水渠

旅途中會帶回哪些特產?

上面提到了,成功到達目的地(GOAL)的時候才會獲得特產,收藏品的獲得機率是15%,其他物品的機率如下:

遊戲代碼中有收藏品收集三次必定成功的設定,但是實際上並未啟用,可能在之後的版本中會引入

朋友什麼時候會來訪?

蝸牛、蜜蜂和烏龜會時不時來訪。來訪停留的時間180~270 分鐘。

蜜蜂需要有至少3 件收藏品才會出現,烏龜需要有至少6 件收藏品。

朋友來訪應該投餵什麼?

給來訪的朋友投餵會獲得三葉草和抽獎券的回禮:

在此基礎上,投餵帶有稀有FLAG 屬性的物品會多獲得20 根三葉草,多獲得1~4 張抽獎券。

朋友會記住最近三次的食品。連續投餵同一種物品,獲得回禮的數量會降低。

為了達到最好效果,最好換四種不同的禮物輪流投餵,具體可以參照下面的喜好表格:

三葉草多久會長好?

花壇中總共有20 根三葉草。

三葉草割完之後重生的時間是遵循mu=7200,sigma=1800的正態分佈在[300, 14400]的區間:

每一根都是獨立重生的。最短5 分鐘(300 秒),最長4 小時(14400 秒) 重生。

四葉草獲得的機率是?

完成教程後會自動誕生第一顆四葉草,除此之外,每一根三葉草重生的時候都有1%的機率成為四葉草。

抽獎球的機率是?

  • 白:60%
  • 藍:27%
  • 綠:9%
  • 紅:3%
  • 金:1%

如何獲得成就?

蛙旅行的時候會立一些Flag,我從代碼中整理了一下觸發的條件:

這也是玄學錯誤迷信的一個地方。使用稱呼對遊戲其他部分沒有任何影響,不會改變獲得物品和明信片獲得機率,也不會影響出門時長。

有沒有免費獲得三葉草的方法?

你猜?