鬥地主遊戲的初期版本目前為止大概已經完成的一半了…
還剩下最麻煩的部分(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...