本文的麻将算法不是按人工智能的方式进行讲解,本人从事游戏服务器开发。因此该算法主要用于通常的麻将游戏机器人,主要是让机器人具备正常操做选择。算法没法与现实生活中的麻将高手进行对决,也没有通过严格的数学论证,可是为了应付麻将高手,会采起一些做弊的手段。因此本文除了讲述麻将算法,还将会说起麻将做弊的方式,以及该算法应用到实际机器人中对于机器人的等级划分方法。 算法
该算法的核心宗旨是以权值驱动操做。因此本文将主要讲述从如何合理的精确的计算权值。以及在加入做弊因素状况下的权值计算方式。 服务器
麻将算法的设计咱们将采用贪心算法,即让机器人作出当前状况下最好的选择。 人工智能
血战麻将:共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级含服务器做弊
透视:即服务器让机器人知道全部玩家牌。
废牌更换率:即服务器按必定的几率更换玩家获取的废牌,即玩家缺的牌。
叫牌获取率:即服务器按必定的几率给玩家之间发叫牌。
起手打牌获取率:即服务器按必定几率起手发牌是给机器人大牌,如清一色,大对子等。