一文带你浅析麻将平胡算法技术

个人博客导航页(点击右侧链接即可打开个人博客):大牛带你入门技术栈 

此算法基本可以通用于所有麻将的平胡规则,即满足m * ABC + n * AAA + AA(其中m、n可为0)的胡牌公式,红黑字牌也可由此算法演变。

首先,我们要约定每张麻将都可以由一个数字表示,比如11表示一万,12表示二万,21表示一条,22表示二条,31表示一筒,32表示二筒……

即所有牌用两位数表示,表示万条筒的两位数个位为牌点,十位为牌类型,其它表示非字牌的两位数与牌类型相同,以下用一个枚举类定义:

import java.util.HashMap;
import java.util.Map;

/**
 * 麻将类型枚举
 *
 * @author zkpursuit
 */
public enum CardType {

    wan(1, "万"), tiao(2, "条"), tong(3, "筒"),
    dong(40, "东风"), nan(41, "南风"), xi(42, "西风"),
    bei(43, "北风"), zhong(44, "中"), fa(45, "发"), ban(46, "白板");

    //类型
    private final int value;
    //牌名
    private final String name;

    private CardType(int value, String name) {
        this.value = value;
        this.name = name;
    }

    public int getValue() {
        return value;
    }

    public String getName() {
        return name;
    }

    private static final Map<Integer, String> numMap = new HashMap<>();
    private static final Map<Integer, CardType> types = new HashMap<>();
    private static final Map<Integer, String> typeNames = new HashMap<>();

    static {
        numMap.put(1, "一");
        numMap.put(2, "二");
        numMap.put(3, "三");
        numMap.put(4, "四");
        numMap.put(5, "五");
        numMap.put(6, "六");
        numMap.put(7, "七");
        numMap.put(8, "八");
        numMap.put(9, "九");
        CardType[] enums = CardType.values();
        for (CardType cardType : enums) {
            types.put(cardType.getValue(), cardType);
            typeNames.put(cardType.getValue(), cardType.getName());
        }
    }

    /**
     * 获取牌类型枚举
     *
     * @param typeValue 牌类型值
     * @return 牌类型枚举
     */
    public static final CardType getCardType(int typeValue) {
        return types.get(typeValue);
    }

    /**
     * 获取牌的类型名
     *
     * @param typeValue 牌类型
     * @return 牌类型名
     */
    public static final String getCardTypeName(int typeValue) {
        return typeNames.get(typeValue);
    }

    /**
     * 获取牌类型数值表示
     *
     * @param card 牌号
     * @return 牌类型数值表示
     */
    public static final int getCardTypeValue(int card) {
        if (card < 40) {
            return HandCards.getCardLeftValue(card);
        }
        return card;
    }

    /**
     * 将牌数据转换为现实中可读的牌
     *
     * @param card 牌数据
     * @return 现实中可读的牌
     */
    public static final String getCardName(int card) {
        if (card < 40) {
            int type = HandCards.getCardLeftValue(card);
            int point = HandCards.getCardRightValue(card);
            StringBuilder sb = new StringBuilder();
            sb.append(numMap.get(point));
            sb.append(getCardTypeName(type));
            return sb.toString();
        }
        return getCardTypeName(card);
    }

}

以上定义了各张牌的数字表示,接下来我们分析手牌的存储结构,手牌可以用一个数组表示,数组下标号能除尽10的数组元素为保留位,不用于存储任何数据。举例解释此数组存储牌的数据结构:

0号下标保留位
1~9号下标为万字牌牌点,其对应的数组元素为牌的张数
10号下标保留位
11~19号下标为条字牌牌点,其对应的数组元素为牌的张数
20号下标为保留位
21~29号下标为筒字牌牌点,其对应的数组元素为牌的张数
40~46号下标分别表示东、南、西、北、中、发、白的存储位。

根据以上的定义,则可以根据数组下标获得万条筒字牌的类型和牌点,(下标/10 + 1) 则为字牌类型,(下标%10) 则为字牌点数。

具体定义一个手牌类,里面定义了各种静态的换算函数,可参看注释。

/**
 * 手牌
 *
 * @author zkpursuit
 */
public class HandCards {

    /**
     * 获取牌号最左边的一位数,如果牌为筒、条、万,则返回值为牌类型数值
     *
     * @param card 牌号
     * @return 牌号从左至右第一位数(十位数)
     */
    public final static int getCardLeftValue(int card) {
        return card / 10
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Eclipse是一个开放源代码的集成开发环境(IDE),可用于Java开发,但也可以用于其他编程语言的开发。在本中,我将向你展示如何使用Eclipse进行Java开发。 1. 下载Eclipse 首先,你需要从Eclipse官方网站下载Eclipse IDE。下载页面上将提供几个不同的版本,包括Eclipse IDE for Java Developers、Eclipse IDE for JavaScript and Web Developers,以及Eclipse IDE for C/C++ Developers等。选择适合你的版本,然后按照安装向导进行安装。 2. 创建Java项目 一旦你安装了Eclipse,你可以启动它并创建一个新的Java项目。选择“File”->“New”->“Java Project”,然后按照向导创建一个新的Java项目。在创建项目时,你需要指定项目名称、项目类型以及JRE版本等信息。 3. 创建Java类 一旦你创建了一个Java项目,你就可以创建一个Java类。选择你的Java项目,在“src”件夹上右键单击,然后选择“New”->“Class”。输入类名和选择要继承的类(如果有的话),然后点击“Finish”。 4. 编写Java代码 现在你已经创建了一个Java类,可以开始编写Java代码了。在Eclipse的编辑器中,你可以输入Java代码并保存它。当你保存Java件时,Eclipse会自动编译你的代码,并在Problems视图中显示任何编译错误。 5. 运行Java程序 一旦你编写了Java代码并保存了它,你可以运行Java程序。右键单击Java件,然后选择“Run As”->“Java Application”。如果一切顺利,你的Java程序将在控制台中输出结果。 6. 调试Java程序 如果你的Java程序出现了错误或不按预期运行,你可以使用Eclipse的调试器来调试它。在Eclipse的编辑器中,你可以设置断点并启动调试器。当程序执行到断点时,调试器会暂停程序并允许你检查变量、运行代码等。 7. 导入外部JAR包 有时,你可能需要使用外部JAR包来完成你的Java项目。在Eclipse中,你可以简单地将外部JAR包导入到你的项目中。右键单击Java项目,然后选择“Build Path”->“Configure Build Path”。在“Libraries”选项卡上,你可以添加外部JAR包。 总结 在本中,我们介绍了如何使用Eclipse进行Java开发。我们学习了如何创建Java项目、创建Java类、编写Java代码、运行Java程序、调试Java程序以及导入外部JAR包。Eclipse具有强大的功能,可以大大提高Java开发的效率。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值