本文的麻將算法不是按人工智能的方式進行講解,本人從事遊戲服務器開發。因此該算法主要用於通常的麻將遊戲機器人,主要是讓機器人具備正常操做選擇。算法沒法與現實生活中的麻將高手進行對決,也沒有通過嚴格的數學論證,可是爲了應付麻將高手,會採起一些做弊的手段。因此本文除了講述麻將算法,還將會說起麻將做弊的方式,以及該算法應用到實際機器人中對於機器人的等級劃分方法。 算法
該算法的核心宗旨是以權值驅動操做。因此本文將主要講述從如何合理的精確的計算權值。以及在加入做弊因素狀況下的權值計算方式。 服務器
麻將算法的設計咱們將採用貪心算法,即讓機器人作出當前狀況下最好的選擇。 人工智能
血戰麻將:共108張. 萬36張, 筒36, 條36張。 spa
麻將過程當中的操做:選缺牌,碰牌, 槓牌,胡牌, 出牌, 過。 設計
權值設置說明:根據血戰麻將規則定義相同花色相隔的牌爲最小權值單元,定義權值爲1. 對象
手牌權值計算方法:基礎權值+加成權值。 遊戲
基礎權值:相隔+1, 相鄰+2, 2張相同+2, 3張相同+3, 4張相同+4,基礎全職計算對象包括手牌和碰牌以及槓牌,可是槓牌和碰牌以及收必須進行分開計算。 服務器開發
加成權值:牌張數加成,風險加成 開發
牌張數加成:根據當前花色牌的張數比,對當前花色權值進行加成。 數學
定義萬張數爲x,定義萬基礎權值爲y,則萬牌張數加成權值z=y*(1+x/14);
風險加成:根據當前已知狀況,出牌,碰牌,槓牌,胡牌所帶來的風險對手牌權值和進行加成。定義:定義當前手牌牌張數加成後權值和爲m,當前牌的風險係數爲β,則風險係數加成後的權值n= m*(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條權值:與3個3條4張相同+12,與5條相隔+1 共12+1=13
5條權值:與4個三條相隔+4 共:4
5張牌權值和:4*13 +4 = 56
2筒權值:無相鄰,相同,相隔,權值爲0
5筒權值:0
9筒:與1個2張相同+2;共2
總共權值:0+0+2*2 = 4
說明:權值爲0的牌將在牌張數上面提高筒色總體權值。
條權值計算:
3條權值:與3個3條4張相同+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
選擇方式:分別計算法萬筒條的權值A,B,C,
計算:
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權值最小,因此選擇缺筒。
選擇缺牌後,手牌權值將不計算缺牌權值
直接出缺色牌。佔時不考慮策略,直接按順序出,或者隨機出。
選擇方式:計算每張手牌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牌打出。
碰牌選擇:計算現有權值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值計算:
暗槓:
暗槓選擇:計算暗槓後權值A,計算放棄槓後最佳出牌的權值B,若是A>=B則槓,不然放棄。
明槓:
明槓選擇:計算明槓後權值A,計算如今有權值B,若是A>=B則槓,不然放棄。
補槓:
補槓選擇:筒暗槓方式進行計算。
?:是否只有門派才能補槓,目前決豆麻將非門也能補槓。
自摸:
自摸選擇:計算胡牌權值A, 計算放棄胡牌後最佳出牌權值B, 若是A>=B,則胡,不然放棄。
炮牌:
炮牌選擇:計算胡牌權值,計算當前權值B, 若是A>=B則選擇胡,不然放棄。
同時能夠進行出牌, 碰,槓,胡等操做組合。
選擇方式:計算每種選擇的權值以及放棄選擇的最佳權值進行比較,選擇權值最高的操做。
風險加成,麻將過程風險就是對輸贏大小的預估。簡單的來講輸的番數和贏的番數。在血戰麻將中輸贏來源於兩種狀況:槓和胡。因此風險係數β將根據其輸贏的番數進行定義。
風險係數由風險發生的機率和風險發生的結果決定。
定義
風險係數:β
定義當前手牌張數加成後權值和: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);
槓牌風險,
定義槓牌風險爲: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
炮牌風險,
定義炮牌風險爲:b
定義比賽封頂番數:z
點炮須要分別計算出牌對上家,對家,下家的風險技術。
定義上家的點炮機率和點炮番數以及下叫機率分別爲x1,y1,t1
定義上家的點炮機率和點炮番數以及下叫機率分別爲x2,y2,t2
定義上家的點炮機率和點炮番數以及下叫機率分別爲x3,y3,t3
則:b=0-(x1*t1*(y1/z)+ x2*t2*(y2/z)+ x2*t3*(y2/z))
y1即爲玩家牌面可見最大番數。(1<=y1<=z)
X1與t1的計算法
定義出牌爲A
1.若是上家缺A花色或者玩家已胡則x1=0;
2.若是上家須要A的花色則x1=1/18,t1=1/2
對家和下家計算法方式相同。
胡牌風險
定義胡牌風險爲:c
定義比賽封頂番數:z
定義叫牌分別爲: B1,B2…..Bn
定義叫牌自摸番數: y1, y2,…yn
定義叫牌自摸的機率:x1, x2….xn
定義玩家吃炮的番數:m1,m2…mn
定義玩家吃炮的機率:n1, n2…nn
定義叫牌的風險機率:c1, c2…cn
則:c1=x1*(y1/z) +m1*(n1/z)
c=c1+c2…cn
y1與m1即胡牌的番數。
x1與n1的計算:
定義叫牌爲B1牌,
定義對手中須要B1牌牌色的家數爲k(0<=k<=3),
定義已胡牌家數:l(0<=l<=2)
定義已胡家數中須要A牌牌色的家數:p(0<=p<=l)
定義A牌剩餘張數爲j(0<=j<=4)
1. 若是j=0 則x1=0,n1=0;
2. 若是j>0, 則x1=(4-k)/4*(1/(4-p))*j, n1=((4-k)/4)*((3-p)/(4-p))*j
其餘計算法方式相同。
在瞭解算法後,咱們知道咱們沒法控制咱們的機器人有絕對優點打贏真正的玩家,因此咱們須要服務器做弊進行配合,如下是具體方式。
1.機器人知道全部人的牌,讓機器人對其餘人進行全透視,這樣能夠精確計算槓碰炮胡的權值。(增長透視性,加大權值的高可靠性)
2.服務器在機器人定缺後,能夠根據機器人的等級下降機器人獲取得廢牌的機率。
3.機器人下叫後讓機器人快速的獲取叫牌,機器人若是獲取的叫牌須要智能換叫。
4.胡牌的大小,讓機器人胡大牌時,爲機器人配牌,配青一色,配大對子,增長機器人槓牌等。
以上全部的更改都是更加機器人等級對應的機率進行調整,機率能夠小於0,這樣就可讓機器人比正常的打牌能力更低。
能夠簡單的總結爲如下幾點:
1.增長機器人透視性,讓其知道全部人的手牌。
2.服務器配合發票,配牌。提升機器人獲取好牌的機率
3.機器人須要在其現有的透視性基礎上進行權值計算。
服務器做弊對機器人算法惟一有影響的地方就是風險加成, 由於在不知道其餘人牌的時候是按照機率對風險進行評估的。如今有了準確的數據,那麼風險加成算法將直接更加數據準確評估。
槓牌風險,
定義槓牌風險爲: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
炮牌風險,
定義炮牌風險爲:b
定義比賽封頂番數:z
點炮須要分別計算出牌對上家,對家,下家的風險技術。
定義上家的點炮機率和點炮番數以及下叫機率分別爲x1,y1,t1
定義上家的點炮機率和點炮番數以及下叫機率分別爲x2,y2,t2
定義上家的點炮機率和點炮番數以及下叫機率分別爲x3,y3,t3
則:b=0-(x1*t1*(y1/z)+ x2*t2*(y2/z)+ x2*t3*(y2/z))
定義出牌爲A
y1即爲玩家胡A牌的番數。(1<=y1<=z)
X1與t1的計算法
1. 若是上家無叫或者玩家已胡則x1=0;
2. 若是A不是上家的叫牌,則x1=0
3. 若是A是上家的叫牌,則x1=1
對家和下家計算法方式相同。
胡牌風險
定義胡牌風險爲:c
定義比賽封頂番數:z
定義叫牌分別爲: B1,B2…..Bn
定義叫牌自摸番數: y1, y2,…yn
定義叫牌自摸的機率:x1, x2….xn
定義玩家吃炮的番數:m1,m2…mn
定義玩家吃炮的機率:n1, n2…nn
定義叫牌的風險機率:c1, c2…cn
則:c1=x1*(y1/z) +m1*(n1/z)
c=c1+c2…cn
y1與m1即胡牌的番數。
x1與n1的計算:
定義叫牌爲B1牌,
定義對手中須要B1牌牌色的家數爲k(0<=k<=3),
定義已胡牌家數:l(0<=l<=2)
定義已胡家數中須要A牌牌色的家數:p(0<=p<=l)
定義A牌剩餘張數爲j(0<=j<=4)(能夠準備計算)
3. 若是j=0 則x1=0,n1=0;
4. 若是j>0, 則x1=(4-k)/4*(1/(4-p))*j, n1=((4-k)/4)*((3-p)/(4-p))*j
其餘計算法方式相同。
從上述的麻將算法中,咱們能夠看出每次的選擇都會進行大量的計算。在真人麻將的過程當中玩家並不須要進行不少大量的計算,應該玩家會有本身的策略和目標,
在擁有目標後不少因素是不用考慮的,這樣就減小咱們相關計算量。因此給機器人引入目標和策略的概念是有必要的。引入目標和策略的方式很是多,下面簡單的介紹一種。
首先將機器人狀態分爲:無目標狀態,有目標狀態。
肯定目標總類:大對子,清一色, 暗七對,青七對,只摸叫牌等。
無目標狀況:按常規計算出牌。
有目標狀況:根據目標進行不一樣的權值計算。
目標轉換操做和條件:肯定目標,執行目標,更改目標,以及對應的條件。
這些操做須要依賴其餘因素,如麻將比賽前期,中期,後期,當前是否聽牌等。
最後肯定每一個目標對應權值計算帶來的影響。
例:
1.若是機器人肯定了清一色,那麼其餘的花色牌就不用考慮了。
2.若是機器人下叫後權值不少決定不換叫,那麼剩下的就只摸叫牌。
策略和目標的引入不屬於麻將算法的一部分,可是屬於一個強大機器人的一部分。 因此這兩部分能夠分開實現。即在麻將算法的基礎上加入目標和策略系統。
能夠講機器人設置爲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級含服務器做弊
透視:即服務器讓機器人知道全部玩家牌。
廢牌更換率:即服務器按必定的機率更換玩家獲取的廢牌,即玩家缺的牌。
叫牌獲取率:即服務器按必定的機率給玩家之間發叫牌。
起手打牌獲取率:即服務器按必定機率起手發牌是給機器人大牌,如清一色,大對子等。