斗地主游戲的初期版本目前為止大概已經完成的一半了...
還剩下最麻煩的部分(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.
注意:暫時沒有考慮同隊傷害.
