斗地主AI出牌


斗地主游戲的初期版本目前為止大概已經完成的一半了...

還剩下最麻煩的部分(AI)沒寫,寫這篇博文主要是想理一下基本的思路,然后把這一部分也搞完.

先上一個目前的進度截圖紀念一下好了尷尬

 

經過較長時間的冥思苦想,包括網上找資料...(網上關於斗地主AI的資料很少.)

終於想到了一個大概可行的辦法~先寫出來試試吧..

 

斗地主的AI部分主要分為兩塊:

一個是主動出牌.(自己是第一個出牌的,或者上一把打出的牌沒有人要,又輪到自己了) ---這時候就需要從當前的手牌中選取一道合適的牌打出.

怎樣選取呢?這正是要解決的問題.

還有一個是被動出牌,也就是根據上家的牌,從自己的手牌中選取一道比較好的牌打出.

這一個比第一個要麻煩一點,因為涉及到了大小的比較,同隊之間的配合等等因素.

 

怎樣從當前手牌中選取一道比較科學的牌呢?

如果我的手牌中有單牌,有對牌,有炸彈,剛上來肯定是出單牌或者對牌,而不是炸彈,(因為炸彈是用來炸別人的)

所以要想得到一個比較好的出牌,就必須遵循一定的規則

(Nothing can be accomplished without norms or standards.)

.....

我的想法是這樣的

 

首先應該掃描整幅手牌,看一下有哪些類型的牌.
這一過程"斗地主業界"稱之為拆牌 大笑
 
比如 334445778910JJJJQK2這樣的一副爛手牌.
憑借我多年的打牌經驗,我覺得應該這樣拆:
[JJJJ(炸彈)] [33444(三帶二)] [5,8,9,10,Q,K,2(單牌)] (不過這破手牌,怎么拆也是輸~)
 
下面就來看一下怎樣分牌才能達到我們想要的效果~
考慮采用4個輔助數組來拆牌
我們將它分成如下的四個數組.
(0)--34578910JQK2
(1)--347J
(2)--4J
(3)--J
然后可以通過這四個數組,得到一個較好的出牌.
 
首先,我們定義一些牌型組,每個牌型組放該類型的牌,牌型組包括:單牌組,單順組,對牌組,雙順組,三牌組,三帶一組,三帶二組,炸彈組,火箭組.
(這里為什么沒有四帶二組,飛機組呢,因為我覺得這兩種牌沒什么震懾力,就是一攪屎棍子~)
 
下面是我總結的一些規律:
  • 在四個數組中,下面的每個數組都是上面數組的子數組.(所以,我們可以由下往上依次掃描各個數組)
  • 如果第四個數組中有元素,則該組手牌中一定有炸彈.(我認為炸彈的作用非常大,所以遇到炸彈應該直接提取出來)
  • 第四個數組變為空時,就掃描第三個數組,第三個數組中的元素一定對應三張相同的牌.(根據這些牌,可以找到三帶一,三帶二等)
  • 另:[鼓勵三帶一,三帶二,但不鼓勵飛機,四帶二,這樣一是可以降低復雜度,二是四帶二沒有什么價值].
  • 找單牌(存在與第一個數組中,而不存在於第二個數組中的,一定是單牌,找出單牌后,還應該判斷能不能組成單順)
  • 找雙順(從第二個數組中找,但是雙順最好不要拆三牌,因為三牌的價值大於雙順)
  • 找單順,肯定是在第一個數組中找~(要單順還是要對牌是一個比較糾結的問題,可以制定一個標准)
  • 最后總結一下找牌的順序,就可以開始編碼了.
(順序很重要,好的順序才能拆出好的牌,下面是我總結的拆牌順序~)
0.找一下有沒有火箭,有的話放入火箭組.
1.找出所有的炸彈,放入炸彈組.
2.找出所有的單牌,放入單牌組.
3.找出三牌,放入三牌組.
4.找出所有的對牌,放入對牌組.
5.找出單牌組中的單順,放入單順組.
6.找出對牌組中的雙順,放入雙順組.
7.將三牌組與單牌組的元素依次結合,放入三帶一組.
8.將三牌組與對牌組的元素依次結合,放入三帶二組
9.注意:三帶一不能帶大小王,單順不能帶2和大小王,雙順和三順不能帶2.
 
基於上面的步驟,我們就可以找到一個較好的出牌了~
0.如果是主動出牌,掃描順序為:
單牌組,單順組,對牌組,雙順組,三牌組,三帶一組,三帶二組,炸彈組,火箭組.
出第一個找到的牌即可.
1.如果是被動出牌.
----0.首先找同類型組中比上家大的牌,如果有,出牌.
----1.如果沒有,就評估一下是否值得出炸彈,如果值得,則到炸彈組中找,出炸彈.如果不值得,pass.
----2.沒有炸彈,就到火箭組中找,出火箭.沒有火箭,pass.
 
注意:暫時沒有考慮同隊傷害.


免責聲明!

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



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