鬥地主AI出牌

2021-10-05 11:37:38 字數 2116 閱讀 3083

鬥地主遊戲的初期版本目前為止大概已經完成的一半了…

還剩下最麻煩的部分(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.

鬥地主出牌演算法

根據鬥地主出牌規則.對玩家出的牌進行檢驗.判斷是否符合出牌規則.關於鬥地主的出牌規則網上有很多 思路 將玩家的牌按公升序排序.然後將牌進行拆分,分存在4個陣列中.拆分規則如下 假設有牌 333 444 555 789 則拆分後陣列中的資料如下 arr 0 345789 arr 1 345 arr 2...

鬥地主AI演算法 第七章 被動出牌 1

哎,之前扯了那麼多蛋,終於講出牌了!本章開始講被動出牌的邏輯演算法。首先我們先把架子搭起來,被動出牌我們肯定是要知道場上目前打出的是什麼牌型。在第二章資料結構裡我們定義過,遊戲全域性類裡面有乙個存放當前牌型結構的成員,即 當前打出牌的型別資料,被動出牌時玩家根據這裡做出篩選 cardgroupdat...

鬥地主AI演算法 第十三章 主動出牌 2

上一章我們已經搭好了出牌演算法的基本框架,本章主要實現優先處理的三帶 飛機等牌型。首先定義一些基本變數 cpp view plain copy 暫存最佳的價值 handcardvalue besthandcardvalue besthandcardvalue.needround 20 besthan...