本文的麻将算法不是按人工智能的方式进行讲解,本人从事游戏服务器开发。所以该算法主要用于一般的麻将游戏机器人,主要是让机器人具有正常操作选择。算法无法与现实生活中的麻将高手进行对决,也没有经过严格的数学论证,但是为了应付麻将高手,会采取一些作弊的手段。所以本文除了讲述麻将算法,还将会提及麻将作弊的方式,以及该算法应用到实际机器人中对于机器人的等级划分方法。
该算法的核心宗旨是以权值驱动操作。所以本文将主要讲述从如何合理的精确的计算权值。以及在加入作弊因素情况下的权值计算方式。
麻将算法的设计我们将采用贪心算法,即让机器人做出当前情况下最好的选择。
血战麻将:共108张. 万36张, 筒36, 条36张。
麻将过程中的操作:选缺牌,碰牌, 杠牌,胡牌, 出牌, 过。
权值设置说明:根据血战麻将规则定义相同花色相隔的牌为最小权值单元,定义权值为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级含服务器作弊
透视:即服务器让机器人知道所有玩家牌。
废牌更换率:即服务器按一定的概率更换玩家获取的废牌,即玩家缺的牌。
叫牌获取率:即服务器按一定的概率给玩家之间发叫牌。
起手打牌获取率:即服务器按一定概率起手发牌是给机器人大牌,如清一色,大对子等。