上がりチェック・テンパイチェックの方法


実装例

//tehai[0〜8]マンズ1〜9の数
//tehai[10〜18]ピンズ1〜9の数
//tehai[20〜28]ソーズ1〜9の数
//tehai[30]東の数
//tehai[32]南の数
// ・・・
//tehai[42]中の数
//その他の要素は0にしておくこと。

void ments_cut(int i)
{
for(;!tehai[i];i++)if(i>=43){return;} //上がっている場合ここが実行される
if(tehai[i]==3) //コーツとして抜き取れる場合
{
tehai[i]-=3;
ments_cut(i);
tehai[i]+=3;
}
if(tehai[i+1]&&tehai[i+2]) //シュンツとして抜き取れる場合
{
tehai[i]--,tehai[i+1]--,tehai[i+2]--;
ments_cut(i);
tehai[i]++,tehai[i+1]++,tehai[i+2]++;
}
}

int agari_check(void)
{
int i;
for(i=0;i<44;i++)
if(2<=tehai[i]) //頭を抜き取る
{
tehai[i]-=2;
ments_cut(0);
tehai[i]+=2;
}
}


解説

tehai[]に適切な手を与えてagari_checkを呼び出すと、その手が和了しているかどうかがわかる。
上がっているような「メンツ抜き出し」に成功した場合に、ments_cut内の{return;}の部分が実行される。

手のテンパイチェックをしたい場合は、孤立牌でないような牌を手に1つずつ加えながら、これを呼び出して上がりチェックをすればよい。
もし上がりであるなら、手は、その時加えた牌を上がり牌に持つようなテンパイをしている。
加えられた牌と、メンツの抜き方の関係から、待ちの形などを判別させることも容易である。

「できすぎくん」では、実際にこの方法でテンパイチェック・待ちの形判別が行われている。