血战麻将算法

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条权值:与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

定义出牌可能点炮的风险系数为:b(-1

定义叫牌胡牌的风险系数为:c(0=


β = 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级含服务器作弊

透视:即服务器让机器人知道所有玩家牌。

废牌更换率:即服务器按一定的概率更换玩家获取的废牌,即玩家缺的牌。

叫牌获取率:即服务器按一定的概率给玩家之间发叫牌。

起手打牌获取率:即服务器按一定概率起手发牌是给机器人大牌,如清一色,大对子等。

 

 

转载于:https://my.oschina.net/u/1024573/blog/647259

你可能感兴趣的:(血战麻将算法)