配牌を取ってシャンテン数を当てるミニゲームを紹介します。
アガリとシャンテン数を算出するでひと通り完成したシャンテン数算出プログラムを使って、簡単なシャンテン数当てゲームを作ってみました。配牌を取ってシャンテン数を数えて答え合わせをするだけです。いわゆるたたき台ですね。メンツやターツの構成を素早く把握する練習にご利用ください。
関連ツール シャンテン数当てゲーム操作は簡単です。[配牌を取る]ボタンを押すとパネル内に配牌が表示されます。続いて[シャンテン数を確認する]ボタンを押すとシャンテン数が表示されます。
ソースコードは全体の一部です。全ソースコードを見る場合は、ソースリンクを開いてください。
「program_012.js」内のシャンテン数算出プログラムは、「通常手のアガリとシャンテン数を算出する~再帰呼び出し版)」のシャンテン数プログラムに差し替えました(2016年7月14日)。
//============================================================================ //元になる牌山を生成する関数 function makePaiYama(){ var i; for(i=0;i<136;i++){ yama[i] = paiYama[i].paiNo; } } //============================================================================ //牌山をシャッフルする関数【Mersenne Twister in JavaScriptを利用】 function shufflePaiYama(){ var mt = new MersenneTwister();//MersenneTwister オブジェクトの初期化 var i,j,k; for(i=135;i>0;i--){ j = mt.nextInt(0, 135); // 0 以上 135 未満の乱数(整数)を発生させる k = yama[i];//変数kに退避 yama[i] = yama[j];//乱数で発生した番地の牌を代入する yama[j] = k;//変数Kから戻す } } //============================================================================ //牌山から手牌配列に格納する関数 function inputTehaiStore(){ tehai = [0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0];//初期化 var i; for(i=0;i<13;i++){ tehai[yama[i]] ++; } } //============================================================================ //配牌を取って牌画で表示する //============================================================================ $("#PaiSetBtn").click(function() { red5manCount = 0;//赤5マンの数 red5pinCount = 0;//赤5ピンの数 red5souCount = 0;//赤5ソウの数 $("#paiTehaiAllSyantenCheck").empty(); makePaiYama();//牌山を生成する関数を呼び出す shufflePaiYama();//牌山をシャッフルする関数を呼び出す inputTehaiStore();//手牌を配列(tehai)に格納する関数を呼び出す checkReddora();///赤ドラの有無をチェックする関数を呼び出す //手牌表示処理 (function (){ var paiTepai = $("#paiTehaiSort2");//要素をキャッシュする var i,k,kazu; var paiga=""; paiTepai.empty(); for(i=1;i<38;i++){ if(i%10==0){continue;} //赤五萬の位置を修正する if(i==5 && red5manCount==1){ //tehai[5]-=1; paiga = "<span class=\"" + paiType[0].cssSprite + "\"></span>";//cssスプライトの牌画を配置 paiTepai.append(paiga); } //赤五筒の位置を修正する if(i==15 && red5pinCount==1){ //tehai[15]-=1; paiga = "<span class=\"" + paiType[10].cssSprite + "\"></span>";//cssスプライトの牌画を配置 paiTepai.append(paiga); } //赤五索の位置を修正する if(i==25 && red5souCount==1){ //tehai[25]-=1; paiga = "<span class=\"" + paiType[20].cssSprite + "\"></span>";//cssスプライトの牌画を配置 paiTepai.append(paiga); } //通常の手牌表示処理 if(tehai[i]){ kazu = tehai[i]; for(k=0;k<kazu;k++){ paiga = "<span class=\"" + paiType[i].cssSprite + "\"></span>";//cssスプライトの牌画を配置 paiTepai.append(paiga); } } } })();//手牌表示処理-終了 //牌の数を表示する (function (){ var PaiCount = 0; //入力された牌の枚数 for(var i=0;i<38;i++){ PaiCount += tehai[i]; } $("#paikazu").empty().append(PaiCount); })(); }); //============================================================================ //シャンテン数を表示する //============================================================================ $("#SyantenCheckBtn").click(function() { var msg; red5manCount = 0;//赤5マンの数 red5pinCount = 0;//赤5ピンの数 red5souCount = 0;//赤5ソウの数 checkReddora();//赤ドラチェックして配列を操作する関数を呼び出す moveReddora();//赤ドラを移動させる操作する関数を呼び出す var syanten_suu = allsyantenCheck();//シャンテン数を算出する if(!syanten_suu){ msg = "テンパイです"; }else{ msg = syantenCheck() + "シャンテン<br>"; msg += "【通常手のシャンテン数】" + syantenCheck(13) + "シャンテン<br>"; msg += "【チートイツのシャンテン数】" + syanten_7toitsu() + "シャンテン"; } $("#paiTehaiAllSyantenCheck").empty().append(msg); }); //============================================================================ //アガリとシャンテン数を返す関数 //============================================================================ function allsyantenCheck(){ var syanten_suu; var syanten_temp = 0; var syantenkokusi = syanten_kokusi();//国士無双のシャンテン数を算出する関数の呼び出し if(!syantenkokusi||syantenkokusi==-1){ return syantenkokusi; } var syanten7toitsu = syanten_7toitsu();//チートイツのシャンテン数を算出する関数の呼び出し if(!syanten7toitsu||syanten7toitsu==-1){ return syanten7toitsu; } syanten_suu = syantenCheck(13);//通常手のシャンテン数を算出する関数の呼び出し if(!syanten_suu||syanten_suu==-1){ return syanten_suu; } return Math.min(syantenkokusi,syanten7toitsu,syanten_suu); } //============================================================================