前往
大廳
主題

用程式來解遊戲任務(Dying light 2 尋寶任務解謎篇)

播磨拳兒 | 2022-04-19 22:38:38 | 巴幣 104 | 人氣 293

本篇建議可在Medium上閱覽, 體驗更佳


這一篇, 我想用遊戲的角度來思考程式設計
藉由遊戲的角度也可以來練習程式的邏輯思考

遊戲: 消逝的光芒2 Dying light 2

有個支線的尋寶任務是這樣的
起初, 我真的很認真的把所有的字, 一字不露的打在電腦上
在那邊AABABABABABABBABAAABABABABABBABAAAB
眼睛都要脫窗了
接著就開始埋頭解題目
後來仔細想想
為何我不能用擅長的程式來解決問題
所以就開始著手寫:
(以下用Kotlin示範)


首先, 先把題目弄出來
不用到自己手打那麼辛苦啦
有種東西叫『文本掃描』
Line自己本身就有自帶此功能
就藏在QR掃描裡面
文字一字不露的全部截下來囉
再來用一個變數把題目存起來
接下來, 要思考的是『如何把規則定義出來』
我思考的方向是 『每5個比對一次 比對過後把對應的單字取出』
所以我就用hash map來處理
把單字當key, 比對的規則當value
也就是說
如此一來, 我比對到我的value, 就把我的key取出來組成完整答案
所以, 來寫規則
接下來要思考的是『如何把密碼每5個當一組取出來』
這部分我就借助正規表示法來解決
這裡提供一個我很常用來測試正規表示的網頁
詳細用法如下圖
接著, 先跳開程式碼, 來玩Regex啦
答案只有A和B
其他文字不需要, 所以
不過這樣也只是取出所有的AB而已
因為你不知道是A還是B開頭, 且5個字為一組, 所以
這樣一來, 正規表示已經組好啦
可以回到程式碼, 把剛剛組好的正規表示貼上來(網頁別關, 還有用)
詳細正規表示法的使用方式, 可參考這個網站 ->『Give me pass 惡補筆記
下一步, 把Regex條件寫進來, 並且搜尋
基本上, findAll會回傳所有匹配regex的結果
也就是剛剛在網頁上組出來之後, 藍色的搜尋結果
所以他會回傳的格式是一整個陣列
陣列可以用for迴圈逐一取出
所以就用foreach把所有比對到的的值逐一取出
這邊的match已經是『5個一組』的結果
所以就可以拿來跟map來比對囉
別忘記要降冪表示lowercase()
因為題目給的都是大寫的AB
而對應表內的都是小寫
基本上, 答案已經出來了
只是看不出來單字跟單字之間該如何拆
所以我們就把正規表示法稍微調整一下
把『換行』和『標點符號』和『空白』都加進條件內
回到測試的網頁上, 打開列表
從這邊可以知道, 『\s』是空白的意思
要比對標點符號, 可以直接加『\』跳脫
條件是『A或B』或是『,』或是『.』或是『空白』
所以, 想到啥條件就逐一加上來吧
但是由於我們正規表示加了新的條件
也就是說match可能會出現『,』『.』『空白』
所以for迴圈已經無法適用, 所以我們改用StringBuilder來組吧
問題來了
拿掉for迴圈就少了判斷, 少了判斷, 就沒有辦法用map的key來組
但是match到的東西又不一定是密碼
那我們就用when來寫判斷吧
m…..答案已經基本成型了
既然有語法糖, 我們來稍微簡化寫法吧
Map是屬於Collection類別下的子類別
Kotlin語法中自帶了foreach啦filterValues…等等的好用Extension
所以就改成
這裡要說明一下
it == match.value.lowercase()
是判斷條件
比對到了之後可以在keys裡面取得比對到的值
所以再用foreach逐一取出, 組到stringBuilder內
另外一個可以改的是正規表示法
雖然我們是想到就加想到就加
不過我們可以把它更簡化
既然『,』『.』『 』都不屬於文字
我們可以用『\W』(非文字)來表示
你可能會想『.』這樣取所有的值為何不行?
因為你會少掉『換行』
以下是『.』全部結果
以下是『\W』全部結果
最大差別除了最後一行以外
其他上面7行都有換行
也就是『\n』
另外
I&J 和 U&V比較麻煩
J沒有用到, 還可以刪掉
U&V是兩者都有
雖然是在不同地方
沒辦法, 也只能人眼辨識啦
所以, 最終答案
MUDDY
GROUNDS
WATER
TOWER
BASEMENT.
ZERO THREE,
TWO ONE, SIX
SEVEN .
總比你自己人腦判斷一個一個對來得快吧


總結:
先不說你看得懂看不懂遊戲的這個提示….
用程式來解任務
某種意義上來說, 又有寓教於樂的效果, 是吧!
組正規表示其實是件很好玩的事情
且對於寫程式有龜毛的人來說會很強大
還是你有更精簡的寫法? 歡迎來討論


題外話:
原來這種加密方式叫做『培根密碼』Wiki介紹
真的有這種加解密方式@@
還真是萬物皆有史啊


如果還有其他問題, 歡迎到我的Line群組 & 社群找我
本文亦同時刊載在Medium
或是有興趣一起交流Android相關技術
也可以在我個人創立的Line群組『Android交流讀書會』中找我
或是公開社群『Android Home

創作回應

更多創作