最近的斗地主總是輸,要不就是玩着玩着有事去了,結果只能一直輸~
然后大腿一拍,我這斗地主實力不行,那不得Python來湊,讓AI來幫我贏取歡樂豆,實現財富自由,擼起袖子說干就干~
下面我們來介紹這個工具的制作,在開始之前,我創了一個Python的學習交流群
大家有什么問題都可以一起交流啥的,如果你還是零基礎,小編也准備了資料,都免費送給各位,大家一起進步~
這款出牌器是基於DouZero開發的,核心需要利用訓練好的AI模型來幫住我們給出最優出牌方案。
關於出牌器,先要需要確認一個AI出牌角色,代表我們玩家自己。
我們只要給這個AI輸入玩家手牌和三張底牌。確認好地主和農民的各個角色,告訴它三個人對應的關系,這樣就可以確定隊友和對手。
我們還要將每一輪其他兩人的出牌輸入,這樣出牌器就可以根據出牌數據,及時提供給我們最優出牌決策,帶領我們取得勝利!
那么如何獲取三者之間的關系呢?
誰是地主?誰是農民?是自己一人作戰還是農民合作?
自己玩家的手牌是什么?三張底牌是什么?這些也都需要在開局后確認好~
拆解需求,大致可以整理出核心功能如下:
UI設計排版布局
顯示三張底牌
顯示AI角色出牌數據區域,上家出牌數據區域,下家出牌數據區域,本局勝率區域
AI玩家手牌區域
AI出牌器開始停止
手牌和出牌數據識別
游戲剛開始根據屏幕位置,截圖識別AI玩家手牌及三張底牌
確認三者之間的關系,識別地主和農民角色,確認隊友及對手關系
識別每輪三位玩家依次出了什么牌,刷新顯示對應區域
AI出牌方案輸出
加載訓練好的AI模型,初始化游戲環境
每輪出牌判斷,根據上家出牌數據給出最優出牌決策
自動刷新玩家剩余手牌和本局勝率預測
1、UI設計排版布局
根據上述功能,我們首先考慮進行簡單的UI布局設計,這里我們使用的是pyqt5。核心設計代碼如下:
實現效果如下:
2.、手牌和出牌數據識別
下面我們需要所有撲克牌的模板圖片與游戲屏幕特定區域的截圖進行對比,這樣才能獲取AI玩家手牌、底牌、每一輪出牌、三者關系(地主、地主上家、地主下家)。
識別AI玩家手牌及三張底牌:
我們可以截取游戲屏幕,根據固定位置來識別當前AI玩家的手牌和三張底牌。核心代碼如下:
效果如下所示:
地主、地主上家、地主下家:
同理我們可以根據游戲屏幕截圖,識別地主的圖標,確認地主角色。核心代碼如下:
這樣我們就可以得到玩家AI手牌,其他玩家手牌(預測),地主三張底牌,三者角色關系,出牌順序。核心代碼如下:
效果如下:
3、AI出牌方案輸出
下面我們就需要用到DouZero開源的AI斗地主了。DouZero項目地址:https://github.com/kwai/DouZero。我們需要將該開源項目下載並導入項目中。
創建一個AI玩家角色,初始化游戲環境,加載模型,進行每輪的出牌判斷,控制一局游戲流程的進行和結束。核心代碼如下:
到這里,整個AI斗地主出牌流程基本已經完成了。
按照上述過程,這款AI出牌器已經制作完成了。
后面應該如何使用呢?
如果不想研究源碼,只想使用這款AI斗地主出牌器,驗證下效果,該怎么配置環境運行這個AI出牌器呢?
下面就開始介紹。
1、環境配置
首先我們需要安裝這些第三方庫,配置相關環境,如下所示:
2、坐標調整確認
我們可以打開歡樂斗地主游戲界面,將游戲窗口模式下最大化運行,把AI出牌器程序窗口需要移至右下角,不能遮擋手牌、地主標志、底牌、歷史出牌這些關鍵位置。
其次我們要確認屏幕截圖獲取的各個區域是否正確。如果有問題需要進行區域位置坐標調整。
3、運行測試
當所有環境配置完成,各區域坐標位置確認無誤之后,我們就可以直接運行程序,測試效果啦~
首先我們運行AI出牌器程序,打開歡樂斗地主游戲界面,進入游戲。當玩家就位,手牌分發完畢,地主身份確認之后,我們就可以點擊畫面中開始按鈕,讓AI來幫助我們斗地主了。