智能麻将出牌组件

开篇引言​

麻将作为一款风靡全球的策略性游戏,其复杂的规则和多变的牌局给玩家带来了无尽乐趣。在数字化时代,运用编程技术为麻将游戏赋予智能,实现自动出牌功能,不仅能提升玩家体验,还能深入探索算法在博弈游戏中的应用。今天,就和大家分享我如何使用 Java 编写一个智能麻将出牌组件的过程。​

1. 麻将规则简述​

简单介绍麻将的基本规则,如牌型(顺子、刻子、对子等)、胡牌方式、不同花色牌的作用等。强调这些规则是后续智能出牌算法设计的基础。例如,因为有顺子和刻子的牌型,所以在计算出牌策略时,需要考虑如何通过出牌来促进这些牌型的形成或完善。​

复制代码
11-19为1万-9万,21-29为1条到9条,31-39为1筒到9筒,41-47为东西南北中发白,51-58为梅兰竹菊春夏秋冬

2. 技术选型 - Java 的优势​

说明选择 Java 作为开发语言的原因。如 Java 强大的跨平台性,方便组件能在不同操作系统的麻将游戏中集成;丰富的类库,在处理牌的逻辑、数据结构和算法实现时能提供便捷工具;良好的面向对象特性,有利于构建清晰、可维护的代码结构等。​

3.主要的public方法

java 复制代码
public class MahjongIntelligentModule {
    private Mahjong mahjong;

    private volatile static MahjongIntelligentModule singleton;

    /**
     * 智能模块控制方法
     *
     * @param handCards     手牌
     * @param outCards      已出的牌
     * @param laiZiCards    癞子牌
     * @param handCard      本次需要出的牌
     * @param queYiMenValue 缺一门牌值
     * @param lastOutCard   上一次出的牌
     * @param noOutCardList 不能出的牌
     * @return 可以出的牌值
     */
    public MahjongIntelligentModule(List<Integer> handCards, List<Integer> outCards, List<Integer> laiZiCards, int handCard, int queYiMenValue, int lastOutCard, List<Integer> noOutCardList) {
        ......
    }

    /**
     * 通过智能算法获取可以出的牌值,判断出牌后听牌最大的可能性,通过outCards判断出这张牌是否还有可能胡的牌
     *
     * @return 可以出的牌值
     */
    public int getOutCard() {
        ......
    }


    /**
     * 判断是否可以碰牌,通过牌型判断和outCards判断碰后是否会影响原来的牌型,加入影响则返回false,否则返回true
     *
     * @return 是否可以碰牌
     */
    public boolean getPengCard() {
            ......
    }

   
    /**
     * 判断是否可以杠牌,通过牌型判断和outCards判断杠后是否会影响原来的牌型,加入影响则返回false,否则返回true
     *
     * @return 是否可以杠牌
     */
    public boolean getGangCard(Integer cardType) {
          ......
    }

}

4. 智能出牌概率计算

进张概率计算​; 拆对、刻、顺概率评估;综合出牌概率公式应用​

5. 测试与验证​

5.1 出牌测试

java 复制代码
List<Integer> handCards = new ArrayList<>(Arrays.asList(12,13,14,15,16,17,24,26,32,33,35,37,38,26));
            MahjongIntelligentModule mahjongIntelligentModule = new MahjongIntelligentModule(handCards,new ArrayList<>(Arrays.asList()
            ),new ArrayList<>(),-1,-1,-1,new ArrayList<>());
            int outcard = mahjongIntelligentModule.getOutCard();
            System.out.println("需要出的牌:"+outcard);

CardsInformationInfo{cardsInformations=......, outCard=24, maxChance=9.79}

需要出的牌:24

5.2 碰牌测试

