棋牌算法——“贰柒拾”(字牌)

目录

百度百科:

玩法介绍:

核心算法:

1. 编号&获取

2. 吃 & 摆

3. 对(碰)

4、开(杠,下雨)

5、胡 & 听牌提示


百度百科:


玩法介绍:

贰柒拾的玩法有很多种,主要有“乐山贰柒拾”,“犍为贰柒拾”,“眉山贰柒拾”,“四十张三人”,“两人贰柒拾”等,不同玩法之间其核心的打牌逻辑都是相同的,区别在于一些算分和番型不同而已。具体的打牌规则和各玩法介绍,由于篇幅较大,对核心的处理逻辑没有影响,这里就不做过多的介绍。


核心算法:

温馨提示:本文主要对胡牌逻辑进行分析,想要理解算法,请务必先学会打牌规则及玩法

1. 编号&获取

编号:首先需要分别将红黑牌进行编号,因为没有压牌规则,所以不同花色可以单独编组。如红牌1-10 、黑牌11-20,这里建议通过一个花色码进行移位编号。

获取:寻找牌值时,需根据花色与牌值进行寻找。

2. 吃 & 摆

单独的吃操作其实很简单,但贰柒拾的吃操作之前,必须先对摆操作进行校验,摆操作和吃操作的都是一样的牌型,只不过多了一层约束。首先,根据目标牌寻找手牌中可以吃的组合,检查目标牌是否存在?

--存在:进入检查摆牌逻辑,如果摆牌成功,即可吃,如果摆牌失败,即不能吃

--不存在:可直接吃

3. 对(碰)

检查手牌有且只有两张时可进行对操作

4、开(杠,下雨)

检查手牌有且只有3张可进行开操作

5、胡 & 听牌提示

先对红黑牌进行分类并排序,然后进行组合判断,由于红牌的牌型胡数大于黑牌,所以先对红牌进行组合判断。这里以红牌为例,黑牌逻辑相同,不再赘述。

获取第一张牌,判断该牌是否为目标牌(进行标记),获取该牌的张数,根据不同的张数组成不同的“组合”,张数可能如下:

1、4张,可组成一磙

2、3张,可组成一坎(包含目标牌则可组成对)

3、1&2张,可组成吃,吃的话需要去寻找相邻的牌(包括2710)(这里涉及到红吃黑,所以也需要去黑牌里找)

如能组合成功,将组合成功的牌全部移除,然后再取一张,重复如此,直至牌全部移除(红黑),则可胡。

如其递归过程出现组合失败,则目标牌不可胡。退出判断

4、胡牌之后判断番型胡数,可在组合判断的过程对一些牌型进行收集,如圈牌,胡数,2710,坤,漂,天,地等。

