血戰麻將算法

1.      算法簡介

本文的麻將算法不是按人工智能的方式進行講解,本人從事遊戲服務器開發。因此該算法主要用於通常的麻將遊戲機器人,主要是讓機器人具備正常操做選擇。算法沒法與現實生活中的麻將高手進行對決,也沒有通過嚴格的數學論證,可是爲了應付麻將高手,會採起一些做弊的手段。因此本文除了講述麻將算法,還將會說起麻將做弊的方式,以及該算法應用到實際機器人中對於機器人的等級劃分方法。 算法

該算法的核心宗旨是以權值驅動操做。因此本文將主要講述從如何合理的精確的計算權值。以及在加入做弊因素狀況下的權值計算方式。 服務器

 

2.      麻將算法

麻將算法的設計咱們將採用貪心算法,即讓機器人作出當前狀況下最好的選擇。 人工智能

血戰麻將:共108. 36張, 筒36, 條36張。 spa

麻將過程當中的操做:選缺牌,碰牌, 槓牌,胡牌, 出牌, 過。 設計

2.1權值定義

權值設置說明:根據血戰麻將規則定義相同花色相隔的牌爲最小權值單元,定義權值爲1. 對象

手牌權值計算方法:基礎權值+加成權值。 遊戲

基礎權值:相隔+1, 相鄰+2 2張相同+2,  3張相同+3,   4張相同+4,基礎全職計算對象包括手牌和碰牌以及槓牌,可是槓牌和碰牌以及收必須進行分開計算。 服務器開發

加成權值:牌張數加成,風險加成 開發

牌張數加成:根據當前花色牌的張數比,對當前花色權值進行加成。 數學

定義萬張數爲x,定義萬基礎權值爲y,則萬牌張數加成權值z=y*(1+x/14);

風險加成:根據當前已知狀況,出牌,碰牌,槓牌,胡牌所帶來的風險對手牌權值和進行加成。定義:定義當前手牌牌張數加成後權值和爲m,當前牌的風險係數爲β,則風險係數加成後的權值n= m*(1+β);

 

2.2基礎操做

 

本節根據玩家出牌動做對權值(不含風險加成)進行說明。

2.2.1        基礎權值與張數加成

1.基礎權值計算演示

2筒權值:與3筒相鄰+2, 與4筒相隔+1, 共:2+1=3

3筒權值:與2筒相鄰+2,與4筒相鄰+2,與5筒相隔+1,共:2+2+1=5

4筒權值:與2筒相隔+1,與3筒相鄰+2,與5筒相鄰+2,共:1+2+2=5

5筒權值:與4筒相鄰+2, 與3筒相隔+1, 共:2+1=3

4張牌權值和:3+5+5+3=16

 

3條權值:與334張相同+12,與5條相隔+1 12+1=13

5條權值:與4個三條相隔+4 共:4

5張牌權值和:4*13 +4 = 56

 

2筒權值:無相鄰,相同,相隔,權值爲0

5筒權值:0

9筒:與12張相同+2;共2

總共權值:0+0+2*2 = 4

說明:權值爲0的牌將在牌張數上面提高筒色總體權值。

 

條權值計算:

3條權值:與334張相同+12,共12

7天權值:與8條相鄰+2

8條權值:與7條相鄰+2

 

全部條的基礎權值:4*12 + 2 + 2 =52

 

全部筒的權值:3(1)+3(1)+3(3)+ 3(4) +2(6) +3(8) +2(9) = 19

全部條的權值:2(1) +3(2)+ 4(4) +5(5) +5(6) +3(7)=17

筒基礎權值:19

條基礎權值:17

牌張數加成後權值:筒權值:19*(1+7/14)=28   條權值:17*(1+6/14)=24

全部手牌加成後的權值和:28+24=52

 

2.2.2        缺色操做

選擇方式:分別計算法萬筒條的權值ABC

計算:

A=2+2+1+1*1+4/14=7

B=2+2*1+4/14=5

C=13+13+13+13+5+1*1+6/14=82

 

