シャンテン数 小粒プログラミング

#19 通常手のアガリとシャンテン数を算出する~再帰呼び出し版

更新日:

Javascriptで遊ぶ麻雀小粒プログラミング
チートイツと国士無双を除く通常手のアガリ判定とシャンテン数を再帰呼び出しで算出する処理を紹介します。

プログラムの解説と実行

アガリ判定とシャンテン数のチェックをする処理を紹介します。アガリ判定とシャンテン数は手牌(tehai)の中身を調べて行います。国士無双、チートイツ、通常手(4面子+1雀頭)の3つの処理に分けて調査します。

通常手のシャンテン数を求める

麻雀は「4メンツ+1雀頭」を集めるゲームです(通常手の場合)。メンツ(コーツやシュンツ)とメンツ候補になるターツやトイツが増える毎にシャンテン数は減っていきます。シャンテン数を求める式は次のようになります。

通常手のシャンテン数を求める式
シャンテン数 = 8 - メンツ数×2 - ターツ数 - 雀頭

上記の式の場合、テンパイは「0」でアガリは「-1」になります。なお、国士無双とチートイツの扱いは別になり、シャンテン数を求める計算式も異なります。このページでは今回は扱いません。

アガリとシャンテン数を求める手順
(1)雀頭がある場合
  1. 雀頭を抜き出す→シュンツを抜き出す→コーツを抜き出す→ターツを抜き出す
  2. 雀頭を抜き出す→コーツを抜き出す→シュンツを抜き出す→ターツを抜き出す
(2)雀頭が無い場合
  1. コーツを抜き出す→シュンツを抜き出す→ターツを抜き出す
  2. シュンツを抜き出す→コーツを抜き出す→ターツを抜き出す

各手順で算出されたシャンテン数を比較して最小のシャンテン数を結果として採用します。プログラムでは手牌の元となるtehai配列から完全に独立したコーツとシュンツを前もって抜いてからクローン(tempTehai配列)を生成し、再帰呼び出しでシャンテン数を計算していきます。

大まかな手順はこんな感じです。コードには手を入れないといけませんが、参考になると幸いです。

リンク牌効率/牌理学習ツール




シャンテン数を求めてみよう

手牌を作ってプログラムの動作を確認してみましょう。操作は簡単です。牌をクリックすると下のパネル内に牌が追加されていくます。[シャンテン数を調べる]ボタンを押すとシャンテン数を調査する手順が表示されます。




手牌:0牌(最大入力数は14牌) ※任意の牌をクリックして消すことができます。
シャンテン数:テンパイは「0」、アガリは「-1」になります。

面子多々(めんつたーた)の場合の処理

ターツの抜き出しとカウントを途中で中断して処理を抜けています。したがって算出したターツ数が実際のターツ数と異ります。

たとえば、下の手牌は「2メンツ+3ターツ+1雀頭」ですが、プログラム内部ではメンツとターツの合計が4つになった時点で処理を抜けて「ターツ数 = 2」を返すようにしています。

mentsu_suu=kanzen_koutsu_suu+koutsu_suu+kanzen_shuntsu_suu+shuntsu_suu;
if(mentsu_suu+taatsu_suu<4){//メンツとターツの合計は4まで

現状での不具合と解決策(解決済2015/11/15)

カンツが混じっている場合シャンテン数が正確に算出されない不具合が見つかっています(2015年3月時点)。下の手牌のシャンテン数は1にならないといけないのですが、結果はテンパイになってしまいます。

これは「東がコーツ、残り1枚の東の単騎待ち」に解釈されるためです。いずれ解決しないといけませんが、今回はとりあえずここまでにしておきます。



JavaScriptソースコード

本記事で紹介したサンプルプログラムをダウンロードできます。

ダウンロードをする前にお読みください

  • サイトで紹介している記事の内容や公開しているプログラムの動作は100%保障するものではありません。
  • 当プログラム使用による如何なる不具合やトラブル、損害の責任も負いかねます。
  • 当プログラムは断り無く内容が変わることがあります。
  • 当プログラムを別サイトで配布することは禁止します。
  • サポートはいたしません。
  • 自己責任にてご利用くださいませ。

以上をご確認の上、プログラムのダウンロードをお願いいたします。

サンプルプログラムのソースコード

ソースコードは折りたたんであります。[+]を押すと、折りたたまれたソースコードが開きます。[-]を押すと、コードは折りたたまれます。

program_019.jsを開く
paiput2.jsを開く
program_019.cssを開く

おすすめレンタルサーバー

エックスサーバー|高速・高機能レンタルサーバー

オールSSDの快適ハイスペック環境」「国内管理、大容量バックボーン」「独自SSLが無料」「FastCGIなどの高速化機能」「最新のPHP7を実装」など、高機能・高コストパフォーマンスなレンタルサーバーです。※当サイトも「エックスサーバー」で運用しています。

 

独自ドメインプレゼントキャンペーン情報

キャンペーン期間中にサーバーアカウントを契約すると、独自ドメインが1つもらえます。しかも、更新料も無料。運用コストを軽減します。

期間は、2017年10月16日より2017年11月30日まで、お見逃しなく。

-シャンテン数, 小粒プログラミング
-,

Copyright© 麻雀ツール点数計算ラボ , 2017 All Rights Reserved.