プログラミング 麻雀ツール

プログラミングの世界から覗いたブロック理論(1)~ブロックの抜き方について

趣味で麻雀のWEBツールを作って公開しています。メインのプログラミング言語は、WEBサービスの性質上、JavaScriptを利用しています。

WEBツールで利用したコードを短くまとめたプログラミング集のページも開設してます。自分のプログラミングのスキルアップや、小粒プログラムをモジュール化っぽく再利用しようというのが開設の目的です。もし、興味があればぜひ御覧ください。

リンクJavaScriptとHTML5で遊ぶ麻雀小粒プログラミング

さて、シャンテン数を算出するプログラムがあります。このプログラムにメンツ数・ターツ数・ブロック数を求める機能を実装することになりました。

シャンテン数を求める手順を簡単に紹介します。

【手順1】雀頭抜き出し→コーツ抜き出し→シュンツ抜き出し→ターツ抜き出し
【手順2】雀頭抜き出し→シュンツ抜き出し→コーツ抜き出し→ターツ抜き出し
【手順3】雀頭が無い場合:コーツ抜き出し→シュンツ抜き出し→ターツ抜き出し
【手順4】雀頭が無い場合:シュンツ抜き出し→コーツ抜き出し→ターツ抜き出し

まず、雀頭を抜く作業から始めます。手牌に同種牌が2枚以上存在していたら雀頭としてトイツで抜き出します。そして、残りの手牌からメンツとターツを抜いていきます。処理が一巡したら手牌を元の状態に戻し、次の雀頭候補を抜く処理を行います。雀頭候補が無くなるまで繰り返します。雀頭を抜く処理は全牌種に対して行います。つまり、34回繰り返すことになります。

ターツは次の手順で抜き出します。

【手順1】トイツ抜き出し
【手順2】リャンメン・ペンチャンの抜き出し
【手順2】カンチャンの抜き出し

とにかく、手牌からメンツとターツを抜いて抜いて抜きまくります。これら手順を何回も繰り返します。

手順を繰り返すことで、シャンテン数が求められます。各手順が1周するごとに複数のシャンテン数が発生します。これらを比較して、一番少ないシャンテン数を採用します。

ざっくばらんですが、こんな感じでシャンテン数を算出します。
パット見でわかる手牌でも、プログラムは決められた手順を愚直に黙々と繰り返し実行します。回数は多いですが、そこはそれ、計算能力が人間よりはるかに卓越したコンピュータだからこそできる技なのです。

シャンテン数算出プログラムの動作例

それでは、非公開テストページで動作確認をした例を紹介します。

シャンテン数算出プログラムのブロック抜き出し例

シャンテン数算出プログラムの動作例

【雀頭あり】コーツ抜き出し→雀頭抜き出し→シュンツ抜き出し→ターツ抜き出し

【雀頭あり】コーツ抜き出し→雀頭抜き出し→シュンツ抜き出し→ターツ抜き出し

暗刻の五萬を雀頭として抜く必要は無いのですが、プログラムは決められた手順通りでしか動きません。無駄とわかりつつも愚直に抜く作業を行います。

【雀頭あり】雀頭抜き出し→シュンツ抜き出し→コーツ抜き出し→ターツ抜き出し

【雀頭あり】雀頭抜き出し→シュンツ抜き出し→コーツ抜き出し→ターツ抜き出し

雀頭ありだと、5ブロックになるようです。

【雀頭無し】コーツ抜き出し→シュンツ抜き出し→ターツ抜き出し

【雀頭無し】コーツ抜き出し→シュンツ抜き出し→ターツ抜き出し

【雀頭無し】シュンツ抜き出し→コーツ抜き出し→ターツ抜き出し

【雀頭無し】シュンツ抜き出し→コーツ抜き出し→ターツ抜き出し
おや?雀頭無しだと4ブロックになりますね。

最後まで処理が終わり、シャンテン数やブロック数等を無事出力することができました。ちみなに、0シャンテンとテンパイは同じ扱いです。表記が間際らしくてすいません。

ここでひとつ疑問が湧いてきました。

亜リャンメンは何ブロックなのか?

という疑問です。最終結果では1ブロックになるのですが、処理過程で

雀頭+ターツ

になる箇所がでてきます。

はたして、亜リャンメンは何ブロックか?次回の記事で、この件について考えてみようと思います。

というわけで、続く...

おすすめ麻雀本

G・ウザク

三才ブックス

-プログラミング, 麻雀ツール
-, ,