
麻雀プログラムの動作チェックは牌画を表示させることで格段に作業効率が向上するというお話です。
動作チェックとバグ取りをしっかりやろう
完成したと思ったプログラムでも思わぬバグが潜んでいることがあります。一見正常に動いていても正しい結果が返ってこないこともあります。たとえば、シャンテンチェックプログラムにも次のような不具合が残っています。なお、これら不具合は現在は解決済です(2015/03/18現在)
不具合その1~手牌にカンツがあるケース
雀頭で抜き出した残り2枚がメンツ候補としてカウントされたり、コーツで抜き出した残り1枚が単騎待ち牌になったりします。したがって正確なシャンテン数が算出されません。


不具合その2~メンツがターツ扱いになる
抜き出し方でメンツがターツ扱いになるパターンがあるのは当然なのですが、メンツとして認識されるパターンが出現しないのは深刻です。同じく、このケースも正確なシャンテン数を得ることができません。


- 赤ドラに対応
- 手牌入力操作の改善
- 赤ドラがリセットされない不具合を修正
同種牌のシャンポン待ちができないようにした5枚目の単騎待ちができないようにした- コードを大幅に見直し修正。2015年4月3日現在
- シュンツの抜き方を大幅に見直し修正。2015年12月01日現在
再帰呼び出しで組み直したプログラムも紹介しています。シュンツ抜き取り漏れが解決しています。ご参考ください。通常手のアガリとシャンテン数を算出する~再帰呼び出し版
動作チェックプログラムの実行
抜き出しパターンは手牌でも10通り以上、一色手になると50回以上の抜き出しパターンが現れることがあります。ここから最適化されたパターンを探しだすのは非常に困難です。シャンテン数が合っていてもそれが正しいのかを見極めるのは難しいです。というわけで、抜き出しパターンを牌画で視覚化して見やすくなるようにしてみました。作業効率が飛躍的に向上しました。実際に運用した感想です。おかげで沢山のバグが見つかり、プログラムの見直しの機会を得ることができました(笑)
実行してみよう
今回は通常手のアガリとシャンテン数をチェックするプログラムの動作チェックをします。牌画をクリックして手牌を作り、[動作チェックする]ボタンを押してシャンテン数と抜き出しパターンを出力します。以上です。
今後の展望
プログラムは試行回数を減らしたりコードをスッキリさせるなど、見直す必要があると思います。今後も新しい不具合が見つかるかもしれません。チェックを重ねてより良いプログラムを公開できるように努めるつもりです。
JavaScriptソースコード
本記事で紹介したサンプルプログラムをダウンロードできます。
ダウンロードをする前にお読みください
- サイトで紹介している記事の内容や公開しているプログラムの動作は100%保障するものではありません。
- 当プログラム使用による如何なる不具合やトラブル、損害の責任も負いかねます。
- 当プログラムは断り無く内容が変わることがあります。
- 当プログラムを別サイトで配布することは禁止します。
- サポートはいたしません。
- 自己責任にてご利用くださいませ。
以上をご確認の上、プログラムのダウンロードをお願いいたします。
- 本プログラムはjQueryを組み込んだ状態じゃないと動作しません。ご注意ください。
- アガリ判定とシャンテン数を算出する処理は「麻雀C言語プログラム集」のシャンテン数を参考にしています。
サンプルプログラムのソースコード
ソースコードは折りたたんであります。[+]を押すと、折りたたまれたソースコードが開きます。[-]を押すと、コードは折りたたまれます。
+ program_013.jsを開く
//============================================================================
//牌の配列:JSON形式
//============================================================================
var paiType = [
{"No":0,"paiName":"赤五萬","cssSprite":"man0","paigaNo":4},
{"No":1,"paiName":"一萬","cssSprite":"man1","paigaNo":0},
{"No":2,"paiName":"二萬","cssSprite":"man2","paigaNo":1},
{"No":3,"paiName":"三萬","cssSprite":"man3","paigaNo":2},
{"No":4,"paiName":"四萬","cssSprite":"man4","paigaNo":3},
{"No":5,"paiName":"五萬","cssSprite":"man5","paigaNo":5},
{"No":6,"paiName":"六萬","cssSprite":"man6","paigaNo":6},
{"No":7,"paiName":"七萬","cssSprite":"man7","paigaNo":7},
{"No":8,"paiName":"八萬","cssSprite":"man8","paigaNo":8},
{"No":9,"paiName":"九萬","cssSprite":"man9","paigaNo":9},
{"No":10,"paiName":"赤五筒","cssSprite":"pin0","paigaNo":14},
{"No":11,"paiName":"一筒","cssSprite":"pin1","paigaNo":10},
{"No":12,"paiName":"二筒","cssSprite":"pin2","paigaNo":11},
{"No":13,"paiName":"三筒","cssSprite":"pin3","paigaNo":12},
{"No":14,"paiName":"四筒","cssSprite":"pin4","paigaNo":13},
{"No":15,"paiName":"五筒","cssSprite":"pin5","paigaNo":15},
{"No":16,"paiName":"六筒","cssSprite":"pin6","paigaNo":16},
{"No":17,"paiName":"七筒","cssSprite":"pin7","paigaNo":17},
{"No":18,"paiName":"八筒","cssSprite":"pin8","paigaNo":18},
{"No":19,"paiName":"九筒","cssSprite":"pin9","paigaNo":19},
{"No":20,"paiName":"赤五索","cssSprite":"sou0","paigaNo":24},
{"No":21,"paiName":"一索","cssSprite":"sou1","paigaNo":20},
{"No":22,"paiName":"二索","cssSprite":"sou2","paigaNo":21},
{"No":23,"paiName":"三索","cssSprite":"sou3","paigaNo":22},
{"No":24,"paiName":"四索","cssSprite":"sou4","paigaNo":23},
{"No":25,"paiName":"五索","cssSprite":"sou5","paigaNo":25},
{"No":26,"paiName":"六索","cssSprite":"sou6","paigaNo":26},
{"No":27,"paiName":"七索","cssSprite":"sou7","paigaNo":27},
{"No":28,"paiName":"八索","cssSprite":"sou8","paigaNo":28},
{"No":29,"paiName":"九索","cssSprite":"sou9","paigaNo":29},
{"No":30,"paiName":"裏","cssSprite":"ji0","paigaNo":30},
{"No":31,"paiName":"東","cssSprite":"ji1","paigaNo":31},
{"No":32,"paiName":"南","cssSprite":"ji2","paigaNo":32},
{"No":33,"paiName":"西","cssSprite":"ji3","paigaNo":33},
{"No":34,"paiName":"北","cssSprite":"ji4","paigaNo":34},
{"No":35,"paiName":"白","cssSprite":"ji5","paigaNo":35},
{"No":36,"paiName":"發","cssSprite":"ji6","paigaNo":36},
{"No":37,"paiName":"中","cssSprite":"ji7","paigaNo":37}
];
//============================================================================
//グローバル変数【動作チェック用】
//============================================================================
var extractCount=0;//テンパイ数チェック回数累計
var OutPutflg=0;//抜いた牌を出力するためのフラグ
//============================================================================
//グローバル変数
//============================================================================
//var tehai = new Array(37);//手牌の配列:37種
var tehai=[];//手牌の配列:37種
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 preTempTehai = new Array(37);//tempTehaiの前処理用クローン。事前に完全メンツや孤立牌を抜いておく
//var tempTehai = new Array(37);//tehai配列のクローン
var preTempTehai=[];//tempTehaiの前処理用クローン。事前に完全メンツや孤立牌を抜いておく
var tempTehai=[];//tehai配列のクローン
var red5manCount = 0;//赤5マンの数
var red5pinCount = 0;//赤5ピンの数
var red5souCount = 0;//赤5ソウの数
//マンズ関連
var manMentsuMax;
var manTaatsuMax;
//ピンズ関連
var pinMentsuMax;
var pinTaatsuMax;
//ソーズ関連
var souMentsuMax;
var souTaatsuMax;
//字牌関連
var jiTaatsuMax;
var preMentsuCount;//kanzen_koutsu_suuとkanzen_shuntsu_suu格納用
var koutsuCount;//コーツ数カウント用
//============================================================================
//赤ドラの有無をチェックしてカウントする処理【赤ドラのカウントを事前にしなかった場合に使う】
//各赤ドラはtehai配列の0,10,20番地にあるものとする
//============================================================================
function checkReddora(){
//グローバル変数の初期化
red5manCount = 0;//赤5マンの数
red5pinCount = 0;//赤5ピンの数
red5souCount = 0;//赤5ソウの数
//赤五萬の有無をチェックしてカウントする
if(tehai[0]){red5manCount += tehai[0];}//赤五萬の牌数を追加
//赤五筒の有無をチェックしてカウントする
if(tehai[10]){red5pinCount += tehai[10];}//赤五筒の牌数を追加
//赤五索の有無をチェックしてカウントする
if(tehai[20]){red5souCount += tehai[20];}//赤五索の牌数を追加
}
//============================================================================
//赤ドラの有無をチェックして配列操作する処理【シャンテン数やテンパイチェックを実行する前に使う】
//tehai配列内を0→5、10→15、20→25
//============================================================================
function moveReddora(){
//赤五萬の有無をチェックして番地を移動させる処理
if(tehai[0]&&red5manCount){
tehai[5]+=tehai[0];//赤五萬の牌数を五萬の番地5に追加
tehai[0]=0;//番地0を初期化
}
//赤五筒の有無をチェックして番地を移動させる処理
if(tehai[10]&&red5pinCount){
tehai[15]+=tehai[10];//赤五筒の牌数を五筒の番地15に追加
tehai[10]=0;//番地10を初期化
}
//赤五索の有無をチェックして番地を移動させる処理
if(tehai[20]&&red5souCount){
tehai[25]+=tehai[20];//赤五索の牌数を五索の番地25に追加
tehai[20]= 0;//番地20を初期化
}
}
//============================================================================
//赤ドラの有無をチェックして配列内の元の番地に戻す処理
//tehai配列内を5→0、15→10、25→20
//============================================================================
function removeReddora(){
//赤五萬の有無をチェックして番地を移動:5→0
if(!tehai[0]&&tehai[5]&&red5manCount){
tehai[5]--;
tehai[0]++;
}
//赤五筒の有無をチェックして番地を移動:15→10
if(!tehai[10]&&tehai[15]&&red5pinCount){
tehai[15]--;
tehai[10]++;
}
//赤五索の有無をチェックして番地を移動:25→20
if(!tehai[20]&&tehai[25]&&red5souCount){
tehai[25]--;
tehai[20]++;
}
}
//============================================================================
//アガリ判定とシャンテン数を返す関数
//============================================================================
function syantenCheck(tehaimode){
var i;
var toitsu_suu=0;//雀頭
var syanten_temp=0;//シャンテン数(計算用)
var syanten_suu=8;
var mentsu_adjust=0;//メンツ数調整用
var manMentsuTaatsu_suu;
var pinMentsuTaatsu_suu;
var souMentsuTaatsu_suu;
var jiTaatsu_suu;
//グローバル変数の初期化
//マンズ関連
manMentsuMax=0;
manTaatsuMax=0;
//ピンズ関連
pinMentsuMax=0;
pinTaatsuMax=0;
//ソーズ関連
souMentsuMax=0;
souTaatsuMax=0;
//字牌関連(ターツのみ)
jiTaatsuMax=0;
koutsuCount=0;//コーツ数カウント用
extractCount=0;//【動作チェック用】テンパイ数チェック回数累計
//4枚・7枚・10枚・13枚麻雀におけるメンツ数の調整
switch (tehaimode){
case 4://4枚麻雀
mentsu_adjust=3;
break;
case 7://7枚麻雀
mentsu_adjust=2;
break;
case 10://10枚麻雀
mentsu_adjust=1;
break;
case 13://13枚麻雀
mentsu_adjust=0;
break;
default://13枚麻雀【通常】
mentsu_adjust=0;
break;
}
//tehai配列のバックアップを取る
preTempTehai = $.extend(true, [], tehai);
//前もって完全なシュンツ・コーツ・孤立牌を抜いておく
var kanzen_koutsu_suu = KanzenKoutsuCheck();//完全に独立したコーツを抜き出して個数を返す関数の実行
var kanzen_shuntsu_suu = kanzenShuntsuCheck();//完全に独立したシュンツを抜き出して個数を返す関数の実行
//【ボツ】var kanzen_taatsu_suu = kanzenTaatsuCheck();//完全に独立した1ターツを抜き出して個数を返す関数の実行
preMentsuCount=kanzen_koutsu_suu+kanzen_shuntsu_suu;//グローバル変数に格納
//5枚目の単騎待ちを阻止する処置
var kanzen_Koritsu_suu=KanzenKoritsuCheck();//完全に独立した孤立牌を抜き出して個数を返す関数の実行
//【ボツ】var kanzen_kantsuCheck = koutsu.indexOf(koritsu)//4枚未満の場合は-1を返す
//独立した完全トイツのチェック
var kanzen_toitsu_check=KanzenToitsuCheck();//ある場合は「1」、無い場合は「0」を返す
//マンズ・ピンズ・ソーズの有無のチェック
var isCheckMan=preTempTehai[1]+preTempTehai[2]+preTempTehai[3]+preTempTehai[4]+preTempTehai[5]+preTempTehai[6]+preTempTehai[7]+preTempTehai[8]+preTempTehai[9];
var isCheckPin=preTempTehai[11]+preTempTehai[12]+preTempTehai[13]+preTempTehai[14]+preTempTehai[15]+preTempTehai[16]+preTempTehai[17]+preTempTehai[18]+preTempTehai[19];
var isCheckSou=preTempTehai[21]+preTempTehai[22]+preTempTehai[23]+preTempTehai[24]+preTempTehai[25]+preTempTehai[26]+preTempTehai[27]+preTempTehai[28]+preTempTehai[29];
var isCheckJi=preTempTehai[31]+preTempTehai[32]+preTempTehai[33]+preTempTehai[34]+preTempTehai[35]+preTempTehai[36]+preTempTehai[37];
var adjustment=kanzen_koutsu_suu+kanzen_shuntsu_suu+mentsu_adjust;//前もって抜いたメンツと手牌調整用パラメータを格納する
if(OutPutflg==1){
$("#paiTehaiSyantenCheck").append("=======================================================<br>");
$("#paiTehaiSyantenCheck").append("【雀頭抜き出し→コーツ抜き出し→シュンツ抜き出し→ターツ候補抜き出し】<br>");//チェック用【運用時は削除して下さい】
$("#paiTehaiSyantenCheck").append("=======================================================<br>");
}
//【雀頭あり】雀頭抜き出し→コーツ抜き出し→シュンツ抜き出し→ターツ候補抜き出し
for(i=1;i<38;i++){
if(!i%10){continue;}
if(preTempTehai[i]>=2){//同種牌が2つ以上ある場合トイツを抜き出す
preTempTehai[i]-=2;//雀頭を抜き出す
jantou=i;//雀頭の番号を格納する
toitsu_suu=1;//雀頭をカウントする
//【動作チェック用】雀頭を出力する
(function (){
jantouPut(jantou);
})();
if(isCheckMan>0){//マンズがある場合実行
manMentsuMax=0;
manTaatsuMax=0;
manMentsuTaatsu_suu=manMentsuTaatsuCheck(1);//コーツ・シュンツ・ターツを抜き出して個数を返す関数呼び出し
}
if(isCheckPin>0){//ピンズがある場合実行
pinMentsuMax=0;
pinTaatsuMax=0;
pinMentsuTaatsu_suu=pinMentsuTaatsuCheck(1);//コーツ・シュンツ・ターツを抜き出して個数を返す関数呼び出し
}
if(isCheckSou>0){//ソーズがある場合実行
souMentsuMax=0;
souTaatsuMax=0;
souMentsuTaatsu_suu=souMentsuTaatsuCheck(1);//コーツ・シュンツ・ターツを抜き出して個数を返す関数呼び出し
}
if(isCheckJi>0){//字牌がある場合実行
jiTaatsuMax=0;
jiTaatsu_suu=jiTaatuCheck();//字牌ターツを抜き出して個数を返す関数呼び出し
}
//シャンテン数の算出
syanten_temp=syantenHnatei(toitsu_suu,adjustment);//仮のシャンテン数を算出
if(syanten_suu>syanten_temp){syanten_suu = syanten_temp;}//シャンテン数を比較
if(!syanten_suu&&(isCheckMan+isCheckPin+isCheckSou+preMentsuCount*3)==tehaimode){
if(OutPutflg==1){$("#extractCount").empty().append(extractCount);}//【動作チェック用】
return 0;//テンパイ判定
}
if(syanten_suu==-1){
if(OutPutflg==1){$("#extractCount").empty().append(extractCount);}//【動作チェック用】
return -1;//アガリ判定
}
preTempTehai[i]+=2;
toitsu_suu--;
}
}//for var i
if(OutPutflg==1){
$("#paiTehaiSyantenCheck").append("=======================================================<br>");
$("#paiTehaiSyantenCheck").append("【雀頭抜き出し→シュンツ抜き出し→コーツ抜き出し→ターツ候補抜き出し】<br>");//チェック用【運用時は削除して下さい】
$("#paiTehaiSyantenCheck").append("=======================================================<br>");
}
//【雀頭あり】雀頭抜き出し→シュンツ抜き出し→コーツ抜き出し→ターツ候補抜き出し
if(koutsuCount){//コーツが見つからなかった場合、処理がダブるのでスルー
for(i=1;i<38;i++){
if(!i%10){continue;}
if(preTempTehai[i]>=2){//同種牌が2つ以上ある場合トイツを抜き出す
preTempTehai[i]-=2;//雀頭を抜き出す
jantou=i;//雀頭の番号を格納する
toitsu_suu=1;//雀頭をカウントする
//【動作チェック用】雀頭を出力する
(function (){
jantouPut(jantou);
})();
if(isCheckMan>0){//マンズがある場合実行
manMentsuMax=0;
manTaatsuMax=0;
manMentsuTaatsu_suu=manMentsuTaatsuCheck(2);//コーツ・シュンツ・ターツを抜き出して個数を返す関数呼び出し
}
if(isCheckPin>0){//ピンズがある場合実行
pinMentsuMax=0;
pinTaatsuMax=0;
pinMentsuTaatsu_suu=pinMentsuTaatsuCheck(2);//コーツ・シュンツ・ターツを抜き出して個数を返す関数呼び出し
}
if(isCheckSou>0){//ソーズがある場合実行
souMentsuMax=0;
souTaatsuMax=0;
souMentsuTaatsu_suu=souMentsuTaatsuCheck(2);//コーツ・シュンツ・ターツを抜き出して個数を返す関数呼び出し
}
if(isCheckJi>0){//字牌がある場合実行
jiTaatsuMax=0;
jiTaatuCheck();//字牌ターツを抜き出して個数を返す関数呼び出し
}
//シャンテン数の算出
syanten_temp=syantenHnatei(toitsu_suu,adjustment);//仮のシャンテン数を算出
if(syanten_suu>syanten_temp){syanten_suu = syanten_temp;}//シャンテン数を比較
if(!syanten_suu&&(isCheckMan+isCheckPin+isCheckSou+preMentsuCount*3)==tehaimode){
if(OutPutflg==1){$("#extractCount").empty().append(extractCount);}//【動作チェック用】
return 0;//テンパイ判定
}
if(syanten_suu==-1){
if(OutPutflg==1){$("#extractCount").empty().append(extractCount);}//【動作チェック用】
return -1;//アガリ判定
}
preTempTehai[i]+=2;
toitsu_suu--;
}
}//for var i
}
//【雀頭が無い場合の処理】シュンツ抜き出し→コーツ抜き出し→ターツ候補抜き出し
if(OutPutflg==1){
$("#paiTehaiSyantenCheck").append("=======================================================<br>");
$("#paiTehaiSyantenCheck").append("【雀頭が無い場合:コーツ抜き出し→シュンツ抜き出し→ターツ候補抜き出し】<br>");//チェック用【運用時は削除して下さい】
$("#paiTehaiSyantenCheck").append("=======================================================<br>");
}
//【雀頭無し】コーツ抜き出し→シュンツ抜き出し→ターツ候補抜き出し
if(!kanzen_toitsu_check){//完全トイツが見つかった場合は実行しない
if(isCheckMan>0){//マンズがある場合実行
manMentsuMax=0;
manTaatsuMax=0;
manMentsuTaatsu_suu=manMentsuTaatsuCheck(1);//シュンツを抜き出して個数を返す関数呼び出し
}
if(isCheckPin>0){//ピンズがある場合実行
pinMentsuMax=0;
pinTaatsuMax=0;
pinMentsuTaatsu_suu=pinMentsuTaatsuCheck(1);//コーツ・シュンツ・ターツを抜き出して個数を返す関数呼び出し
}
if(isCheckSou>0){//ソーズがある場合実行
souMentsuMax=0;
souTaatsuMax=0;
souMentsuTaatsu_suu=souMentsuTaatsuCheck(1);//コーツ・シュンツ・ターツを抜き出して個数を返す関数呼び出し
}
if(isCheckJi>0){//字牌がある場合実行
jiTaatsuMax=0;
jiTaatuCheck();//字牌ターツを抜き出して個数を返す関数呼び出し
}
//シャンテン数の算出
syanten_temp=syantenHnatei(toitsu_suu,adjustment);//仮のシャンテン数を算出
if(syanten_suu>syanten_temp){syanten_suu = syanten_temp;}//シャンテン数を比較
if(!syanten_suu&&(isCheckMan+isCheckPin+isCheckSou+preMentsuCount*3)==tehaimode){
if(OutPutflg==1){$("#extractCount").empty().append(extractCount);}//【動作チェック用】
return 0;//テンパイ判定
}
if(syanten_suu==-1){
if(OutPutflg==1){$("#extractCount").empty().append(extractCount);}//【動作チェック用】
return -1;//アガリ判定
}
}
if(OutPutflg==1){$("#extractCount").empty().append(extractCount);}//【動作チェック用】
return syanten_suu;//シャンテン数を返す
}
//============================================================================
//シャンテン数を算出する関数
//============================================================================
function syantenHnatei(toitsu_suu,adjustment){
var syanten_temp=0;
var block_suu=0;
block_suu=(manMentsuMax+pinMentsuMax+souMentsuMax+adjustment)+(manTaatsuMax+pinTaatsuMax+souTaatsuMax+jiTaatsuMax);
//シャンテン数算出
if(block_suu>4){
syanten_temp=8-(manMentsuMax+pinMentsuMax+souMentsuMax+adjustment)*2-(manTaatsuMax+pinTaatsuMax+souTaatsuMax+jiTaatsuMax)-toitsu_suu+(block_suu-4);
}else{
syanten_temp=8-(manMentsuMax+pinMentsuMax+souMentsuMax+adjustment)*2-(manTaatsuMax+pinTaatsuMax+souTaatsuMax+jiTaatsuMax)-toitsu_suu;
}
return syanten_temp;
}
//============================================================================
//字牌ターツ抜き出し
//============================================================================
function jiTaatuCheck(){
var jiTaatsu=0;
var i;
for(i=31;i<38;i++){
if(tempTehai[i]==2){
tempTehai[i]-=2;//トイツを抜き出す
jiTaatsu++;
//【動作チェック用無名関数】トイツを出力する
(function (){
if(OutPutflg==1){
$("#paiTehaiSyantenCheck").append(" ト");
paiPut(i);
paiPut(i);
$("#paiTehaiSyantenCheck").append(" ");
}
})();
}
}
jiTaatsuMax=jiTaatsu;
//【動作チェック用無名関数】シュンツを出力する
(function (){
if(OutPutflg==1){
extractCount++;
}
})();
return jiTaatsu;
}
//============================================================================
//マンズのコーツを抜き出して個数を返す関数
//n=1:最初に見つかったコーツを1つだけ抜く
//============================================================================
function manKoutsuCheck(n){
var koutsu_suu=0;
for(var i=1;i<10;i++){
if(tempTehai[i]>=3){
tempTehai[i]-=3;
koutsu_suu++;
koutsuCount++;
//【動作チェック用無名関数】コーツを出力する
(function (){
if(OutPutflg==1){
$("#paiTehaiSyantenCheck").append(" コ");
paiPut(i);
paiPut(i);
paiPut(i);
$("#paiTehaiSyantenCheck").append(" ");
}
})();
//「n=1」の時、1回だけコーツを抜いて処理を抜ける
if(n==1){
return koutsu_suu;
}
}
}
return koutsu_suu;
}
//============================================================================
//マンズのコーツ・シュンツ・ターツを抜き出して個数を返す関数
//n=1:コーツ→シュンツ→ターツの順に抜く
//n=2:シュンツ→コーツ→ターツの順に抜く
//n=3:1コーツ→シュンツ→コーツ→ターツの順に抜く
//============================================================================
function manMentsuTaatsuCheck(n){
var suujishuntsu_suu=0;
var manMentsu;
var manTaatsu;
var manMentsu_temp;
var isCheckMan;
var i,j;
var manMax_temp=0;
for(j=0;j<8;j++){
manMentsu=0;
manTaatsu=0;
tempTehai = $.extend(true, [], preTempTehai);//preTempTehai配列の内容をコピーする
//【動作チェック用無名関数】シュンツを出力する
(function (){
if(OutPutflg==1){
$("#paiTehaiSyantenCheck").append("<br>");
}
})();
if(n==1){manMentsu+=manKoutsuCheck(0);}//マンズのコーツを抜いてコーツ数を返す関数の実行
if(n==3){manMentsu+=manKoutsuCheck(1);}//マンズのコーツを抜いてコーツ数を返す関数の実行
//マンズのシュンツを抜く処理
for(i=1;i<8;i++){//通常処理
while(tempTehai[i+j]>=1&&tempTehai[i+1+j]>=1&&tempTehai[i+2+j]>=1&&(i+j)<8){
tempTehai[i+j]--;
tempTehai[i+1+j]--;
tempTehai[i+2+j]--;
manMentsu++;
//【動作チェック用無名関数】シュンツを出力する
(function (){
if(OutPutflg==1){
$("#paiTehaiSyantenCheck").append(" シ");
paiPut(i+j);
paiPut(i+1+j);
paiPut(i+2+j);
$("#paiTehaiSyantenCheck").append(" ");
}
})();
}
}//for
//マンズのシュンツを抜く処理2
if(j>3){
for(i=1;i<8;i++){//通常処理
while(tempTehai[i]>=1&&tempTehai[i+1]>=1&&tempTehai[i+2]>=1&&i<8){
tempTehai[i]--;
tempTehai[i+1]--;
tempTehai[i+2]--;
manMentsu++;
//【動作チェック用無名関数】シュンツを出力する
(function (){
if(OutPutflg==1){
$("#paiTehaiSyantenCheck").append(" シ");
paiPut(i);
paiPut(i+1);
paiPut(i+2);
$("#paiTehaiSyantenCheck").append(" ");
}
})();
}
}//for
}
if(n==2||n==3){manMentsu+=manKoutsuCheck(0);}//マンズのコーツを抜いてコーツ数を返す関数の実行
//マンズのターツを抜く理
for(i=1;i<8;i++){
//トイツの抜き出し
if(tempTehai[i]>=2&&i<10){
tempTehai[i]-=2;//トイツを抜き出す
manTaatsu++;
//【動作チェック用無名関数】トイツを出力する
(function (){
if(OutPutflg==1){
$("#paiTehaiSyantenCheck").append(" ト");
paiPut(i);
paiPut(i);
$("#paiTehaiSyantenCheck").append(" ");
}
})();
}
//リャンメンとペンチャンの抜き出し
if(tempTehai[i]&&tempTehai[i+1]&&i<9){
tempTehai[i]--;
tempTehai[i+1]--;
manTaatsu++;
//【動作チェック用無名関数】リャンメン・ペンチャンターツを出力する
(function (){
if(OutPutflg==1){
$("#paiTehaiSyantenCheck").append(" タ");
paiPut(i);
paiPut(i+1);
$("#paiTehaiSyantenCheck").append(" ");
}
})();
}
//カンチャンの抜き出し
if(tempTehai[i]&&!tempTehai[i+1]&&tempTehai[i+2]&&i<8){
tempTehai[i]--;
tempTehai[i+2]--;
manTaatsu++;
//【動作チェック用無名関数】カンチャンターツを出力する
(function (){
if(OutPutflg==1){
$("#paiTehaiSyantenCheck").append(" タ");
paiPut(i);
paiPut(i+2);
$("#paiTehaiSyantenCheck").append(" ");
}
})();
}
manMentsu_temp=manMentsu*10+manTaatsu;
if(manMentsu_temp>manMax_temp) {
manMax_temp=manMentsu_temp;
manMentsuMax=manMentsu;
manTaatsuMax=manTaatsu;
suujishuntsu_suu=manMentsu*10+manTaatsu;
}//if
//【動作チェック用無名関数】シュンツを出力する
(function (){
if(OutPutflg==1){
extractCount++;
}
})();
isCheckMan=tempTehai[1]+tempTehai[2]+tempTehai[3]+tempTehai[4]+tempTehai[5]+tempTehai[6]+tempTehai[7]+tempTehai[8]+tempTehai[9];
if(!isCheckMan){return suujishuntsu_suu;}
}//for
isCheckMan=tempTehai[1]+tempTehai[2]+tempTehai[3]+tempTehai[4]+tempTehai[5]+tempTehai[6]+tempTehai[7]+tempTehai[8]+tempTehai[9];
if(!isCheckMan){return suujishuntsu_suu;}
if(!manMentsu){return suujishuntsu_suu;}
}//for j
return suujishuntsu_suu;
}
//============================================================================
//ピンズのコーツを抜き出して個数を返す関数
//n=1:最初に見つかったコーツを1つだけ抜く
//============================================================================
function pinKoutsuCheck(n){
var koutsu_suu=0;
for(var i=11;i<20;i++){
if(tempTehai[i]>=3){
tempTehai[i]-=3;
koutsu_suu++;
koutsuCount++;
//【動作チェック用無名関数】コーツを出力する
(function (){
if(OutPutflg==1){
$("#paiTehaiSyantenCheck").append(" コ");
paiPut(i);
paiPut(i);
paiPut(i);
$("#paiTehaiSyantenCheck").append(" ");
}
})();
//「n=1」の時、1回だけコーツを抜いて処理を抜ける
if(n==1){
return koutsu_suu;
}
}
}
return koutsu_suu;
}
//============================================================================
//ピンズのコーツ・シュンツ・ターツを抜き出して個数を返す関数
//n=1:コーツ→シュンツ→ターツの順に抜く
//n=2:シュンツ→コーツ→ターツの順に抜く
//n=3:1コーツ→シュンツ→コーツ→ターツの順に抜く
//============================================================================
function pinMentsuTaatsuCheck(n){
var suujishuntsu_suu=0;
var pinMentsu;
var pinTaatsu;
var pinMentsu_temp;
var isCheckPin;
var i,j;
var pinMax_temp=0;
for(j=0;j<8;j++){
pinMentsu=0;
pinTaatsu=0;
tempTehai = $.extend(true, [], preTempTehai);//preTempTehai配列の内容をコピーする
//【動作チェック用無名関数】シュンツを出力する
(function (){
if(OutPutflg==1){
$("#paiTehaiSyantenCheck").append("<br>");
}
})();
if(n==1){pinMentsu+=pinKoutsuCheck(0);}//ピンズのコーツを抜いてコーツ数を返す関数の実行
if(n==3){pinMentsu+=pinKoutsuCheck(1);}//ピンズのコーツを抜いてコーツ数を返す関数の実行
//ピンズのシュンツを抜く処理
for(i=11;i<18;i++){//通常処理
while(tempTehai[i+j]>=1&&tempTehai[i+1+j]>=1&&tempTehai[i+2+j]>=1&&(i+j)<18){
tempTehai[i+j]--;
tempTehai[i+1+j]--;
tempTehai[i+2+j]--;
pinMentsu++;
//【動作チェック用無名関数】シュンツを出力する
(function (){
if(OutPutflg==1){
$("#paiTehaiSyantenCheck").append(" シ");
paiPut(i+j);
paiPut(i+1+j);
paiPut(i+2+j);
$("#paiTehaiSyantenCheck").append(" ");
}
})();
}
}//for
//ピンズのシュンツを抜く処理2
if(j>3){
for(i=11;i<18;i++){//通常処理
while(tempTehai[i]>=1&&tempTehai[i+1]>=1&&tempTehai[i+2]>=1&&i<18){
tempTehai[i]--;
tempTehai[i+1]--;
tempTehai[i+2]--;
pinMentsu++;
//【動作チェック用無名関数】シュンツを出力する
(function (){
if(OutPutflg==1){
$("#paiTehaiSyantenCheck").append(" シ");
paiPut(i);
paiPut(i+1);
paiPut(i+2);
$("#paiTehaiSyantenCheck").append(" ");
}
})();
}
}//for
}
if(n==2||n==3){pinMentsu+=pinKoutsuCheck(0);}//ピンズのコーツを抜いてコーツ数を返す関数の実行
//ピンズのターツを抜く理
for(i=11;i<18;i++){
//トイツの抜き出し
if(tempTehai[i]>=2&&i<20){
tempTehai[i]-=2;//トイツを抜き出す
pinTaatsu++;
//【動作チェック用無名関数】トイツを出力する
(function (){
if(OutPutflg==1){
$("#paiTehaiSyantenCheck").append(" ト");
paiPut(i);
paiPut(i);
$("#paiTehaiSyantenCheck").append(" ");
}
})();
}
//リャンメンとペンチャンの抜き出し
if(tempTehai[i]&&tempTehai[i+1]&&i<19){
tempTehai[i]--;
tempTehai[i+1]--;
pinTaatsu++;
//【動作チェック用無名関数】リャンメン・ペンチャンターツを出力する
(function (){
if(OutPutflg==1){
$("#paiTehaiSyantenCheck").append(" タ");
paiPut(i);
paiPut(i+1);
$("#paiTehaiSyantenCheck").append(" ");
}
})();
}
//カンチャンの抜き出し
if(tempTehai[i]&&!tempTehai[i+1]&&tempTehai[i+2]&&i<18){
tempTehai[i]--;
tempTehai[i+2]--;
pinTaatsu++;
//【動作チェック用無名関数】カンチャンターツを出力する
(function (){
if(OutPutflg==1){
$("#paiTehaiSyantenCheck").append(" タ");
paiPut(i);
paiPut(i+2);
$("#paiTehaiSyantenCheck").append(" ");
}
})();
}
pinMentsu_temp=pinMentsu*10+pinTaatsu;
if(pinMentsu_temp>pinMax_temp) {
pinMax_temp=pinMentsu_temp;
pinMentsuMax=pinMentsu;
pinTaatsuMax=pinTaatsu;
suujishuntsu_suu=pinMentsu*10+pinTaatsu;
}//if
//【動作チェック用無名関数】シュンツを出力する
(function (){
if(OutPutflg==1){
extractCount++;
}
})();
isCheckPin=tempTehai[11]+tempTehai[12]+tempTehai[13]+tempTehai[14]+tempTehai[15]+tempTehai[16]+tempTehai[17]+tempTehai[18]+tempTehai[19];
if(!isCheckPin){return suujishuntsu_suu;}
}//for
isCheckPin=tempTehai[11]+tempTehai[12]+tempTehai[13]+tempTehai[14]+tempTehai[15]+tempTehai[16]+tempTehai[17]+tempTehai[18]+tempTehai[19];
if(!isCheckPin){return suujishuntsu_suu;}
if(!pinMentsu){return suujishuntsu_suu;}
}//for j
return suujishuntsu_suu;
}
//============================================================================
//ソーズのコーツを抜き出して個数を返す関数
//n=1:最初に見つかったコーツを1つだけ抜く
//============================================================================
function souKoutsuCheck(n){
var koutsu_suu=0;
for(var i=21;i<30;i++){
if(tempTehai[i]>=3){
tempTehai[i]-=3;
koutsu_suu++;
koutsuCount++;
//【動作チェック用無名関数】コーツを出力する
(function (){
if(OutPutflg==1){
$("#paiTehaiSyantenCheck").append(" コ");
paiPut(i);
paiPut(i);
paiPut(i);
$("#paiTehaiSyantenCheck").append(" ");
}
})();
//「n=1」の時、1回だけコーツを抜いて処理を抜ける
if(n==1){
return koutsu_suu;
}
}
}
return koutsu_suu;
}
//============================================================================
//ソーズのコーツ・シュンツ・ターツを抜き出して個数を返す関数
//n=1:コーツ→シュンツ→ターツの順に抜く
//n=2:シュンツ→コーツ→ターツの順に抜く
//n=3:1コーツ→シュンツ→コーツ→ターツの順に抜く
//============================================================================
function souMentsuTaatsuCheck(n){
var suujishuntsu_suu=0;
var souMentsu;
var souTaatsu;
var souMentsu_temp;
var isCheckSou;
var i,j;
var souMax_temp=0;
for(j=0;j<8;j++){
souMentsu=0;
souTaatsu=0;
tempTehai = $.extend(true, [], preTempTehai);//preTempTehai配列の内容をコピーする
//【動作チェック用無名関数】シュンツを出力する
(function (){
if(OutPutflg==1){
$("#paiTehaiSyantenCheck").append("<br>");
}
})();
if(n==1){souMentsu+=souKoutsuCheck(0);}//ソーズのコーツを抜いてコーツ数を返す関数の実行
if(n==3){souMentsu+=souKoutsuCheck(1);}//ソーズのコーツを抜いてコーツ数を返す関数の実行
//ソーズのシュンツを抜く処理
for(i=21;i<28;i++){//通常処理
while(tempTehai[i+j]>=1&&tempTehai[i+1+j]>=1&&tempTehai[i+2+j]>=1&&(i+j)<28){
tempTehai[i+j]--;
tempTehai[i+1+j]--;
tempTehai[i+2+j]--;
souMentsu++;
//【動作チェック用無名関数】シュンツを出力する
(function (){
if(OutPutflg==1){
$("#paiTehaiSyantenCheck").append(" シ");
paiPut(i+j);
paiPut(i+1+j);
paiPut(i+2+j);
$("#paiTehaiSyantenCheck").append(" ");
}
})();
}
}//for
//ソーズのシュンツを抜く処理2
if(j>3){
for(i=21;i<28;i++){//通常処理
while(tempTehai[i]>=1&&tempTehai[i+1]>=1&&tempTehai[i+2]>=1&&i<28){
tempTehai[i]--;
tempTehai[i+1]--;
tempTehai[i+2]--;
souMentsu++;
//【動作チェック用無名関数】シュンツを出力する
(function (){
if(OutPutflg==1){
$("#paiTehaiSyantenCheck").append(" シ");
paiPut(i);
paiPut(i+1);
paiPut(i+2);
$("#paiTehaiSyantenCheck").append(" ");
}
})();
}
}//for
}
if(n==2||n==3){souMentsu+=souKoutsuCheck(0);}//ソーズのコーツを抜いてコーツ数を返す関数の実行
//ソーズのターツを抜く理
for(i=21;i<28;i++){
//トイツの抜き出し
if(tempTehai[i]>=2&&i<30){
tempTehai[i]-=2;//トイツを抜き出す
souTaatsu++;
//【動作チェック用無名関数】トイツを出力する
(function (){
if(OutPutflg==1){
$("#paiTehaiSyantenCheck").append(" ト");
paiPut(i);
paiPut(i);
$("#paiTehaiSyantenCheck").append(" ");
}
})();
}
//リャンメンとペンチャンの抜き出し
if(tempTehai[i]&&tempTehai[i+1]&&i<29){
tempTehai[i]--;
tempTehai[i+1]--;
souTaatsu++;
//【動作チェック用無名関数】リャンメン・ペンチャンターツを出力する
(function (){
if(OutPutflg==1){
$("#paiTehaiSyantenCheck").append(" タ");
paiPut(i);
paiPut(i+1);
$("#paiTehaiSyantenCheck").append(" ");
}
})();
}
//カンチャンの抜き出し
if(tempTehai[i]&&!tempTehai[i+1]&&tempTehai[i+2]&&i<28){
tempTehai[i]--;
tempTehai[i+2]--;
souTaatsu++;
//【動作チェック用無名関数】カンチャンターツを出力する
(function (){
if(OutPutflg==1){
$("#paiTehaiSyantenCheck").append(" タ");
paiPut(i);
paiPut(i+2);
$("#paiTehaiSyantenCheck").append(" ");
}
})();
}
souMentsu_temp=souMentsu*10+souTaatsu;
if(souMentsu_temp>souMax_temp) {
souMax_temp=souMentsu_temp;
souMentsuMax=souMentsu;
souTaatsuMax=souTaatsu;
suujishuntsu_suu=souMentsu*10+souTaatsu;
}//if
//【動作チェック用無名関数】シュンツを出力する
(function (){
if(OutPutflg==1){
extractCount++;
}
})();
isCheckSou=tempTehai[21]+tempTehai[22]+tempTehai[23]+tempTehai[24]+tempTehai[25]+tempTehai[26]+tempTehai[27]+tempTehai[28]+tempTehai[29];
if(!isCheckSou){return suujishuntsu_suu;}
}//for
isCheckSou=tempTehai[21]+tempTehai[22]+tempTehai[23]+tempTehai[24]+tempTehai[25]+tempTehai[26]+tempTehai[27]+tempTehai[28]+tempTehai[29];
if(!isCheckSou){return suujishuntsu_suu;}
if(!souMentsu){return suujishuntsu_suu;}
}//for j
return suujishuntsu_suu;
}
//============================================================================
//完全コーツを抜き出して個数を返す関数
//============================================================================
function KanzenKoutsuCheck(){
var Kanzenkoutsu_suu = 0;
var i,j;
//字牌の完全コーツを抜き出す
for(i=31;i<38;i++){
if(preTempTehai[i]>=3){
preTempTehai[i]-=3;
Kanzenkoutsu_suu++;
//【動作チェック用無名関数】コーツを出力する
(function (){
if(OutPutflg==1){
$("#paiTehaiSyantenCheck").append(" 完コ");
paiPut(i);
paiPut(i);
paiPut(i);
}
})();
}
}//for
//数牌の完全コーツを抜き出す
for(i=0;i<30;i+=10){
if(preTempTehai[i+1]>=3&&!preTempTehai[i+2]&&!preTempTehai[i+3]){
preTempTehai[i+1]-=3;
Kanzenkoutsu_suu++;
//【動作チェック用無名関数】コーツを出力する
(function (){
if(OutPutflg==1){
$("#paiTehaiSyantenCheck").append(" 完コ");
paiPut(i+1);
paiPut(i+1);
paiPut(i+1);
}
})();
}
if(!preTempTehai[i+1]&&preTempTehai[i+2]>=3&&!preTempTehai[i+3]&&!preTempTehai[i+4]){
preTempTehai[i+2]-=3;
Kanzenkoutsu_suu++;
//【動作チェック用無名関数】コーツを出力する
(function (){
if(OutPutflg==1){
$("#paiTehaiSyantenCheck").append(" 完コ");
paiPut(i+2);
paiPut(i+2);
paiPut(i+2);
}
})();
}
//3~7の完全コーツを抜く
for(j=0;j<5;j++){
if(!preTempTehai[i+j+1]&&!preTempTehai[i+j+2]&&preTempTehai[i+j+3]>=3&&!preTempTehai[i+j+4]&&!preTempTehai[i+j+5]){
preTempTehai[i+j+3]-=3;
Kanzenkoutsu_suu++;
//【動作チェック用無名関数】コーツを出力する
(function (){
if(OutPutflg==1){
$("#paiTehaiSyantenCheck").append(" 完コ");
paiPut(i+j+3);
paiPut(i+j+3);
paiPut(i+j+3);
}
})();
}
}
if(!preTempTehai[i+6]&&!preTempTehai[i+7]&&preTempTehai[i+8]>=3&&!preTempTehai[i+9]){
preTempTehai[i+8]-=3;
Kanzenkoutsu_suu++;
//【動作チェック用無名関数】コーツを出力する
(function (){
if(OutPutflg==1){
$("#paiTehaiSyantenCheck").append(" 完コ");
paiPut(i+8);
paiPut(i+8);
paiPut(i+8);
}
})();
}
if(!preTempTehai[i+7]&&!preTempTehai[i+8]&&preTempTehai[i+9]>=3){
preTempTehai[i+9]-=3;
Kanzenkoutsu_suu++;
//【動作チェック用無名関数】コーツを出力する
(function (){
if(OutPutflg==1){
$("#paiTehaiSyantenCheck").append(" 完コ");
paiPut(i+9);
paiPut(i+9);
paiPut(i+9);
}
})();
}
}//for
return Kanzenkoutsu_suu;
}
//============================================================================
//完全シュンツを抜き出して個数を返す関数
//============================================================================
function kanzenShuntsuCheck(){
var kanzenshuntsu_suu=0;
var i;
//123,456のような完全に独立したシュンツを抜き出すための処理
////【注意】番地0,10,20,30が「0」の必要あり。事前に赤ドラを移動させる処理をしておく。
for(i=0;i<30;i+=10){//マンズ→ピンズ→ソーズ
//123▲▲
if(preTempTehai[i+1]==2&&preTempTehai[i+2]==2&&preTempTehai[i+3]==2&&!preTempTehai[i+4]&&!preTempTehai[i+5]){
preTempTehai[i+1]-=2;
preTempTehai[i+2]-=2;
preTempTehai[i+3]-=2;
kanzenshuntsu_suu+=2;
//【動作チェック用無名関数】
(function (){
if(OutPutflg==1){
$("#paiTehaiSyantenCheck").append(" 完シ");
paiPut(i+1);
paiPut(i+2);
paiPut(i+3);
$("#paiTehaiSyantenCheck").append(" 完シ");
paiPut(i+1);
paiPut(i+2);
paiPut(i+3);
}
})();
}
//▲234▲▲
if(!preTempTehai[i+1]&&preTempTehai[i+2]==2&&preTempTehai[i+3]==2&&preTempTehai[i+4]==2&&!preTempTehai[i+5]&&!preTempTehai[i+6]){
preTempTehai[i+2]-=2;
preTempTehai[i+3]-=2;
preTempTehai[i+4]-=2;
kanzenshuntsu_suu+=2;
//【動作チェック用無名関数】
(function (){
if(OutPutflg==1){
$("#paiTehaiSyantenCheck").append(" 完シ");
paiPut(i+2);
paiPut(i+3);
paiPut(i+4);
$("#paiTehaiSyantenCheck").append(" 完シ");
paiPut(i+2);
paiPut(i+3);
paiPut(i+4);
}
})();
}
//▲▲345▲▲
if(!preTempTehai[i+1]&&!preTempTehai[i+2]&&preTempTehai[i+3]==2&&preTempTehai[i+4]==2&&preTempTehai[i+5]==2&&!preTempTehai[i+6]&&!preTempTehai[i+7]){
preTempTehai[i+3]-=2;
preTempTehai[i+4]-=2;
preTempTehai[i+5]-=2;
kanzenshuntsu_suu+=2;
//【動作チェック用無名関数】
(function (){
if(OutPutflg==1){
$("#paiTehaiSyantenCheck").append(" 完シ");
paiPut(i+3);
paiPut(i+4);
paiPut(i+5);
$("#paiTehaiSyantenCheck").append(" 完シ");
paiPut(i+3);
paiPut(i+4);
paiPut(i+5);
}
})();
}
//▲▲456▲▲
if(!preTempTehai[i+2]&&!preTempTehai[i+3]&&preTempTehai[i+4]==2&&preTempTehai[i+5]==2&&preTempTehai[i+6]==2&&!preTempTehai[i+7]&&!preTempTehai[i+8]){
preTempTehai[i+4]-=2;
preTempTehai[i+5]-=2;
preTempTehai[i+6]-=2;
kanzenshuntsu_suu+=2;
//【動作チェック用無名関数】
(function (){
if(OutPutflg==1){
$("#paiTehaiSyantenCheck").append(" 完シ");
paiPut(i+4);
paiPut(i+5);
paiPut(i+6);
$("#paiTehaiSyantenCheck").append(" 完シ");
paiPut(i+4);
paiPut(i+5);
paiPut(i+6);
}
})();
}
//▲▲567▲▲
if(!preTempTehai[i+3]&&!preTempTehai[i+4]&&preTempTehai[i+5]==2&&preTempTehai[i+6]==2&&preTempTehai[i+7]==2&&!preTempTehai[i+8]&&!preTempTehai[i+9]){
preTempTehai[i+5]-=2;
preTempTehai[i+6]-=2;
preTempTehai[i+7]-=2;
kanzenshuntsu_suu+=2;
//【動作チェック用無名関数】
(function (){
if(OutPutflg==1){
$("#paiTehaiSyantenCheck").append(" 完シ");
paiPut(i+5);
paiPut(i+6);
paiPut(i+7);
$("#paiTehaiSyantenCheck").append(" 完シ");
paiPut(i+5);
paiPut(i+6);
paiPut(i+7);
}
})();
}
//▲▲678▲
if(!preTempTehai[i+4]&&!preTempTehai[i+5]&&preTempTehai[i+6]==2&&preTempTehai[i+7]==2&&preTempTehai[i+8]==2&&!preTempTehai[i+9]){
preTempTehai[i+6]-=2;
preTempTehai[i+7]-=2;
preTempTehai[i+8]-=2;
kanzenshuntsu_suu+=2;
//【動作チェック用無名関数】
(function (){
if(OutPutflg==1){
$("#paiTehaiSyantenCheck").append(" 完シ");
paiPut(i+6);
paiPut(i+7);
paiPut(i+8);
$("#paiTehaiSyantenCheck").append(" 完シ");
paiPut(i+6);
paiPut(i+7);
paiPut(i+8);
}
})();
}
//▲▲789
if(!preTempTehai[i+5]&&!preTempTehai[i+6]&&preTempTehai[i+7]==2&&preTempTehai[i+8]==2&&preTempTehai[i+9]==2){
preTempTehai[i+7]-=2;
preTempTehai[i+8]-=2;
preTempTehai[i+9]-=2;
kanzenshuntsu_suu+=2;
//【動作チェック用無名関数】
(function (){
if(OutPutflg==1){
$("#paiTehaiSyantenCheck").append(" 完コ");
paiPut(i+7);
paiPut(i+8);
paiPut(i+9);
$("#paiTehaiSyantenCheck").append(" 完シ");
paiPut(i+7);
paiPut(i+8);
paiPut(i+9);
}
})();
}
}
for(i=0;i<30;i+=10){//マンズ→ピンズ→ソーズ
//123▲▲
if(preTempTehai[i+1]==1&&preTempTehai[i+2]==1&&preTempTehai[i+3]==1&&!preTempTehai[i+4]&&!preTempTehai[i+5]){
preTempTehai[i+1]--;
preTempTehai[i+2]--;
preTempTehai[i+3]--;
kanzenshuntsu_suu++;
//【動作チェック用無名関数】
(function (){
if(OutPutflg==1){
$("#paiTehaiSyantenCheck").append(" 完シ");
paiPut(i+1);
paiPut(i+2);
paiPut(i+3);
}
})();
}
//▲234▲▲
if(!preTempTehai[i+1]&&preTempTehai[i+2]==1&&preTempTehai[i+3]==1&&preTempTehai[i+4]==1&&!preTempTehai[i+5]&&!preTempTehai[i+6]){
preTempTehai[i+2]--;
preTempTehai[i+3]--;
preTempTehai[i+4]--;
kanzenshuntsu_suu++;
//【動作チェック用無名関数】
(function (){
if(OutPutflg==1){
$("#paiTehaiSyantenCheck").append(" 完シ");
paiPut(i+2);
paiPut(i+3);
paiPut(i+4);
}
})();
}
//▲▲345▲▲
if(!preTempTehai[i+1]&&!preTempTehai[i+2]&&preTempTehai[i+3]==1&&preTempTehai[i+4]==1&&preTempTehai[i+5]==1&&!preTempTehai[i+6]&&!preTempTehai[i+7]){
preTempTehai[i+3]--;
preTempTehai[i+4]--;
preTempTehai[i+5]--;
kanzenshuntsu_suu++;
//【動作チェック用無名関数】
(function (){
if(OutPutflg==1){
$("#paiTehaiSyantenCheck").append(" 完シ");
paiPut(i+3);
paiPut(i+4);
paiPut(i+5);
}
})();
}
//▲▲456▲▲
if(!preTempTehai[i+2]&&!preTempTehai[i+3]&&preTempTehai[i+4]==1&&preTempTehai[i+5]==1&&preTempTehai[i+6]==1&&!preTempTehai[i+7]&&!preTempTehai[i+8]){
preTempTehai[i+4]--;
preTempTehai[i+5]--;
preTempTehai[i+6]--;
kanzenshuntsu_suu++;
//【動作チェック用無名関数】
(function (){
if(OutPutflg==1){
$("#paiTehaiSyantenCheck").append(" 完シ");
paiPut(i+4);
paiPut(i+5);
paiPut(i+6);
}
})();
}
//▲▲567▲▲
if(!preTempTehai[i+3]&&!preTempTehai[i+4]&&preTempTehai[i+5]==1&&preTempTehai[i+6]==1&&preTempTehai[i+7]==1&&!preTempTehai[i+8]&&!preTempTehai[i+9]){
preTempTehai[i+5]--;
preTempTehai[i+6]--;
preTempTehai[i+7]--;
kanzenshuntsu_suu++;
//【動作チェック用無名関数】
(function (){
if(OutPutflg==1){
$("#paiTehaiSyantenCheck").append(" 完シ");
paiPut(i+5);
paiPut(i+6);
paiPut(i+7);
}
})();
}
//▲▲678▲
if(!preTempTehai[i+4]&&!preTempTehai[i+5]&&preTempTehai[i+6]==1&&preTempTehai[i+7]==1&&preTempTehai[i+8]==1&&!preTempTehai[i+9]){
preTempTehai[i+6]--;
preTempTehai[i+7]--;
preTempTehai[i+8]--;
kanzenshuntsu_suu++;
//【動作チェック用無名関数】
(function (){
if(OutPutflg==1){
$("#paiTehaiSyantenCheck").append(" 完シ");
paiPut(i+6);
paiPut(i+7);
paiPut(i+8);
}
})();
}
//▲▲789
if(!preTempTehai[i+5]&&!preTempTehai[i+6]&&preTempTehai[i+7]==1&&preTempTehai[i+8]==1&&preTempTehai[i+9]==1){
preTempTehai[i+7]--;
preTempTehai[i+8]--;
preTempTehai[i+9]--;
kanzenshuntsu_suu++;
//【動作チェック用無名関数】
(function (){
if(OutPutflg==1){
$("#paiTehaiSyantenCheck").append(" 完シ");
paiPut(i+7);
paiPut(i+8);
paiPut(i+9);
}
})();
}
}
return kanzenshuntsu_suu;
}
//============================================================================
//完全孤立牌を抜き出して個数を返す関数
//============================================================================
function KanzenKoritsuCheck(){
var KanzenKoritsu_suu=0;
var i,j;
//字牌の完全孤立牌を抜き出す
for(i=31;i<38;i++){
if(preTempTehai[i]==1){
//koritsu = i ;//孤立牌を変数に格納する
preTempTehai[i]--;
KanzenKoritsu_suu++;
//【動作チェック用無名関数】
(function (){
if(OutPutflg==1){
$("#paiTehaiSyantenCheck").append(" 完孤");
paiPut(i);
$("#paiTehaiSyantenCheck").append(" ");
}
})();
}
}
//数牌の完全孤立牌を抜き出す
for(i=0;i<30;i=i+10){//マンズ→ピンズ→ソーズ
//1の孤立牌を抜く
if(preTempTehai[i+1]==1&&!preTempTehai[i+2]&&!preTempTehai[i+3]){
//koritsu = i+1;//孤立牌を変数に格納する
preTempTehai[i+1]--;
KanzenKoritsu_suu++;
//【動作チェック用無名関数】
(function (){
if(OutPutflg==1){
$("#paiTehaiSyantenCheck").append(" 完孤");
paiPut(i+1);
$("#paiTehaiSyantenCheck").append(" ");
}
})();
}
//2の完全孤立牌を抜く
if(!preTempTehai[i+1]&&preTempTehai[i+2]==1&&!preTempTehai[i+3]&&!preTempTehai[i+4]){
preTempTehai[i+2]--;
KanzenKoritsu_suu++;
//【動作チェック用無名関数】
(function (){
if(OutPutflg==1){
$("#paiTehaiSyantenCheck").append(" 完孤");
paiPut(i+2);
$("#paiTehaiSyantenCheck").append(" ");
}
})();
}
//3~7の完全孤立牌を抜く
for(j=0;j<5;j++){
if(!preTempTehai[i+j+1]&&!preTempTehai[i+j+2]&&preTempTehai[i+j+3]==1&&!preTempTehai[i+j+4]&&!preTempTehai[i+j+5]){
preTempTehai[i+j+3]--;
KanzenKoritsu_suu++;
//【動作チェック用無名関数】
(function (){
if(OutPutflg==1){
$("#paiTehaiSyantenCheck").append(" 完孤");
paiPut(i+j+3);
$("#paiTehaiSyantenCheck").append(" ");
}
})();
}
}
//8の完全孤立牌を抜く
if(!preTempTehai[i+6]&&!preTempTehai[i+7]&&preTempTehai[i+8]==1&&!preTempTehai[i+9]){
preTempTehai[i+8]--;
KanzenKoritsu_suu++;
//【動作チェック用無名関数】
(function (){
if(OutPutflg==1){
$("#paiTehaiSyantenCheck").append(" 完孤");
paiPut(i+8);
$("#paiTehaiSyantenCheck").append(" ");
}
})();
}
//9の完全孤立牌を抜く
if(!preTempTehai[i+7]&&!preTempTehai[i+8]&&preTempTehai[i+9]==1){
preTempTehai[i+9]--;
KanzenKoritsu_suu++;
//【動作チェック用無名関数】
(function (){
if(OutPutflg==1){
$("#paiTehaiSyantenCheck").append(" 完孤");
paiPut(i+9);
$("#paiTehaiSyantenCheck").append(" ");
}
})();
}
}
return KanzenKoritsu_suu;
}
//============================================================================
//完全トイツをチェックする関数:見つかった場合は「1」を、見つからなかった場合は「0」を返す
//雀頭が無い場合の処理をスルーするための措置
//============================================================================
function KanzenToitsuCheck(){
var i,j;
//字牌のトイツチェック
for(i=31;i<38;i++){
if(preTempTehai[i]==2){return 1;}
}
//数牌の完全トイツをチェック
for(i=0;i<30;i+=10){
//1の完全トイツをチェック
if(preTempTehai[i+1]==2&&!preTempTehai[i+2]){return 1;}
//2の完全トイツをチェック
if(!preTempTehai[i+1]&&preTempTehai[i+2]==2&&!preTempTehai[i+3]){return 1;}
//3~7の完全トイツをチェック
for(j=0;j<5;j++){
if(!preTempTehai[i+j+2]&&preTempTehai[i+j+3]==2&&!preTempTehai[i+j+4]){return 1;}
}
//8の完全トイツをチェック
if(!preTempTehai[i+7]&&preTempTehai[i+8]==2&&!preTempTehai[i+9]){return 1;}
//9の完全トイツをチェック
if(!preTempTehai[i+8]&&preTempTehai[i+9]==2){return 1;}
}
return 0;
}
//============================================================================
//抜き出した牌とシャンテン数を出力させる処理【動作チェック用】
//============================================================================
$("#SyantenCheckBtn").click(function() {
extractCount=0;//【動作チェック用】
OutPutflg = 1;//【動作チェック用】抜き出しパターンの情報を出力させるためのフラグ:「1」で出力、「0」で出力させない
//OutPutflg = 0;//【動作チェック用】抜き出しパターンの情報を出力させるためのフラグ:「1」で出力、「0」で出力させない
$("#paiTehaiUkeire").empty();
$("#paiTehaiSyantenCheck").empty();
moveReddora();//赤ドラを配列内で移動させる
var syanten_suu = syantenCheck(13);//シャンテン数を求める関数の呼び出し
$("#paiTehaiSyanten").empty().append("シャンテン数 = " + syanten_suu);
});
//============================================================================
//抜き出した雀頭を表示する処理【動作チェック用】
//============================================================================
function jantouPut(jantou){
if(OutPutflg==1){
$("#paiTehaiSyantenCheck").append("<br>【雀頭】");
paiPut(jantou);
paiPut(jantou);
$("#paiTehaiSyantenCheck").append(" ");
}
}
//============================================================================
//抜き出した牌を表示する処理【動作チェック用】
//============================================================================
function paiPut(n){
var paiga="";
var paiTepai = $("#paiTehaiSyantenCheck");//要素をキャッシュする
paiga = "<span class=\"" + paiType[n].cssSprite + "\"></span>";//cssスプライトの牌画を配置
paiTepai.append(paiga);
}
function paiPut2(){
var paiga="";
var paiTepai = $("#paiTehaiSyantenCheck");//要素をキャッシュする
paiga = "<span class=\"" + paiType[n].cssSprite + "\"></span>";//cssスプライトの牌画を配置
paiTepai.append(paiga);
}
//============================================================================
//完全ターツを抜き出して個数を返す関数【ボツ】
//============================================================================
function kanzenTaatsuCheck(){
var kanzentaatsu_suu=0;
var i;
//字牌の完全コーツを抜き出す
for(i=31;i<38;i++){
if(preTempTehai[i]==2){
preTempTehai[i]-=2;
kanzentaatsu_suu++;
//【動作チェック用無名関数】コーツを出力する
(function (){
if(OutPutflg==1){
$("#paiTehaiSyantenCheck").append(" 完タ");
paiPut(i);
paiPut(i);
}
})();
}
}//for
return kanzentaatsu_suu;
}//function_end
//============================================================================
+ paiput2.jsを開く
//============================================================================
//牌画を操作するための配列:JSON形式
//============================================================================
var paigaType = [
{"No":0,"paiName":"一萬","cssSprite":"man1","paigaNo":1},
{"No":1,"paiName":"二萬","cssSprite":"man2","paigaNo":2},
{"No":2,"paiName":"三萬","cssSprite":"man3","paigaNo":3},
{"No":3,"paiName":"四萬","cssSprite":"man4","paigaNo":4},
{"No":4,"paiName":"赤五萬","cssSprite":"man0","paigaNo":0},
{"No":5,"paiName":"五萬","cssSprite":"man5","paigaNo":5},
{"No":6,"paiName":"六萬","cssSprite":"man6","paigaNo":6},
{"No":7,"paiName":"七萬","cssSprite":"man7","paigaNo":7},
{"No":8,"paiName":"八萬","cssSprite":"man8","paigaNo":8},
{"No":9,"paiName":"九萬","cssSprite":"man9","paigaNo":9},
{"No":10,"paiName":"一筒","cssSprite":"pin1","paigaNo":11},
{"No":11,"paiName":"二筒","cssSprite":"pin2","paigaNo":12},
{"No":12,"paiName":"三筒","cssSprite":"pin3","paigaNo":13},
{"No":13,"paiName":"四筒","cssSprite":"pin4","paigaNo":14},
{"No":14,"paiName":"赤五筒","cssSprite":"pin0","paigaNo":10},
{"No":15,"paiName":"五筒","cssSprite":"pin5","paigaNo":15},
{"No":16,"paiName":"六筒","cssSprite":"pin6","paigaNo":16},
{"No":17,"paiName":"七筒","cssSprite":"pin7","paigaNo":17},
{"No":18,"paiName":"八筒","cssSprite":"pin8","paigaNo":18},
{"No":19,"paiName":"九筒","cssSprite":"pin9","paigaNo":19},
{"No":20,"paiName":"一索","cssSprite":"sou1","paigaNo":21},
{"No":21,"paiName":"二索","cssSprite":"sou2","paigaNo":22},
{"No":22,"paiName":"三索","cssSprite":"sou3","paigaNo":23},
{"No":23,"paiName":"四索","cssSprite":"sou4","paigaNo":24},
{"No":24,"paiName":"赤五索","cssSprite":"sou0","paigaNo":20},
{"No":25,"paiName":"五索","cssSprite":"sou5","paigaNo":25},
{"No":26,"paiName":"六索","cssSprite":"sou6","paigaNo":26},
{"No":27,"paiName":"七索","cssSprite":"sou7","paigaNo":27},
{"No":28,"paiName":"八索","cssSprite":"sou8","paigaNo":28},
{"No":29,"paiName":"九索","cssSprite":"sou9","paigaNo":29},
{"No":30,"paiName":"裏","cssSprite":"ji0","paigaNo":30},
{"No":31,"paiName":"東","cssSprite":"ji1","paigaNo":31},
{"No":32,"paiName":"南","cssSprite":"ji2","paigaNo":32},
{"No":33,"paiName":"西","cssSprite":"ji3","paigaNo":33},
{"No":34,"paiName":"北","cssSprite":"ji4","paigaNo":34},
{"No":35,"paiName":"白","cssSprite":"ji5","paigaNo":35},
{"No":36,"paiName":"發","cssSprite":"ji6","paigaNo":36},
{"No":37,"paiName":"中","cssSprite":"ji7","paigaNo":37}
];
//============================================================================
//グローバル変数
//============================================================================
var PaiCount = 0; //入力された牌の枚数
var PaiNo = [];//牌画表示用
//============================================================================
//牌画を挿入する関数
//============================================================================
$("span","#haiga").on('click', function(event){
var paiNo = $(this).attr("name"); //牌の番号を取得
var paiName = $(this).attr("class"); //CSSスプライト用のクラス名を取得
if(PaiCount<14){
if(tehai[paiNo]==4||tehai[5]+tehai[0]==4||tehai[15]+tehai[10]==4||tehai[25]+tehai[20]==4){
alert("同種牌を5枚以上入力することはできません。");
return false;
}else{
if(paiNo===0&&red5manCount==1||paiNo==10&&red5pinCount==1||paiNo==20&&red5souCount==1){
alert("赤ドラは各色1枚までです。");
return false;
}
tehai[paiNo] ++;//手牌
if(paiNo%10===0){checkReddora();}//赤ドラのチェック
//PaiNo[PaiCount] = paiNo;//表示用手牌
PaiNo[PaiCount] = paiType[paiNo].paigaNo;//表示用手牌
paiSet(PaiCount,paiName);//牌画を表示させる関数を呼び出す
PaiCount ++;
$("#paikazu").empty().append(PaiCount);
}
}else{
alert("これ以上は牌を置けません。");
return false;
}
});
//============================================================================
//牌を配置する関数
//============================================================================
function paiSet(i,paiName) {
paiga = "<span class=\"" + paiName + "\"></span>";//cssスプライトの牌画を配置
var putNo = "#pai" + i;
$(putNo ,"#paisu").append(paiga);
return;
}
//============================================================================
//任意の牌を1つ消す処理
//============================================================================
$("td","#paisu").click(function() {
var tdNo = $(this).attr("id"); //牌画を配置したセルのIDを取得
var paikazu = PaiNo.length;
if(paikazu===0){
alert("これ以上牌を消せません");
return;
}else{
tdNo = tdNo.slice(3,5);//削って番号のみにする
if(PaiNo[tdNo]==4){red5manCount--;}
if(PaiNo[tdNo]==14){red5pinCount--;}
if(PaiNo[tdNo]==24){red5souCount--;}
tehai[paigaType[PaiNo[tdNo]].paigaNo] --;//手牌
if(tdNo < paikazu){
$("td","#paisu").empty();
PaiNo.splice(tdNo,1);
for(var i=0;i<paikazu -1 ;i++){
paiSet(i,paigaType[PaiNo[i]].cssSprite);
}
}
PaiCount --;
$("#paikazu").empty().append(PaiCount);
}
});
//============================================================================
//手牌を並べ替える処理
//============================================================================
$("#PaiSortBtn").on('click', function(event){
paiSort();
});
//============================================================================
//牌を並べ替える関数
//============================================================================
function paiSort() {
//手牌を並び替える
var paikazu = PaiNo.length;
PaiNo.sort(function(b,c){
return b - c;
});
$("td","#paisu").empty();
for (var i = 0;i<paikazu ;i++){
paiSet(i,paigaType[PaiNo[i]].cssSprite);
}
return;
}
//============================================================================
//リセット処理
//============================================================================
$("#PaiClreaBtn").on('click', function(event){
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];
PaiNo.length = 0;//牌を格納した配列の要素をすべて削除
PaiCount = 0;//カウントのリセット
$("#paikazu").empty().append("0");
$("td","#paisu").empty();
$("#paiTehaiUkeire").empty();
$("#paiTehaiSyanten").empty();
red5manCount = 0;//赤5マンの数
red5pinCount = 0;//赤5ピンの数
red5souCount = 0;//赤5ソウの数
$("#paiTehaiSyantenCheck").empty();
});
//============================================================================
+ program_013.cssを開く
@charset "utf-8";
#haiga > span, #paiTehai > span ,#paiTehaiSyantenCheck > span , td > span{
background-color:transparent;
background-image:url(../images/pai.png);
background-repeat:no-repeat;
background-attachment:scroll;
display:inline-block;
}
.man1{background-position:0px 0px;height:47px;width:31px;}
.man2{background-position:-31px 0px;height:47px;width:31px;}
.man3{background-position:-62px 0px;height:47px;width:31px;}
.man4{background-position:-93px 0px;height:47px;width:31px;}
.man5{background-position:-124px 0px;height:47px;width:31px;}
.man6{background-position:-155px 0px;height:47px;width:31px;}
.man7{background-position:-186px 0px;height:47px;width:31px;}
.man8{background-position:-217px 0px;height:47px;width:31px;}
.man9{background-position:-248px 0px;height:47px;width:31px;}
.man0{background-position:-279px 0px;height:47px;width:31px;}
.pin1{background-position:0px -47px;height:47px;width:31px;}
.pin2{background-position:-31px -47px;height:47px;width:31px;}
.pin3{background-position:-62px -47px;height:47px;width:31px;}
.pin4{background-position:-93px -47px;height:47px;width:31px;}
.pin5{background-position:-124px -47px;height:47px;width:31px;}
.pin6{background-position:-155px -47px;height:47px;width:31px;}
.pin7{background-position:-186px -47px;height:47px;width:31px;}
.pin8{background-position:-217px -47px;height:47px;width:31px;}
.pin9{background-position:-248px -47px;height:47px;width:31px;}
.pin0{background-position:-279px -47px;height:47px;width:31px;}
.sou1{background-position:0px -94px;height:47px;width:31px;}
.sou2{background-position:-31px -94px;height:47px;width:31px;}
.sou3{background-position:-62px -94px;height:47px;width:31px;}
.sou4{background-position:-93px -94px;height:47px;width:31px;}
.sou5{background-position:-124px -94px;height:47px;width:31px;}
.sou6{background-position:-155px -94px;height:47px;width:31px;}
.sou7{background-position:-186px -94px;height:47px;width:31px;}
.sou8{background-position:-217px -94px;height:47px;width:31px;}
.sou9{background-position:-248px -94px;height:47px;width:31px;}
.sou0{background-position:-279px -94px;height:47px;width:31px;}
.ji1{background-position:0px -141px;height:47px;width:31px;}
.ji2{background-position:-31px -141px;height:47px;width:31px;}
.ji3{background-position:-62px -141px;height:47px;width:31px;}
.ji4{background-position:-93px -141px;height:47px;width:31px;}
.ji5{background-position:-124px -141px;height:47px;width:31px;}
.ji6{background-position:-155px -141px;height:47px;width:31px;}
.ji7{background-position:-186px -141px;height:47px;width:31px;}
.ji0{background-position:-217px -141px;height:47px;width:31px;}
#haiga{
background-color:#173B0B;
padding:5px 15px 3px 15px;
margin-bottom:5px;
color:#fff;
-moz-user-select: none;
-webkit-user-select: none;
-ms-user-select: none;}
}
#pai0,#pai1,#pai2,#pai3{width:0;}
table.style{margin-left:10px;}
table.style tr td{background-color:#fff;}
.style > thead > tr > td {
vertical-align: bottom;
border-bottom: 5px solid #ddd;
}
おすすめレンタルサーバー
エックスサーバー|高速・高機能レンタルサーバー
「オールSSDの快適ハイスペック環境」「国内管理、大容量バックボーン」「独自SSLが無料」「FastCGIなどの高速化機能」「最新のPHP7を実装」など、高機能・高コストパフォーマンスなレンタルサーバーです。※当サイトも「エックスサーバー」で運用しています。
