822 Words

清一待ちあてアプリを作りました。

既存の麻雀ライブラリを使おうとも思ったのですが、探してみてもよさそうなものもなかったので、自作の麻雀ライブラリを作成しました。

実装してて興味深いなと感じたのはシャンテン数のカウントと役の判定でした。

シャンテン数のカウントはこちらのサイトを参考にして実装してあります。ただ、清一だとその性質上面子・ターツの抜き出し方が豊富であるので、計算量が爆発しがちです。そのため、あらかじめ[牌の並び => (面子の数, ターツの数)]の Map を作っておいて実際の計算時にはそれを利用するようにしています。初回のバッチ計算時はメモ化再帰をすることで高速化しました。

役の判定では、アガリ形のすべての面子の抜き出し方に対して対応する役をそれぞれ加算していき、その中から最もアガリ点が高いものを採用します。清一やタンヤオは構成している牌の属性だけみればいいですが、平和や一盃口は牌の分け方によって役がつく牌とつかない牌が存在します。さらに、同じ牌で上がっても牌の分け方が異なれば役がつかないケースがあります。例えば、1222333444789m という牌姿は 1234m 待ちですが、1m でアガった際は(222333444)をアンコとしてみると[清一, 三暗刻]、(44)をアタマとしてみた[清一, 平和, 一盃口]の分け方があります。分け方によって付く役と付かない役が存在するので、これを区別しないと 1m でのアガリが[清一, 三暗刻, 平和, 一盃口]になってしまいます。ちなみに、これに対して平和をつけてもいいとするローカルルールがあるらしいです。上の形はテストプレイしてて見つけたのですが、調べてみたらアガるまで平和か三暗刻になるかわからない牌姿として少し有名?みたいですね。

実際の麻雀を再現するための実装にはなっていないので、あくまで面前の清一の待ちあてができるところまでのライブラリにはなっているのですが、拡張して実際の麻雀アプリを作るのも面白いかもしれません。