斗地主游戏核心逻辑-TypeScript

源码地址: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,喜欢请点星,谢谢大家。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,470评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,393评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,577评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,176评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,189评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,155评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,041评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,903评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,319评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,539评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,703评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,417评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,013评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,664评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,818评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,711评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,601评论 2 353