選擇權值最低的花色進行定缺:B權值最小,因此選擇缺筒。

選擇缺牌後,手牌權值將不計算缺牌權值

2.2.3        有缺色出牌操做

直接出缺色牌。佔時不考慮策略,直接按順序出,或者隨機出。

 

2.2.4        無卻色出牌操做

選擇方式:計算每張手牌X打出後,剩餘牌的權值A。而後選擇權最高的牌打出。

2筒後權值和:(3+4+4+3+3+3*1+6/14+ 12+12+12+12+1+3+2*1+8/14=112

1條後權值和:(3+5+5+4+3+3+3*1+7/14+12+12+12+12+1+3+2*1+7/14=120

 

以此類推:計算法結束後, 選擇A_max 對應的X牌打出。

 

 

2.2.5        碰牌操做

碰牌選擇:計算現有權值A,計算法碰後最佳出牌的權值B,按照2.2.4中出牌方式計算便可。

若是A > B 則不碰,若是A <= B 碰,

A=3+5+6+6+5+5+3+3*1+8/14 + 12+12+12+12+2+2*1+6/14=130

B值計算:

 

2.2.6        槓牌操做

暗槓:

暗槓選擇:計算暗槓後權值A,計算放棄槓後最佳出牌的權值B,若是A>=B則槓,不然放棄。

明槓:

明槓選擇:計算明槓後權值A,計算如今有權值B,若是A>=B則槓,不然放棄。

 

補槓:

補槓選擇:筒暗槓方式進行計算。

?:是否只有門派才能補槓,目前決豆麻將非門也能補槓。

 

2.2.7        胡牌操做

自摸:

自摸選擇:計算胡牌權值A, 計算放棄胡牌後最佳出牌權值B, 若是A>=B,則胡,不然放棄。

炮牌:

炮牌選擇:計算胡牌權值,計算當前權值B, 若是A>=B則選擇胡,不然放棄。

 

2.2.8        多選擇混合操做

同時能夠進行出牌, 碰,槓,胡等操做組合。

選擇方式:計算每種選擇的權值以及放棄選擇的最佳權值進行比較,選擇權值最高的操做。

 

 

2.3風險加成

風險加成,麻將過程風險就是對輸贏大小的預估。簡單的來講輸的番數和贏的番數。在血戰麻將中輸贏來源於兩種狀況:槓和胡。因此風險係數β將根據其輸贏的番數進行定義。

風險係數由風險發生的機率和風險發生的結果決定。

定義

風險係數:β

定義當前手牌張數加成後權值和:m

定義當前手牌風險加成後的權值:n

定義出牌被槓的風險係數爲:a(-1<a<=0)

定義出牌可能點炮的風險係數爲:b(-1<b<=0)

定義叫牌胡牌的風險係數爲:c(0=<c<1)


β = a + b + c

n = m*(1+β) = m*(1+a+b+c);




2.3.1        槓牌風險

槓牌風險,

定義槓牌風險爲:a

定義可能被槓牌機率爲:x(0<=x<=1)

定義被槓後輸的番數:y(y=1)

定義比賽封頂番數:z

則:a=0-x*(y/z)

 

x計算:

定義出牌爲A,定義對手中須要A牌花色的有k(0<=k<=3)家。

1.       若是A已經出現過,則x=0

2.       若是A未出現過,則x=k/4


 

 

2.3.2        炮牌風險

炮牌風險,

定義炮牌風險爲:b

定義比賽封頂番數:z

 

點炮須要分別計算出牌對上家,對家,下家的風險技術。

定義上家的點炮機率和點炮番數以及下叫機率分別爲x1y1t1

定義上家的點炮機率和點炮番數以及下叫機率分別爲x2y2t2

定義上家的點炮機率和點炮番數以及下叫機率分別爲x3y3t3

則:b=0-(x1*t1*(y1/z)+ x2*t2*(y2/z)+ x2*t3*(y2/z))

 

y1即爲玩家牌面可見最大番數。(1<=y1<=z)

X1t1的計算法

定義出牌爲A

1.若是上家缺A花色或者玩家已胡則x1=0;

2.若是上家須要A的花色則x1=1/18,t1=1/2

對家和下家計算法方式相同。

 

2.3.3        胡牌風險

胡牌風險

定義胡牌風險爲:c

定義比賽封頂番數:z

定義叫牌分別爲:         B1B2…..Bn

定義叫牌自摸番數:  y1 y2,…yn

定義叫牌自摸的機率:x1 x2….xn

定義玩家吃炮的番數:m1m2…mn

定義玩家吃炮的機率:n1 n2…nn

定義叫牌的風險機率:c1 c2…cn

 

則:c1=x1*(y1/z) +m1*(n1/z)

c=c1+c2…cn

y1m1即胡牌的番數。

x1n1的計算:

定義叫牌爲B1,

定義對手中須要B1牌牌色的家數爲k(0<=k<=3)

定義已胡牌家數:l0<=l<=2

定義已胡家數中須要A牌牌色的家數:p0<=p<=l

定義A牌剩餘張數爲j(0<=j<=4)

1.       若是j=0  x1=0n1=0

2.       若是j>0,  x1=(4-k)/4*(1/(4-p))*j, n1=((4-k)/4)*((3-p)/(4-p))*j

 

其餘計算法方式相同。

 

3.      麻將做弊

在瞭解算法後,咱們知道咱們沒法控制咱們的機器人有絕對優點打贏真正的玩家,因此咱們須要服務器做弊進行配合,如下是具體方式。

1.機器人知道全部人的牌,讓機器人對其餘人進行全透視,這樣能夠精確計算槓碰炮胡的權值。(增長透視性,加大權值的高可靠性)

2.服務器在機器人定缺後,能夠根據機器人的等級下降機器人獲取得廢牌的機率。

3.機器人下叫後讓機器人快速的獲取叫牌,機器人若是獲取的叫牌須要智能換叫。

4.胡牌的大小,讓機器人胡大牌時,爲機器人配牌,配青一色,配大對子,增長機器人槓牌等。

以上全部的更改都是更加機器人等級對應的機率進行調整,機率能夠小於0,這樣就可讓機器人比正常的打牌能力更低。

能夠簡單的總結爲如下幾點:

1.增長機器人透視性,讓其知道全部人的手牌。

2.服務器配合發票,配牌。提升機器人獲取好牌的機率

3.機器人須要在其現有的透視性基礎上進行權值計算。

 

4.1透視性與風險加成

服務器做弊對機器人算法惟一有影響的地方就是風險加成, 由於在不知道其餘人牌的時候是按照機率對風險進行評估的。如今有了準確的數據,那麼風險加成算法將直接更加數據準確評估。

 


4.1.1        槓牌風險

槓牌風險,

定義槓牌風險爲:a

定義可能被槓牌機率爲:x(0<=x<=1)

定義被槓後輸的番數:y(y=1)

定義比賽封頂番數:z

則:a=0-x*(y/z)

 

x計算:

定義出牌爲A,定義對手中須要A牌花色的有k(0<=k<=3)家。

3.       若是A已經出現過,則x=0

4.       若是有玩家能槓,則x=1


 

 

4.1.2        炮牌風險

炮牌風險,

定義炮牌風險爲:b

定義比賽封頂番數:z

 

點炮須要分別計算出牌對上家,對家,下家的風險技術。

定義上家的點炮機率和點炮番數以及下叫機率分別爲x1y1t1

定義上家的點炮機率和點炮番數以及下叫機率分別爲x2y2t2

定義上家的點炮機率和點炮番數以及下叫機率分別爲x3y3t3

則:b=0-(x1*t1*(y1/z)+ x2*t2*(y2/z)+ x2*t3*(y2/z))

 

定義出牌爲A

y1即爲玩家胡A牌的番數。(1<=y1<=z)

X1t1的計算法

1.       若是上家無叫或者玩家已胡則x1=0;

2.       若是A不是上家的叫牌,則x1=0

3.       若是A是上家的叫牌,則x1=1

對家和下家計算法方式相同。

 

4.1.3        胡牌風險

胡牌風險

定義胡牌風險爲:c

定義比賽封頂番數:z

定義叫牌分別爲:         B1B2…..Bn

定義叫牌自摸番數:  y1 y2,…yn

定義叫牌自摸的機率:x1 x2….xn

定義玩家吃炮的番數:m1m2…mn

定義玩家吃炮的機率:n1 n2…nn

定義叫牌的風險機率:c1 c2…cn

 

則:c1=x1*(y1/z) +m1*(n1/z)

c=c1+c2…cn

y1m1即胡牌的番數。

x1n1的計算:

定義叫牌爲B1,

定義對手中須要B1牌牌色的家數爲k(0<=k<=3)

定義已胡牌家數:l0<=l<=2

定義已胡家數中須要A牌牌色的家數:p0<=p<=l

定義A牌剩餘張數爲j(0<=j<=4)(能夠準備計算)

3.       若是j=0  x1=0n1=0

4.       若是j>0,  x1=(4-k)/4*(1/(4-p))*j, n1=((4-k)/4)*((3-p)/(4-p))*j

 

其餘計算法方式相同。

 

 

4.      機器人策略和目標

從上述的麻將算法中,咱們能夠看出每次的選擇都會進行大量的計算。在真人麻將的過程當中玩家並不須要進行不少大量的計算,應該玩家會有本身的策略和目標,

在擁有目標後不少因素是不用考慮的,這樣就減小咱們相關計算量。因此給機器人引入目標和策略的概念是有必要的。引入目標和策略的方式很是多,下面簡單的介紹一種。

 

首先將機器人狀態分爲:無目標狀態,有目標狀態。

肯定目標總類:大對子,清一色, 暗七對,青七對,只摸叫牌等。

無目標狀況:按常規計算出牌。

有目標狀況:根據目標進行不一樣的權值計算。

目標轉換操做和條件:肯定目標,執行目標,更改目標,以及對應的條件。

這些操做須要依賴其餘因素,如麻將比賽前期,中期,後期,當前是否聽牌等。

最後肯定每一個目標對應權值計算帶來的影響。

 

例:

1.若是機器人肯定了清一色,那麼其餘的花色牌就不用考慮了。

2.若是機器人下叫後權值不少決定不換叫,那麼剩下的就只摸叫牌。

 

策略和目標的引入不屬於麻將算法的一部分,可是屬於一個強大機器人的一部分。 因此這兩部分能夠分開實現。即在麻將算法的基礎上加入目標和策略系統。

5.      機器人等級劃分

能夠講機器人設置爲1-10級,0級機器人直接出最後一張。

1級機器人:基礎權值

2級機器人:基礎權值+牌張數加成

3級機器人:基礎權值+牌張數加成+槓牌風險

4級機器人:基礎權值+牌張數加成+槓牌風險+炮牌風險

5級機器人:基礎權值+牌張數加成+槓牌風險+炮牌風險+胡牌風險

6級機器人:5級機器人+透視

7級機器人:5級機器人+透視+20%廢牌更換率

8級機器人:5級機器人+透視+20%廢牌更換率+20%叫牌獲取率

9級機器人:5級機器人+透視+40%廢牌更換率+20%叫牌獲取率

10級機器人:5級機器人+透視+40%廢牌更換率+20%叫牌獲取率+20%起手大牌獲取率

 

說明:

1-5級不含服務器做弊

6-10級含服務器做弊

透視:即服務器讓機器人知道全部玩家牌。

廢牌更換率:即服務器按必定的機率更換玩家獲取的廢牌,即玩家缺的牌。

叫牌獲取率:即服務器按必定的機率給玩家之間發叫牌。

起手打牌獲取率:即服務器按必定機率起手發牌是給機器人大牌,如清一色,大對子等。

相關文章
相關標籤/搜索