麻将机器人算法


简介

以下算法介绍了麻将机器人的人工智能或“智力”水平。
所实现的麻将机器人不会自主学习,而是永远严格按照以下算法执行动作。

所选的麻将机器人算法以对经验丰富的麻将玩家处理游戏的方式的观察和分析为基础。以下算法实现了经验丰富的玩家在组合麻将组合时最常用的方法。

一般规定

  • 麻将机器人只会根据游戏规则,按照普通玩家可访问的相同的公开信息做出决定。
  • 机器人决不会看到牌墙中的牌张或任何其他玩家手中的牌张。
  • 机器人不会自我学习,只会严格按照算法进行操作。机器人不会根据它们的对手或分数而改变它们的行为。
  • 机器人的算法以及它们的首选组合根据最低分数的设置而有所不同,因此,在玩同一麻将变化时,最低分0与最低分8的机器人的行为将会有所不同。
  • 机器人永远不会尝试组合难以完成的特殊高计分组合,例如,在香港麻将中,机器人将永远不会组合七对、大三元、十三幺等。

    定义
    1、可见牌
    可见牌是指公开丢弃区(牌池)中的所有牌张以及其他玩家亮出牌的所有牌张(在立直(Riichi)版本中,可见牌包括宝牌、杠宝牌和里宝牌)

    2、死牌
    死牌是指自己手牌中握有的不能再组成任何麻将组合的牌(十三幺除外)。死牌也不能组成对子。
    例如,如果手中有一张“南风”,但是可见牌中已经有了三张“南风”,那么手中的这张“南风”就是一张死牌。
    如果手中有一张“两条”,而可见牌中有四张“一条”、三张“两条”、四张“三条”,那么手中的这张“两条”就是一张死牌。

    3、问题牌
    问题牌是指不太可能组成一个组合的牌张。
    问题牌的例子有:
  • 如果手中只有一张风牌或箭牌,而可见牌中有1张或2张这些牌,那么手中的风牌或箭牌即为问题牌。
  • 如果手有只有一张数字牌,并且它只能凑成对子,那么手中的数字牌即为问题牌。

    4、单张
  • 手牌中仅有的一张风牌或箭牌
  • 手牌中没有相同的或没有相差1或2的任意数字牌张 例如:手中的牌有:1条、两条、四条、一万、四万、一筒、两筒、三筒、四筒、南、北、北、北

    那么:四条不是单张
    一筒和四筒不是单张
    一万、四万、南是单张

    5、次牌
  • 非完整顺子中相差为1的任意数字牌张 例如:
    一条、两条、四条 两万、四万、五万
    四条、两万是次牌,而一条、三条是不完整的组合,所以一条和三条即不是单张,也不是次牌。
  • 打出去不会减少隐藏组合(吃、碰、杠、对)最大数量的任意数字牌张。 例如,拿前面的手牌为例:
    1条、两条、四条、一万、四万、一筒、两筒、三筒、四筒、南、北、北、北
    四条、一筒、四筒为次牌

    6、死的非完整顺子
    手牌中无法凑成顺子的两张连续的数字牌张。
    例如,如果手中有一条、两条,但是可见牌张中已经有了四张三条,那么该一条和二条的组合就是一个死的非完整顺子。

    7、死对子
    无法凑成“刻子”的对子。
    例如,如果手中有两条、两条,但是可见牌张中也有两条、两条,那么手中的两条、两条就是一个死对子。

    8、非完整顺子
    没有第三张的两张连续的序数牌张或者两张序数牌张相差2。

    香港麻将最低分0机器人算法


    1、 出牌
    机器人会在分析自己手牌中的牌张和可见牌张后决定出什么牌。
    机器人会根据以下的出牌优先顺序进行搜索,并选择优先级最高的一张牌。

    出牌优先顺序:
  • 死牌
  • 问题牌
  • 死的非完整顺子中的牌张
  • 死对子中的牌张(如果手中有超过1对以上的死对子)
  • 单张(非字牌)
  • 单张(箭牌和风牌)
  • 次牌
  • 非完整顺子中的牌张
  • 死对子中的牌张
  • 对子中的牌张

    2、麻将报牌
    机器人始终接受麻将报牌。

    3、杠的完成
    机器人始终同意添加牌张进行杠牌。

    4、碰、杠、吃
    在打出可能用于组成任何组合的牌张之前,机器人需要对比报牌之前与之后的隐藏组合(仅吃、碰、杠)的最大数量。
    在以下情况下才会报牌组合:
  • 组合报牌之前与之后的隐藏组合的最大数量相同
  • 隐藏组合的最大数量减1,在这种情况下,将会宣布杠牌组合。

    香港麻将1 < 最低分 <= 8 (1, 2, 3 番)机器人算法
    在该游戏变化中,手中至少需要有3番,否则就不能报和牌。
    为了排除机器人组成4个组合仍然不能报和牌的这种情况,从游戏一开始,机器人将尝试组合两种相对简单的组合:刻子或一色带字牌。
    机器人每次出牌时,它都需要确定以上两种组合中的哪一种更有可能成功。
    每一种组合的可能性通过以下方式由分数的最高数量决定:
    碰牌 每次暗碰或明碰、或者暗杠或明杠加5分 每对加2分

    一色带字牌
    基本分数15
  • 每个非共用花色牌张2分
  • 每个箭牌或风牌1分

    如果机器人组合刻子,则会打出不正确花色中的一张牌张,计算出牌不包括检查吃牌。
    其余算法与最低分0相同。

    香港 8 < 最低分 <= 16(4, 5, 6 番)麻将机器人算法


    该游戏变化的机器人以之前的变化为基础。
    如果手牌中有1个确定的番种(自风花牌或四季牌、箭牌刻子或自风或圈风刻子),机器人的行为将与之前级别的机器人相同。
    如果手牌中没有1个确定的番种,该游戏变化中的机器人将组合清一色,并打出其他花色的牌张以及风牌和箭牌。


    香港 16 < 最低分(7+ 番)麻将机器人算法


    在该游戏变化中,机器人只会组合清一色组合,旨在靠运气集合缺失的牌张(花、最后摸牌、自摸等)。

    立直(Riichi)麻将机器人算法

    根据立直(Riichi)麻将规则,手牌中必须始终要有至少1个字牌。
    有少数几种简单的组合可用于全求人牌局,还有其他几种只可用于门前清牌局。
    因此,机器人的主要决定是要起全求人还是门前清牌局。

    如果机器人已经有一个公开的组合,那么它将只会选择全求人组合。
    如果机器人有一个刻子、杠子或者一对活箭牌对子或自风或圈风,那么它将选择起全求人牌局。
    否则,机器人将选择起门前清牌局。

    如有机会宣布,机器将将始终宣布立直(Riichi)。
    如机器人起全求人牌局,在只有一对箭牌对子或自风或圈风(没有字牌)的情况下,机器人决不会打出对牌中的牌张,而是可以从隐藏的顺子或刻子中选择要打出的牌张。
    在应用上述所有规则之后,机器人的操作将与香港最低分0机器人完全相同。

    红中麻将变化机器人算法


    在红中麻将的所有变化中,机器人决不会打出百搭牌。
    在其他方面,除极少数情况以外,机器人的操作与香港变化中的机器人完全一样。

    如果最低分大于0但小于12,机器人将尝试集合所有刻子或一色带字牌组合。

    决定集合哪种组合的规则与香港麻将一致。
    如果最低分大于12,机器人将只会集合清一色。机器人将集合自己手牌中拥有的最多的花色,并且首先会打出所有其他花色牌张和字牌牌张。