上がりチェック・テンパイチェックの方法
実装例
//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つずつ加えながら、これを呼び出して上がりチェックをすればよい。
もし上がりであるなら、手は、その時加えた牌を上がり牌に持つようなテンパイをしている。
加えられた牌と、メンツの抜き方の関係から、待ちの形などを判別させることも容易である。
「できすぎくん」では、実際にこの方法でテンパイチェック・待ちの形判別が行われている。