代码:(java)

 /**
     * 胡牌检查
     *
     * @param result
     * @param
     * @return
     */
    public static ErQiShiTingResult realCheckHu(ErQiShiTingResult result) {

        if (result.getZhuCard().size() == 0 && result.getFuCard().size() == 0) {
            if (result.getYouNum() >= result.getNeedYouNum()) {
                result.setHu(true);
            }
            return result;
        }

        List<Byte> zhuCard = result.getZhuCard();
        Byte card = result.getCard();
        ErQiShiTingResult r;

        if (zhuCard.size() > 0) {
            Byte one = zhuCard.get(0);
            int oneNum = getCardNumInList(one, zhuCard);
            if (oneNum == 4) {
                if (one == card) {
                    // 三张摸一张的情况
                    // r = removeLianZi(copyResult, one);
                    // if (r.isHu()) {
                    // 	return r;
                    // }
                    return removeGunKai(result, one);
                } else {
                    // 判断磙
                    return removeGun(result, one);
                }

            } else if (oneNum == 3) {

                if (one == card) {

                    // 根据标识和圈牌 判断优先算圈胡还是算二七十
                    if (result.isFlag() && card == result.getQuanCard()) {
                        r = removeDuiZi(result, one);
                        if (r.isHu()) {
                            return r;
                        }
                        r = removeErQiShi(result, one);
                        if (r.isHu()) {
                            return r;
                        }
                    } else {
                        r = removeErQiShi(result, one);
                        if (r.isHu()) {
                            return r;
                        }
                        r = removeDuiZi(result, one);
                        if (r.isHu()) {
                            return r;
                        }
                    }

                    r = selectMaxHu(result, one);
                    if (r.isHu()) {
                        return r;
                    }
                    // r = removeZhuangZi(result, one);
                    // if (r.isHu()) {
                    //     return r;
                    // }
                    //
                    // r = removeDazi1(result, one);
                    // if (r.isHu()) {
                    //     return r;
                    // }
                    //
                    // r = removeLianZi(result, one);
                    // if (r.isHu()) {
                    //     return r;
                    // }

                } else {
                    // 判断坎
                    return removeKan(result, one);

                }
            } else if (oneNum == 2) {

                r = removeErQiShi(result, one);
                if (r.isHu()) {
                    return r;
                }

                r = selectMaxHu(result, one);
                if (r.isHu()) {
                    return r;
                }

                // r = removeZhuangZi(result, one);
                // if (r.isHu()) {
                //     return r;
                // }
                //
                // r = removeDazi1(result, one);
                // if (r.isHu()) {
                //     return r;
                // }
                //
                // r = removeLianZi(result, one);
                // if (r.isHu()) {
                //     return r;
                // }
            } else if (oneNum == 1) {
                r = removeErQiShi(result, one);
                if (r.isHu()) {
                    return r;
                }
                r = removeLianZi(result, one);
                if (r.isHu()) {
                    return r;
                }
            }
        } else {
            r = realCheckHu(result.swap());
            if (r.isHu()) {
                return r;
            }
        }
        return result;
    }

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
包括麻将、跑胡子、扑克。实现 lua 、c++ 、c# 、golang 、js 、java 、python 版本。( Mahjong algorithm ) Java是一种广泛使用的面向对象的编程语言,由Sun Microsystems公司于1995年5月正式发布。它的设计目标是“一次编写,到处运行(Write Once, Run Anywhere)”,这意味着开发者可以使用Java编写应用程序,并在支持Java的任何平台上无需重新编译即可运行,这得益于其独特的跨平台性,通过Java虚拟机(JVM)实现不同操作系统上的兼容。 Java的特点包括: 面向对象:Java全面支持面向对象的特性,如封装、继承和多态,使得代码更易于维护和扩展。 安全:Java提供了丰富的安全特性,如禁止指针运算、自动内存管理和异常处理机制,以减少程序错误和恶意攻击的可能性。 可移植性:Java字节码可以在所有安装了JVM的设备上执行,从服务器到嵌入式系统,再到移动设备和桌面应用。 健壮性与高性能:Java通过垃圾回收机制确保内存的有效管理,同时也能通过JIT编译器优化来提升运行时性能。 标准库丰富:Java拥有庞大的类库,如Java SE(Java Standard Edition)包含基础API,用于开发通用应用程序;Java EE(Java Enterprise Edition)提供企业级服务,如Web服务、EJB等;而Java ME(Java Micro Edition)则针对小型设备和嵌入式系统。 社区活跃:Java有着全球范围内庞大的开发者社区和开源项目,持续推动技术进步和创新。 多线程支持:Java内建对多线程编程的支持,使并发编程变得更加简单直接。 动态性:Java可以通过反射、注解等机制实现在运行时动态加载类和修改行为,增加了程序的灵活性。 综上所述,Java凭借其强大的特性和广泛的适用范围,在企业级应用、互联网服务、移动开发等领域均扮演着举足轻重的角色,是现代软件开发不可或缺的重要工具之一。
棋牌类游戏测试面试题包括以下内容: 1. 棋牌类游戏算法-牌分类 2. 棋牌类游戏算法-找出一副牌里的顺子 这些问题涉及到了游戏规则和算法的知识。在测试中,面试官可能会要求你解释这些算法的原理并给出相应的实现代码。 其他可能涉及到的面试题目包括: - Cocos Creator的使用 - Lua的特点和绑定 - Cocos2d-x的新特性 - 网络协议和通信 - 内存管理机制 - C++中的堆和栈 - 虚函数和纯虚函数 - 数据结构和算法的时间复杂度 这些问题主要考察了面试者对Cocos2d-x游戏引擎以及相关编程语言和算法的理解和掌握程度。 在面试前,你可以通过学习和实践来提高自己在这些方面的知识水平,以便更好地应对面试挑战。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [面试题..](https://blog.csdn.net/u013321328/article/details/90602947)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [棋牌类游戏测试用例怎么写?我敢打赌你绝对不知道](https://blog.csdn.net/MXB1220/article/details/129145963)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Snovi-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值