java 复制代码
List<Integer> handCards = new ArrayList<>(Arrays.asList(11,12,12,13,13,14,17));
            int lastoutcard = 12;
            MahjongIntelligentModule mahjongIntelligentModule = new MahjongIntelligentModule(handCards,new ArrayList<>(Arrays.asList()
            ),new ArrayList<>(),-1,-1,lastoutcard,new ArrayList<>());
            boolean pengcard = mahjongIntelligentModule.getPengCard();
            System.out.println("碰的牌为:"+lastoutcard+"\t是否能碰:"+pengcard);

碰的牌为:12 是否能碰:false

java 复制代码
List<Integer> handCards = new ArrayList<>(Arrays.asList(11,12,12,12,13,17,17));
            int lastoutcard = 12;
            MahjongIntelligentModule mahjongIntelligentModule = new MahjongIntelligentModule(handCards,new ArrayList<>(Arrays.asList()
            ),new ArrayList<>(),-1,-1,lastoutcard,new ArrayList<>());
            boolean pengcard = mahjongIntelligentModule.getPengCard();
            System.out.println("碰的牌为:"+lastoutcard+"\t是否能碰:"+pengcard);

CardsInformationInfo{cardsInformations=......, outCard=17, maxChance=2.63}

出牌:17

碰的牌为:12 是否能碰:true

5.3吃牌测试

java 复制代码
List<Integer> handCards = new ArrayList<>(Arrays.asList(11,12,12,12,13,17,17));
            int lastoutcard = 12;
            MahjongIntelligentModule mahjongIntelligentModule = new MahjongIntelligentModule(handCards,new ArrayList<>(Arrays.asList()
            ),new ArrayList<>(),-1,-1,lastoutcard,new ArrayList<>());
            List<Integer> chiList = mahjongIntelligentModule.getChiCard();
            System.out.println("上加出的牌为:"+lastoutcard+"\t能吃的牌:"+chiList);

CardsInformationInfo{cardsInformations=......, outCard=17, maxChance=-0.15000000000000002}

出牌:17

上加出的牌为:12 能吃的牌:11, 12, 13

java 复制代码
List<Integer> handCards = new ArrayList<>(Arrays.asList(12,13,14,15,16,17,18));
            int lastoutcard = 12;
            MahjongIntelligentModule mahjongIntelligentModule = new MahjongIntelligentModule(handCards,new ArrayList<>(Arrays.asList()
            ),new ArrayList<>(),-1,-1,lastoutcard,new ArrayList<>());
            List<Integer> chiList = mahjongIntelligentModule.getChiCard();
            System.out.println("上家出的牌为:"+lastoutcard+"\t能吃的牌:"+chiList);

上家出的牌为:12 能吃的牌:null

相关推荐
lhldsg1 小时前
全民健身解决方案小程序开发:从0到1的技术实战
java·数据库·需求分析
jason成都1 小时前
Spring WebFlux 适配达梦新方案|dm‑r2dbc:Netty 异步传输的实验性 R2DBC 驱动
java·后端·spring
泡海椒1 小时前
内置SPI函数库详解:JQuick-Java Builtin工具类实战用法
java·开发语言·python
辰烨chenye1 小时前
LeetCode Hot 100 题解 · 二分篇
java·算法·leetcode
小羊没烦恼!2 小时前
Hello Web API系列教程——Web API与国际化
java·服务器·前端·javascript·php
小荷才露尖尖角,早有蜻蜓立上头3 小时前
过滤器的4种创建方式
java
大圣编蚕3 小时前
Java ByteArrayInputStream 详解:从入门到实战
java·开发语言·算法
程序员阿明3 小时前
idea把插件啥的不默认放在C盘
java·ide·intellij-idea
linweidong4 小时前
中科闻歌Java面试题及参考答案
java·python·大模型·提示词·ai agent·mcp·rag原理
OpenAnolis小助手4 小时前
一句话看透 JVM,SysOM 诊断 Skill 新增 Java 应用诊断能力
java·开发语言·jvm·阿里云·操作系统控制台·sysom