再探 游戲 《 2048 》 —— AI方法—— 緣起、緣滅(1) —— Firefox瀏覽器下自動運行游戲篇


四年前曾經寫過一過博客:

對 游戲 《 2048 》 的一些思考

 

雖然過去幾年了,但是這個游戲一直沒有搞懂該怎么使用AI算法來進行求解,這里再次對這個問題進行一些探索。

 

 

 

========================================

 

 

 

首先說明下,這個《2048》游戲確實很火,自己當年也是好一通研究,最后還是無疾而終,最近無意間又想起這個東西來了,正好這幾年也是在從事AI方面的事情,想想自己這么長時間的一些積累或許可以再次嘗試這個游戲的AI解決了。

這個《2048》游戲的AI解決難易適中,不想圍棋那種需要Alpha go這種龐大的算法和計算平台要求,但是又不能依靠簡單的遍歷搜索來訓練較好的解決方案,在一定level上來說這個游戲的難易度很適合個人AI玩家來嘗試和練手的。

 

AI算法並不同於機器學習算法,應該說AI算法是包括機器學習算法的,或者說機器學習算法是AI算法的一個子集。只要可以替代人類腦力或體力去自動化解決問題的算法我們都可以認為是AI算法,也就是說AI算法就是可以模仿人類功能的計算機算法,而機器學習算法是指通過數據不斷訓練來使算法學習到適合的模型參數或模型結構的方法,機器學習主要體現在兩個點:一個是原來訓練和學習的數據;一個是可以根據數據來進行訓練的學習,學習模型參數或模型結構。

 

 

 

外網對於《2048》游戲的AI解法早有討論,比較有代表性的為:

What is the optimal algorithm for the game 2048?

 

 

其中,投票率最高的解決方法是啟發式AI算法:

 

 

 

該啟發式AI方法的github代碼地址:

https://github.com/nneonneo/2048-ai

 

 

 

該代碼clone在國內gitee代碼庫上:

https://gitee.com/devilmaycry812839668/highest_vote_2048_ai

 

 

 

 

=========================================================

 

 

 

 

我們這里主要是針對投票率最高的對應的啟發式算法 鬼&泣 / 2048-ai 進行分析。

 

 

啟發式算法,某種程度上我們可以將其理解為基於預設規則的算法。人類解決某件事情所采用的方法可以理解為人類的策略或規則,但是人類針對某件事情所采用的策略或規則很難翻譯成計算機語言,那么如何把人類的策略翻譯成計算機可以識別並執行的策略呢?根據計算機可以識別並執行的策略或規則所設計的算法我們一般叫做啟發式算法。

 

 

在《2048》游戲中人類在打游戲時所采用的策略一般有:

參考:https://soft.zol.com.cn/jingyan/59663.html

 

高分法則:

最大數盡可能放在角落。

數字按順序緊鄰排列。

首先滿足最大數和次大數在的那一列/行是滿的。

時刻注意活動較大數(32以上)旁邊要有相近的數。

以大數所在的一行為主要移動方向

不要急於“清理桌面”。

需要注意的是,為了保持最大數在角落,所有最大數可能移動的方向都不能再操作了,比如選擇了左上角,那么就不能向右和向下移動其他的方塊,這樣操作的靈活性會相對減少,難度就會增加。這時,建議玩家除了選定一個角以外,再固定一條邊,將大的數字放這條邊上,這樣就可以朝三個方向移動,比如選定左上角,填滿最大數右邊的所有方塊,就可以朝上,左,右三個方向移動了。

 

 

經過分析可以知道在《2048》游戲中我們人類在操作時所遵循的規則一般有:保證最大的數字和第二大的數字在角落上不動,這邊我們需要保證最大數字的一邊被其他數字填滿,這樣的話保證最大數字不動的前提下可以有三個方向可以被用來操作。

根據 https://stackoverflow.com/questions/22342854/what-is-the-optimal-algorithm-for-the-game-2048 中最高投票率的回帖,我們需要遵守的規則還可以有:保證最大可能性有空格出現,最大可能性有一行或一列中有相同數字挨着的出現(可以在下一步中被合並),盡量保證每行或每列都是保證單調增或減的數字排列等。

