源码地址:https://github.com/tianlanlandelan/poker/tree/master/src/utils,喜欢请点星,谢谢大家。
一、牌面说明
54张牌,2~10、A、J、Q、K各4张(红桃、方块、黑桃、梅花),小王、大王各1张。
从小到大排序依次为:3、4、5、6、7、8、9、10、J、Q、K、A、2、小王、大王
二、牌型说明
三、生成牌逻辑
对局时首先要有一副牌,一副洗好的牌,为了实现这个目标,我们需要定义一个牌的对象,并想办法生成一副牌出来:
1.Poker.ts:定义poker对象
这段代码定义一个对象,包含两个属性:id(牌面ID:这张牌是哪张牌)、orderValue(牌大小排序值:这张牌有多大)。
看到这里你可能会问:你这不能体现可视化啊,这张牌是红桃3还是梅花A呢?这就涉及到这张牌的图片属性(image)了,这张牌的image可以和id一样放在Poker对象里作为一个属性存在。
在这里我们使用另一种方式:将牌的图片文件以id命名(如:1.png、2.png),这样在使用时就可以直接使用id来指定它的image了。
2.PukerUtils.ts:定义牌面id,牌面id作为一张牌的唯一标示,可以和牌面的图片绑定
这段代码定义一副牌的id,我们以A、2、3、4、5、6、7、8、9、10、J、Q、K小王、大王的顺序依次定义了54张牌的id。
3.PukerUtils.ts:定义牌的排序值
这段代码和上段代码相似,定义一副牌的大小排序值,定义的顺序要和pukerIds的顺序相同,1~15的数字分别对应牌3、4、5、6、7、8、9、10、J、Q、K、A、2、小王、大王的大小值。
4.PukerUtils.ts:随机生成一副扑克
前几段代码定义好了Poker对象以及一副牌的id和大小,通过这段代码我们实现了随机生成一副扑克牌的功能,每一行都有说明,通过这部操作,我们能得到一幅完整的扑克牌,接下来我们只需要将这些牌发给每个玩家就可以了。
四、牌型判断逻辑
对局中,当对方或我们出牌时,首先得知道选的几张牌是否是一手牌,不能乱出,这就涉及到了牌型的判断,在这里我们着重介绍下牌型的一些判断逻辑:
1. PukerType.ts:定义牌型对象
该对象包含两个属性:type(牌型:这是手什么牌)、sort(牌型大小:这手牌有多大)
2. PukerTypeUtils.ts:定义牌型
在这里统一定义了14中牌型的名称
3. PukerTypeUtils.ts:判断牌型
每种牌型有不同的判断逻辑,在这里列举其中一个牌型做一说明,其他所有牌型判断均在PukerTypeUtils.ts文件里。
所有牌型的判断思路都是:先将一手牌按牌大小进行排序,然后依照不同牌型的判断规则判断该手牌是否符合规则:如果符合规则,返回-1;如果符合规则,则返回该手牌的大小。
这段代码实现的是对一手牌是不是顺子进行判断:
首先:检查张数,顺子要求至少5张牌,最大呢,天顺:3到A,数一数,是12张,所以当这手牌少于5张或多于12张时就不对
其次:检查这手牌最大的牌,顺子的每张牌中最大的是A,所以,当这手牌最大的牌比A还要大时,就不用往下看了,直接Pass掉
再次:检查这手牌是不是连续的,如果是连续的,恭喜你,符合顺子的判断规则,返回这手牌中最大的那一张作为该手牌的大小值
五、牌型比较逻辑
牌有了,也能知道一手牌是什么牌了,我们列举几种情况:
1.你出一个顺子,我也出一个顺子,怎么判断我的顺子能不能压住你的顺子呢
2.你出一个顺子,我出一个连对,行不行
3.你出一个顺子,我出一个炸弹,行不行
4.你出一个5张的顺子,我出一个7张的顺子,行不行
经过以上思考,在牌型比较的过程中,我们把所有牌型分为两类:能压其他牌型的(炸弹和王炸)、不能压其他牌型的(其他所有牌型),这样我们的思路就有了:第一种牌型中,我们具体情况具体判断,在第二种牌型中,我们首先要判断这两手牌是不是同一种牌型。
牌型比较的逻辑都在PukerCompareUtils.ts文件中,具体代码如下:
六、自动出牌核心机制-选牌
单机游戏的系统出牌和联机游戏的托管功能都要用到系统自动出牌的机制,它的核心就是从你手里的一堆牌中挑出合适的牌型压住上家出的牌,在这里我们简单介绍一下:
思路是:
1.先判断上家的牌型,要是上家是王炸,那想都别想了,无解
2.如果不是王炸,那就还有机会,先判断出的啥牌型,然后从自己的牌中扒拉扒拉看有没有能压住这些牌的牌
3.如果没有,就不出;如果有,就弄他吖的
具体的实现逻辑都在PukerSeekUtils.ts文件中,这个逻辑需要持续优化,比如什么时候该出什么时候不该出等,要做得智能一点,还需要很长的路要走。
源码地址:https://github.com/tianlanlandelan/poker/tree/master/src/utils,喜欢请点星,谢谢大家。