血战麻将算法
1.????? 算法簡介
本文的麻將算法不是按人工智能的方式進行講解,本人從事游戲服務器開發。所以該算法主要用于一般的麻將游戲機器人,主要是讓機器人具有正常操作選擇。算法無法與現實生活中的麻將高手進行對決,也沒有經過嚴格的數學論證,但是為了應付麻將高手,會采取一些作弊的手段。所以本文除了講述麻將算法,還將會提及麻將作弊的方式,以及該算法應用到實際機器人中對于機器人的等級劃分方法。
該算法的核心宗旨是以權值驅動操作。所以本文將主要講述從如何合理的精確的計算權值。以及在加入作弊因素情況下的權值計算方式。
?
2.????? 麻將算法
麻將算法的設計我們將采用貪心算法,即讓機器人做出當前情況下最好的選擇。
血戰麻將:共108張. 萬36張, 筒36, 條36張。
麻將過程中的操作:選缺牌,碰牌, 杠牌,胡牌, 出牌, 過。
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條權值:與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
?
2.2.2??????? 缺色操作
選擇方式:分別計算法萬筒條的權值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權值最小,所以選擇缺筒。
選擇缺牌后,手牌權值將不計算缺牌權值
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
?
點炮需要分別計算出牌對上家,對家,下家的風險技術。
定義上家的點炮概率和點炮番數以及下叫概率分別為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
對家和下家計算法方式相同。
?
2.3.3??????? 胡牌風險
胡牌風險
定義胡牌風險為: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
?
其他計算法方式相同。
?
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
?
點炮需要分別計算出牌對上家,對家,下家的風險技術。
定義上家的點炮概率和點炮番數以及下叫概率分別為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
對家和下家計算法方式相同。
?
4.1.3??????? 胡牌風險
胡牌風險
定義胡牌風險為: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
?
其他計算法方式相同。
?
?
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級含服務器作弊
透視:即服務器讓機器人知道所有玩家牌。
廢牌更換率:即服務器按一定的概率更換玩家獲取的廢牌,即玩家缺的牌。
叫牌獲取率:即服務器按一定的概率給玩家之間發叫牌。
起手打牌獲取率:即服務器按一定概率起手發牌是給機器人大牌,如清一色,大對子等。
?
?
轉載于:https://my.oschina.net/u/1024573/blog/647259
總結
- 上一篇: 【知识图谱】构建红楼梦知识图谱
- 下一篇: 单片机之LED闪烁