可以看到人類的策略雖然人類用來理解還是可以的,但是如何翻譯成計算機可以理解的語言呢,從而根據計算機可以理解的語言或規則編寫出啟發式算法呢。在  鬼&泣 / 2048-ai  中則把不同情況的游戲畫面(數字排序順序)根據剛才人類的評價和遵循規則給出評分,並根據某步操作后獲得的后續操作得到的畫面加權值最高(最高得分)來給出下一步的操作,該種方式所設計的啟發式算法被證明可以有效的解決《2048》游戲。

 

 

 

============================================

 

 

下面給出在  鬼&泣 / 2048-ai   中對在Firefox瀏覽器下自動運行游戲《2048》。

具體見: https://gitee.com/devilmaycry812839668/highest_vote_2048_ai/tree/devilmaycry

 

在Firefox瀏覽器中自動運行游戲,其原理就是利用瀏覽器調試模式下可以自動運行傳入的js腳本,從而實現在瀏覽器中調試js程序的目的。由於《2048》游戲一般均為js語言編寫的,我們打開游戲的原始頁面則會自動在瀏覽器中加載《2048》游戲的js代碼,然后我們在Firefox瀏覽器開啟調試模式情況下為該頁面注入自己編寫的js代碼來實現獲得《2048》游戲的狀態信息和得分情況,同時我們還可以通過注入JS代碼的方式模擬鍵盤操作來實現自動操控《2048》頁面游戲的目的。

 

 

 

使用Firefox瀏覽器進行調試需要設置瀏覽器:

 

 

瀏覽地址框中輸入 about:config

 

 

設置選項:

  • devtools.debugger.prompt-connection 為 false
  • devtools.debugger.remote-enabled 為 true
  • devtools.chrome.enabled 為 true

 

 

 

 

 

 

 

 

 

 

 

============================================

 

 

設置好Firefox后需要關閉瀏覽器。 

 

再次打開Firefox需要采用運行命令行的方式啟動Firefox:

 

 

firefox --start-debugger-server 32000

 

 

 

 

使用Firefox瀏覽器運行一次:

brower_autorun/2048_demo.py -b firefox
 

使用Firefox瀏覽器運行100次: (把100次的運行結果保存在調用命令執行的當前目錄下的result.log)

brower_autorun/2048_100times_evalue.py -b firefox 
 

執行上面命令結果將被保存在highest_vote_2048_ai文件夾下面result.log文件中:

result.log 中保存的結果格式為:score, maxval, elapse_time, moveno
含義為: 得分,最大數,總運行時長(秒),總執行步數
 

 

 

 

 

 

 

 

=============================================

 

 

 

在  2048_100times_evalue.py 中:

 

 

 

 

如果返回的游戲狀態字段為"ended",那么則意味則游戲是結束狀態。

游戲表現形式為:

 

 

 

如果游戲狀態為“ended”后需要調用  gamectrl.restart_game()  方法來獲取新一局的游戲。

 
 
 

 

 

對於游戲狀態為 “win”  時需要調用  gamectrl.continue_game() 方法,該方法的使用意義並不是很了解,因為是follow其他人的工作,所以也就這樣承接下來這個操作了。

 

 

 

 

 

 

 

 

 

 獲取當前游戲的得分值:

 

 

 

 

 

 

 

獲取當前游戲的狀態值:

 

 

 

 獲得的board為16個元素的列表,每個元素取值范圍為0~15,形式如:

[

[3,0,1,2],

[4,5,6,7],

[8,9,10,11],

[12,13,14,15],

]

 

 

如果進行狀態打印的話我們需要把每個元素x 進行2**x 操作。

 

 

如果進行算法可以識別的形式,需要如下操作:

 

 

 

 

 

=============================================

 

 

在《2048》游戲中, 行為2 2 2 2,右移得 0 0 4 4, 再次右移得 0 0 0 8 。

 

 

 

=============================================

 

 

 

在maser分支中,編譯代碼( ubuntu系統中 ):

./configure

make

 


 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM