1. 程式人生 > >《旅行青蛙》的程式碼揭祕,攻略,體驗

《旅行青蛙》的程式碼揭祕,攻略,體驗

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

為了理解你們的呱究竟在幹什麼,逆向遊戲程式邏輯,提取各種資料。

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

  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),代表連線地點的路,這些路上也會觸發 遇上夥伴、拍攝照片 等事件。

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

  • 選擇目的地

    攜帶特點食物或道具可以影響到地區的選擇,有些物品可以增加特定地區的被選概率,甚至可以直接確定選擇的地區。在一個區域內的目的地的選擇同樣取決於所攜帶的道具。具體每件物體效果會在後面提到。

  • 選擇途徑地

    途徑地由目的地決定,每個地點都有對應的途徑地,程式碼中對此的描述是當地的縣府 / 交通樞紐。

  • 選擇繞路地
    這個很有意思,我猜測作者的目的是為了讓旅途更有多樣性,每次路途會額外新增幾個地區內繞路地點,攜帶物品對決定繞路地似乎沒有影響。
  • 生成經過所有地點的旅行路徑
    運用了圖論很經典的連通圖找最短路徑 Dijkstra 演算法,配合途徑地和繞路地的邏輯,最終計算出旅行路徑。

目的地是怎麼選擇的?
這裡寫圖片描述

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

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

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

呱是如何旅行的?

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

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

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

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

呱在每條路上的耗時是怎麼計算
這裡寫圖片描述

呱離家出走了怎麼辦?

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

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

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

道路有哪些屬性?

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

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

具體如下,不能再詳細了:
這裡寫圖片描述

每件物品都有什麼效果?

奉上這張吐血整理的物品效果圖鑑:
這裡寫圖片描述

這裡寫圖片描述

有五類不同的物品

  • 便當
    商店購買或者抽獎獲得的食物
  • 幸運符
    除了四葉草和可以購買的幸 (tǔ) 運 (háo) 鈴之外,都要抽獎獲得
  • 道具
    商店購買
  • 特產
    呱旅遊時獲得
  • 收藏品
    特別的特產,通常在縣府獲得,無法使用

屬性分類:

  • HP

    • 最大時間(小時)
      決定蛙的旅行時間
    • 初始體力提升(%)
      增加一開始一鼓作氣能旅行的距離
    • 隨機體力提升(%)
      隨機額外增加體力提升的最高百分點
  • 物品機率

    • 三葉草
      獲得三葉草數量
    • 額外隨機三葉草
      隨機額外獲得的最大三葉草數量
    • 抽獎券
      獎券數量
    • 物品數量增多
      增加獲得目的地收藏品的概率
  • 決定地區
    對應地區被選中的概率,如果值為 D 則可以直接決定目的地所在區域

  • 移動速度
    根據地形不同,提升移動速度,減少途徑所耗費的時間,在相同旅行時間內可以走更遠
  • 朋友
    遇到特定旅行夥伴的概率
  • 遭遇地形
    途徑特定地形時候獲得相應明信片的概率
  • FLAG 屬性
    立一些特定的 Flag,主要影響成就係統,下面會寫到

如何科學使用物品?

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

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

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

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

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

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

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

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

這裡寫圖片描述
這裡寫圖片描述

旅途中會帶回哪些特產?

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

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

朋友什麼時候會來訪?

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

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

朋友來訪應該投喂什麼?

給來訪的朋友投喂會獲得三葉草和抽獎券的回禮:
這裡寫圖片描述
在此基礎上,投喂帶有稀有 FLAG 屬性的物品會多獲得 20 根三葉草,多獲得 1~4 張抽獎券。

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

為了達到最好效果,最好換四種不同的禮物輪流投喂,具體可以參照下面的喜好表格:
這裡寫圖片描述

三葉草多久會長好?

這裡寫圖片描述

這裡寫圖片描述

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

四葉草獲得的概率是?

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

抽獎球的概率是?

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

如何獲得成就?

蛙旅行的時候會立一些 Flag,我從程式碼中整理了一下觸發的條件:
這裡寫圖片描述

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

這裡寫圖片描述