麻雀ボットのためのアルゴリズム


はじめに
以下のアルゴリズムは麻雀ボット用AIまたは「人工知能」のレベルについて記載しています。実装麻雀ボットは自己学習型ではなく、常に以下のアルゴリズムに厳格に従って動作します。

麻雀ボット用に選択されたアルゴリズムは、麻雀経験者がどのようにゲームに臨むかに関する観察と解析に基いていました。以下のアルゴリズムは、麻雀の組み合わせを揃えていくために麻雀経験者が用いる最も頻繁に使用されている方法を実行します。

一般規定
  • 麻雀ボットは、ゲームの規則に従って一般プレーヤーが入手するものと同じオープン情報にのみ従って判断していく。
  • ボットは山の牌や対戦者の門前の手を決して見ることができない。
  • ボットは自己学習型ではなく、アルゴリズムに厳格に従って進めていく。対戦者やスコアによってその競技スタイルを変えることはない。
  • ボット用のアルゴリズムとその優先組み合わせは、最低点数(MP)の設定に応じて変わり、最低点数0(MP0)と最低点数8(MP8)で同じ麻雀バリエーションをプレーするボットは異なる競技スタイルを進める。
  • 香港麻雀の七対子、大三元、国士無双など、実現が難しい大きな役の組み合わせを揃えることは決して試みない。

    定義
    1. 見え牌
    見え牌は、捨て牌場所(河)や対戦者が鳴いたりした面子(リーチ麻雀ではドラ、カンドラ、カンドラ牌も含む)などにあるすべての牌を指す。

    2. 死に牌
    死に牌は、組み合わせが不可能になった門前の手の中の牌(国士無双を構成する13牌を除く)を指す。対を構成することもできない。

    たとえば、南が手にあるが、すでに3枚河に捨てられていれば、手にある南は死に牌になる。 手に竹2(リャンゾウ)があり、竹1が4枚、竹2が3枚、竹3が4枚手牌でオープンになっている場合、手の竹2は死に牌になる。
    3. 不要牌
    不要牌は、組み合わせられる可能性が少ない牌を指す。
    不要牌の例:
  • 牌または三元牌が1種類だけ手牌にあり、見え牌にもこれらの牌が1牌または2牌ある場合、これらの牌は不要牌になる。
  • ある数牌が1枚だけ手牌にあり、それが対にしかならない場合、その数牌は不要牌になる。

    4. 孤立牌
  • 門前の手牌に風牌または三元牌が1枚だけあるとき、この風牌または三元牌は孤立牌になる。
  • 門前の手牌にその数牌と同じ数牌、または1か2しか離れていない数牌がない場合、その数牌は孤立牌になる。
    例:手牌:竹1、竹2、竹4、萬1、萬4、筒1、筒2、筒3、筒4、南、北、北、北
    竹4 -孤立牌ではない
    筒1、筒4 -孤立牌ではない
    萬1、萬4、南 -孤立牌

    5. A とび牌
  • 未完成順子から1離れている数牌
    例:
    竹1、竹2、竹4  萬2、萬4、萬5
    萬2がとび牌になる。竹1と竹3はカンチャン待ち牌で、単独牌でもとび牌でもない

  • その牌を捨てても門前の組み合わせ(順子、刻子、槓子、対子)の最大数が減らないときの数牌前出の手牌による例:
    竹1、竹2、竹4、萬1、萬4、筒1、筒2、筒3、筒4、南、北、北、北
    竹4、筒1、筒4がとび牌。

    6. 未完成死に順子
    面子として揃えられない門前手牌の連番数牌。
    たとえば、手牌に竹1と竹2があるが、見え牌に竹3がすでに4枚あるとき、竹1と竹2は未完成死に順子になる。

    7. 死に対
    完成刻子に揃えられない対。
    たとえば、竹2が2枚手牌にあり、見え牌にも竹2が2枚あるとき、2枚の竹2は死に対になる。

    8. 未完成順子
    ペンチャン待ちの牌や両面待ちの牌がない連番数牌。

    香港麻雀最点数0(MP0)用のボットアルゴリズム

    1. 捨て牌
    ボットは、手牌と見え牌を分析してから捨て牌を判断します。
    以下の捨て牌優先順位に基いて牌を分析し、最高の優先順位の牌を選択します。
    捨て牌優先順位:
  • 死に牌
  • 不要牌
  • 未完成死に順子の牌
  • 手牌に死に対が複数ある場合の死に対の牌
  • 孤立牌(字牌以外)
  • 孤立牌(三元牌と風牌)
  • とび牌
  • 未完成順子の牌
  • 死に対の牌
  • 対の牌

    2.和了の宣言
    ボットは必ず和了の宣言を受け入れます。

    3. 完成槓子
    ボットは必ず牌を槓子に追加することに同意します。

    4. 刻子、槓子、順子
    面子を揃えるのに使用できる牌を捨てる前に、ボットは面子宣言前後の門前の組み合わせ(刻子、槓子、順子のみ)の最大数を比較する必要があります。
    以下の場合に面子が宣言されます:
  • 面子宣言前後で門前の最大組み合わせ数が同じ場合。
  • 門前の最大組み合わせ数が一つ減る場合。この場合は、槓子の組み合わせが宣言されます。

    香港麻雀1 < MP <= 8 (1, 2, 3 飜縛り)用のボットアルゴリズム
    このゲームのバリエーションでは、手牌に少なくとも3飜必要で、そうでない場合は和了できません。
    ボットが4面子を揃えながら和了できない場合を排除するため、ゲームの最初からボットは二つの比較的単純な組み合わせである対々和、および数牌と字牌、の一つを揃えるようとします。
    ボットが牌を捨てるときは必ず、上記二つの組み合わせのどちらの可能性が高いかを判断します。
    その各組み合わせの可能性は以下の方法で最高飜数により判断されます:
    対々和
    各門前またはオープンの刻子または槓子:5符
    各対:2符

    数牌と字牌
    15基本符
  • 各非共通数牌:2符
  • 各三元牌または風牌:1符
    ボットが数牌と字牌を揃える場合の捨て牌最優先順位:
  • ボットが対々和で揃える場合、不要な数牌を捨てます。 捨て牌に順子のための判断は加わりません。
    アルゴリズムの残り部分はMP0と同様です。

    香港8 < MP <= 16 (4, 5, 6飜縛り)用の麻雀ボットアルゴリズム

    手牌に1飜確定されていない場合、 このバリエーションにおけるボットは、数牌1種類だけ揃え、他の数牌、風牌、三元牌を捨てます。

    香港16 < MP (7飜縛り)用の麻雀ボットアルゴリズム

    このゲームのバリエーションでは、ボットは数牌1種類だけの組み合わせを揃え、運任せの偶然牌(花牌、海底牌、ツモ等) を揃えようとします。

    リーチ麻雀用の麻雀ボットアルゴリズム
    リーチ麻雀では、手に少なくとも1 役必ず必要です。
    オープンの手牌で可能な単純組み合わせと門前の手牌でのみ可能な別の組み合わせがいくつかあります。
    そのため、門前で行くかオープンで行くかがボットの重要な判断事項になります。

    ボットがすでにオープンの面子を持っている場合は、オープンの手牌の組み合わせのみ追求します。
    ボットが刻子、門前槓子、ツモる可能性のある三元牌か自風牌か場風牌の対を持っている場合は、オープン手牌で進めようとします。
    そうでない場合は、門前手牌で進めようとします。

    リーチできる機会が訪れれば、ボットは必ずリーチします。
    ボットがオープン手牌で進め、持っている三元牌か自風牌か場風牌の対が一つしかない場合(役なし)は、ボットはその対の牌を決して捨てませんが、代わりに門前の順子か刻子の牌を捨てることもあります。
    上記規則がすべて適用された後、ボットは正確に香港MP0ボットと同じ競技スタイルで進めていきます。

    赤牌麻雀バリエーション用の麻雀ボットアルゴリズム

    赤牌麻雀のバリエーションでは、ボットはジョーカー牌を決して捨てません。
    他の点では、いくつか例外はありますが、ボットは正確に香港バリエーションと同じ競技スタイルで進めていきます。

    最低符数が1以上12未満の場合、ボットは対々和か混一色のいずれかで揃えようとします。
    揃える組み合わせの判断基準は香港麻雀と同じです。
    最低符数が12を超える場合、ボットは清一色を目指します。大部分の数牌を門前で揃え、他の数牌と三元牌をすべてまっ先に捨てていきます。