[Add inからCに変換した関数の一部] /* 1つめがタッチされた場合の処理 HANTENX は、G[][] のフラグを反転して、one_draw[y][x] するだけでいい。 */ void TC1( void ) { /* X,Y の位置に何もない場合 */ if ( g_ewk->G[Y][X] == N ) { return; } /* 今の牌の種類を P1 に格納する */ g_ewk->P1 = g_ewk->G[Y][X] & 0xff; HANTENX(); } /* 2つめがタッチされた場合の処理 HANTEI で取れるかどうかの確認を行っている事に注意。 */ void TC2( void ) { /* ここに何もない場合は、1つ目の物も選択解除 */ if ( g_ewk->G[W][V] == N ) { g_ewk->P1 = N; HANTENX(); return; } /* 種類が異なる場合は何もしない */ if ( (g_ewk->G[W][V] & 0xff) != g_ewk->P1 ) { return; } /* 同じ場所なら選択解除 */ if ( (X == V) && (Y == W) ) { g_ewk->P1 = N; HANTENX(); return; } /* それ以外なら反転処理 */ HANTEN2(); /* 取れるかどうかの判定(取れなきゃ反転を戻す) */ if ( ! HANTEI() ) { Wait100mSec( 3 ); HANTEN2(); }else{ TC3(); } } /* 2つの牌を取り除く処理 削除ライン引いて、少し待って、ラインを消した後、牌消去処理を行っている。 */ void TC3( void ) { int XX,YY; int i; POINT lp[4]; COLOR fg,bg; /* 2つの牌を接続するラインの描画 */ if ( g_ewk->LC ) { for ( i = 0; i <= g_ewk->LC; i++ ) { lp[i].x = LEFTMGN + (g_ewk->LX[i] - 1) * PAI_X_SIZE + (PAI_X_SIZE / 2); lp[i].y = TOPMGN + (g_ewk->LY[i] - 1) * PAI_Y_MINI + (PAI_Y_MINI / 2) + 1*4; /* 画面からラインがはみ出さないように調整 */ if ( lp[i].x < 1*4 ) lp[i].x = 1*4; if ( lp[i].x > 318*4 ) lp[i].x = 318*4; } SetColorV( &fg, MY_HTCOLOR ); SetColorV( &bg, MY_BGCOLOR ); for ( i = 0; i <= g_ewk->LC - 1; i++ ) { DrawContLine( g_ewk->AplForm->FormWnHandle, &lp[i], &lp[i + 1], &fg, &bg, FBEX, SOLID_LINE, 8, NULL ); } Wait100mSec( 3 ); /* 少々の時間待ち */ for ( i = 0; i <= g_ewk->LC - 1; i++ ) { DrawContLine( g_ewk->AplForm->FormWnHandle, &lp[i], &lp[i + 1], &fg, &bg, FBEX, SOLID_LINE, 8, NULL ); } } g_ewk->P1 = g_ewk->G[Y][X] & 0xff; g_ewk->G[Y][X] = N; g_ewk->G[W][V] = N; one_draw( X, Y ); one_draw( V, W ); /* 削除した場合、その上の牌も再描画しないといけない場合がある */ if ( g_ewk->G[Y - 1][X] != N ) one_draw( X, Y-1 ); if ( g_ewk->G[W - 1][V] != N ) one_draw( V, W-1 ); g_ewk->VW[X] = g_ewk->VW[X] & g_ewk->VR[Y]; g_ewk->HW[Y][O] = g_ewk->HW[Y][O] & g_ewk->HR[X][O]; g_ewk->HW[Y][P] = g_ewk->HW[Y][P] & g_ewk->HR[X][P]; g_ewk->VW[V] = g_ewk->VW[V] & g_ewk->VR[W]; g_ewk->HW[W][O] = g_ewk->HW[W][O] & g_ewk->HR[V][O]; g_ewk->HW[W][P] = g_ewk->HW[W][P] & g_ewk->HR[V][P]; Z = Z - 2; g_ewk->P1 = N; /* この後、手詰まりチェック(サーチ)が必要・・・かな? */ if ( Z && tedumari_check() ) { /* 手詰まりです のメッセージを表示 */ PlayBeep(); debug_print( "手詰りです(;_;)" ); } } /* 指定した2つの牌が取れるかの判定処理。 取れる場合には、取る時の道筋も配列変数に返す。 */ int HANTEI( void ) { int SX,EX,SY,EY,D; int FB,FT,FR,FL,V0,H0,H1; g_ewk->LC = 0; if ( X < V ) { g_ewk->T1=X; g_ewk->T2=V; g_ewk->U1=Y; g_ewk->U2=W; }else{ g_ewk->T1=V; g_ewk->T2=X; g_ewk->U1=W; g_ewk->U2=Y; } if ( g_ewk->U1 < g_ewk->U2 ) { g_ewk->UT = g_ewk->U1; g_ewk->UB = g_ewk->U2; }else{ g_ewk->UT = g_ewk->U2; g_ewk->UB = g_ewk->U1; } /* 水平方向のチェック */ EX = g_ewk->T1; SX = g_ewk->T2; while( (EX < g_ewk->T2) && (g_ewk->G[g_ewk->U1][EX+P] == N) ) { EX++; } if ( (Y == W) && (EX == g_ewk->T2-P) ) return( T12() ); /* 垂直方向のチェック */ while( (SX > g_ewk->T1) && (g_ewk->G[g_ewk->U2][SX-P] == N) ) { SX--; } if ( EX < g_ewk->T2 ) { FR = 1; } else { FR = 0; } if ( SX > g_ewk->T1 ) { FL = 1; } else { FL = 0; } H0 = g_ewk->HM[g_ewk->T2][O] - g_ewk->HM[g_ewk->T1-P][O]; H1 = g_ewk->HM[g_ewk->T2][P] - g_ewk->HM[g_ewk->T1-P][P]; V0 = g_ewk->VM[g_ewk->UB] - g_ewk->VM[g_ewk->UT-P]; if ( g_ewk->U1 <= g_ewk->U2 ) { EY = g_ewk->U1; SY = g_ewk->U2; while( (EY < g_ewk->U2) && (g_ewk->G[EY+P][g_ewk->T1] == N) ) { EY++; } if ( (X == V) && (EY == g_ewk->UB-P) ) return( U12() ); while( (SY > g_ewk->U1) && (g_ewk->G[SY-P][g_ewk->T2] == N) ) { SY--; } if ( (SX <= g_ewk->T1) && (g_ewk->U2 <= EY) ) return( T1T1T2() ); if ( (g_ewk->T2 <= EX) && (SY <= g_ewk->U1) ) return( T1T2T2() ); }else{ EY = g_ewk->U2; SY = g_ewk->U1; while( (EY < g_ewk->U1) && (g_ewk->G[EY+P][g_ewk->T2] == N) ) { EY++; } if ( (X == V) && (EY == g_ewk->UB-P) ) return( U12() ); while( (SY > g_ewk->U2) && (g_ewk->G[SY-P][g_ewk->T1] == N) ) { SY--; } if ( (SX <= g_ewk->T1) && (SY <= g_ewk->U2) ) return( T1T1T2() ); if ( (g_ewk->T2 <= EX) && (g_ewk->U1 <= EY) ) return( T1T2T2() ); } if ( EY < g_ewk->UB ) { FB = 1; } else { FB = 0; } if ( SY > g_ewk->UT ) { FT = 1; } else { FT = 0; } for( g_ewk->YW = SY; g_ewk->YW <= EY; g_ewk->YW++ ) { if ( ((g_ewk->HW[g_ewk->YW][O] & H0) | (g_ewk->HW[g_ewk->YW][P] & H1)) == O ) { return( T1122U1WW2() ); } } for( g_ewk->XW = SX; g_ewk->XW <= EX; g_ewk->XW++ ) { if ( (g_ewk->VW[g_ewk->XW] & V0) == O ) { return( T1WW2U1122() ); } } D = 1; do { if ( ! FL ) { g_ewk->XW = g_ewk->T1 - D; if ( g_ewk->XW < O ) { FL = 1; }else{ if ( (g_ewk->VW[g_ewk->XW] & V0) == O ) return( T1WW2U1122() ); if ( (g_ewk->G[g_ewk->UT][g_ewk->XW] != N) || (g_ewk->G[g_ewk->UB][g_ewk->XW] != N) ) { FL = 1; } } } if ( ! FR ) { g_ewk->XW = g_ewk->T2 + D; if ( g_ewk->XW > 19 ) { FR = 1; }else{ if ( (g_ewk->VW[g_ewk->XW] & V0) == O ) return( T1WW2U1122() ); if ( (g_ewk->G[g_ewk->UT][g_ewk->XW] != N) || (g_ewk->G[g_ewk->UB][g_ewk->XW] != N) ) { FR = 1; } } } if ( ! FT ) { g_ewk->YW = g_ewk->UT - D; if ( g_ewk->YW < O ) { FT = 1; }else{ if ( ((g_ewk->HW[g_ewk->YW][O] & H0) | (g_ewk->HW[g_ewk->YW][P] & H1)) == O ) return( T1122U1WW2() ); if ( (g_ewk->G[g_ewk->YW][g_ewk->T1] != N) || (g_ewk->G[g_ewk->YW][g_ewk->T2] != N) ) { FT = 1; } } } if ( ! FB ) { g_ewk->YW = g_ewk->UB + D; if ( g_ewk->YW > 9 ) { FB = 1; }else{ if ( ((g_ewk->HW[g_ewk->YW][O] & H0) | (g_ewk->HW[g_ewk->YW][P] & H1)) == O ) return( T1122U1WW2() ); if ( (g_ewk->G[g_ewk->YW][g_ewk->T1] != N) || (g_ewk->G[g_ewk->YW][g_ewk->T2] != N) ) { FB = 1; } } } D++; } while( ! (FL && FR && FB && FT) ); g_ewk->LC = 0; return( 0 /* 取れない */ ); } int T1T1T2( void ) { g_ewk->LX[0]=g_ewk->T1; g_ewk->LY[0]=g_ewk->U1; g_ewk->LX[1]=g_ewk->T1; g_ewk->LY[1]=g_ewk->U2; g_ewk->LX[2]=g_ewk->T2; g_ewk->LY[2]=g_ewk->U2; g_ewk->LC = 2; return( 1 /* 取れる */ ); } int T1T2T2( void ) { g_ewk->LX[0]=g_ewk->T1; g_ewk->LY[0]=g_ewk->U1; g_ewk->LX[1]=g_ewk->T2; g_ewk->LY[1]=g_ewk->U1; g_ewk->LX[2]=g_ewk->T2; g_ewk->LY[2]=g_ewk->U2; g_ewk->LC = 2; return( 1 ); } int T1122U1WW2( void ) { g_ewk->LX[0]=g_ewk->T1; g_ewk->LY[0]=g_ewk->U1; g_ewk->LX[1]=g_ewk->T1; g_ewk->LY[1]=g_ewk->YW; g_ewk->LX[2]=g_ewk->T2; g_ewk->LY[2]=g_ewk->YW; g_ewk->LX[3]=g_ewk->T2; g_ewk->LY[3]=g_ewk->U2; g_ewk->LC = 3; return( 1 ); } int T1WW2U1122( void ) { g_ewk->LX[0]=g_ewk->T1; g_ewk->LY[0]=g_ewk->U1; g_ewk->LX[1]=g_ewk->XW; g_ewk->LY[1]=g_ewk->U1; g_ewk->LX[2]=g_ewk->XW; g_ewk->LY[2]=g_ewk->U2; g_ewk->LX[3]=g_ewk->T2; g_ewk->LY[3]=g_ewk->U2; g_ewk->LC = 3; return( 1 ); } int U12( void ) { g_ewk->LX[0]=g_ewk->T1; g_ewk->LY[0]=g_ewk->U1; g_ewk->LX[1]=g_ewk->T1; g_ewk->LY[1]=g_ewk->U2; g_ewk->LC = 1; return( 1 ); } int T12( void ) { g_ewk->LX[0]=g_ewk->T1; g_ewk->LY[0]=g_ewk->U1; g_ewk->LX[1]=g_ewk->T2; g_ewk->LY[1]=g_ewk->U1; g_ewk->LC = 1; return( 1 ); } /* 取れる牌の組み合わせがあるかをサーチする処理 単に順々に HANTEI() を呼び出して検査しているだけ。 */ int SEARCH( void ) { int OK; int TJ; int cnt; int x,y; int wx[4],wy[4]; /* 既にセレクトされている牌があればキャンセル */ if ( g_ewk->P1 != N ) { HANTENX(); g_ewk->P1 = N; } /* 既にサーチしている牌があれば同様にキャンセル */ if ( g_ewk->MD ) { X = g_ewk->S1X; Y = g_ewk->S1Y; V = g_ewk->S2X; W = g_ewk->S2Y; HANTENX(); HANTEN2(); } /* PIの時は、時間がかかったのでダイアログを出していたが MIは速いから不要 */ OK = O; /* 関数からの戻り値格納用 */ TJ = g_ewk->SCH; /* 今回サーチを始める位置 */ do { /* 画面配列内から、この種類の牌の座標を調べてくる */ cnt = 0; for( y = 1; (cnt < 4) && (y <= 8); y++ ) { for( x = 1; (cnt < 4) && (x <= 18); x++ ) { if ( (g_ewk->G[y][x] & 0xff) == TJ ) { wy[cnt] = y; wx[cnt] = x; cnt++; } } } if ( cnt == 2 ) { X=wx[0]; Y=wy[0]; V=wx[1]; W=wy[1]; OK = HANTEI(); if ( OK ) break; } else if ( cnt == 4 ) { X=wx[0]; Y=wy[0]; V=wx[1]; W=wy[1]; OK = HANTEI(); if ( OK ) break; X=wx[0]; Y=wy[0]; V=wx[2]; W=wy[2]; OK = HANTEI(); if ( OK ) break; X=wx[0]; Y=wy[0]; V=wx[3]; W=wy[3]; OK = HANTEI(); if ( OK ) break; X=wx[1]; Y=wy[1]; V=wx[2]; W=wy[2]; OK = HANTEI(); if ( OK ) break; X=wx[1]; Y=wy[1]; V=wx[3]; W=wy[3]; OK = HANTEI(); if ( OK ) break; X=wx[2]; Y=wy[2]; V=wx[3]; W=wy[3]; OK = HANTEI(); if ( OK ) break; } TJ++; if ( TJ > 35 ) TJ = 0; } while( TJ != g_ewk->SCH ); if ( ! OK ) { /* 手詰まりです のメッセージを表示 */ PlayBeep(); debug_print( "手詰りです(;_;)" ); }else{ /* 見つけた牌の反転と変数への座標値のセット */ HANTENX(); HANTEN2(); g_ewk->MD = 1; g_ewk->S1X = X; g_ewk->S1Y = Y; g_ewk->S2X = V; g_ewk->S2Y = W; /* 次回の検索の為に SCH に位置を保存 */ TJ++; if ( TJ > 35 ) TJ = 0; g_ewk->SCH = TJ; } } /* 取れる牌の組み合わせがあるかをチェックする処理 (ほとんど SEARCH の流用) 手詰まりならば 1 を戻す。 まだ取れる物があれば 0 を戻す。 */ int tedumari_check( void ) { int OK; int TJ; int cnt; int x,y; int wx[4],wy[4]; int XBK,YBK,VBK,WBK; /* 一応グローバル変数の待避 */ XBK = X; YBK = Y; VBK = V; WBK = W; OK = O; /* 関数からの戻り値格納用 */ TJ = g_ewk->SCH; /* 今回サーチを始める位置 */ do { /* 画面配列内から、この種類の牌の座標を調べてくる */ cnt = 0; for( y = 1; (cnt < 4) && (y <= 8); y++ ) { for( x = 1; (cnt < 4) && (x <= 18); x++ ) { if ( (g_ewk->G[y][x] & 0xff) == TJ ) { wy[cnt] = y; wx[cnt] = x; cnt++; } } } if ( cnt == 2 ) { X=wx[0]; Y=wy[0]; V=wx[1]; W=wy[1]; OK = HANTEI(); if ( OK ) break; } else if ( cnt == 4 ) { X=wx[0]; Y=wy[0]; V=wx[1]; W=wy[1]; OK = HANTEI(); if ( OK ) break; X=wx[0]; Y=wy[0]; V=wx[2]; W=wy[2]; OK = HANTEI(); if ( OK ) break; X=wx[0]; Y=wy[0]; V=wx[3]; W=wy[3]; OK = HANTEI(); if ( OK ) break; X=wx[1]; Y=wy[1]; V=wx[2]; W=wy[2]; OK = HANTEI(); if ( OK ) break; X=wx[1]; Y=wy[1]; V=wx[3]; W=wy[3]; OK = HANTEI(); if ( OK ) break; X=wx[2]; Y=wy[2]; V=wx[3]; W=wy[3]; OK = HANTEI(); if ( OK ) break; } TJ++; if ( TJ > 35 ) TJ = 0; } while( TJ != g_ewk->SCH ); /* グローバル変数の復帰 */ X = XBK; Y = YBK; V = VBK; W = WBK; return( OK ? 0 : 1 ); }