// Name:GetXXX()// Desc:ピースのそれぞれの端の位置を検出
INT GetLeft( SPIECE sp )
{
INT i,j;
for( i=0 ; i<PIECE_W ; i++ )
for(j=0 ; j<PIECE_H ; j++ )
if( sp.iBlock[i][j] )
return i;
return -1;
}
INT GetRight( SPIECE sp )
{
INT i,j;
for( i=PIECE_W-1 ; i>=0 ; i-- )
for(j=0 ; j<PIECE_H ; j++ )
if( sp.iBlock[i][j] )
return i;
return -1;
}
INT GetDown( SPIECE sp )
{
INT i,j;
for(j=PIECE_H-1 ; j>=0 ; j-- )
for( i=0 ; i<PIECE_W ; i++ )
if( sp.iBlock[i][j] )
return j;
return -1;
}
// Name:MovePiece()// Desc:ピースの移動(戻り値 TRUE:移動した FALSE:移動しなかった)
BOOL MovePiece( INT iDir )
{
INT iPx,iPy;
switch( iDir )
{
case DOWN_P:
iPy = GetDown(sPiece);
if( sPiece.iY+1+iPy >= FRAME_H )
return FALSE;
for(iPy=0 ; iPy<PIECE_H ; iPy++)
for(iPx=0 ; iPx<PIECE_W ; iPx++)
if(sPiece.iX+iPx >= 0 && sPiece.iX+iPx <FRAME_W && sPiece.iY+iPy >= 0 && sPiece.iY+iPy < FRAME_H )
if( sPiece.iBlock[iPx][iPy] && sBlock[sPiece.iX+iPx][sPiece.iY+iPy+1].dwKind )
return FALSE;
sPiece.iY+=1;
return TRUE;
case LEFT_P:
iPx = GetLeft(sPiece);
if( sPiece.iX-1+iPx < 0 )
return FALSE;
for(iPy=0 ; iPy<PIECE_H ; iPy++)
for(iPx=0 ; iPx<PIECE_W ; iPx++)
if(sPiece.iX+iPx >= 0 && sPiece.iX+iPx <FRAME_W && sPiece.iY+iPy >= 0 && sPiece.iY+iPy < FRAME_H )
if( sPiece.iBlock[iPx][iPy] && sBlock[sPiece.iX+iPx-1][sPiece.iY+iPy].dwKind )
return FALSE;
sPiece.iX-=1;
return TRUE;
case RIGHT_P:
iPx = GetRight(sPiece);
if( sPiece.iX+1+iPx >= FRAME_W )
return FALSE;
for(iPy=0 ; iPy<PIECE_H ; iPy++)
for(iPx=0 ; iPx<PIECE_W ; iPx++)
if(sPiece.iX+iPx >= 0 && sPiece.iX+iPx <FRAME_W && sPiece.iY+iPy >= 0 && sPiece.iY+iPy < FRAME_H )
if( sPiece.iBlock[iPx][iPy] && sBlock[sPiece.iX+iPx+1][sPiece.iY+iPy].dwKind )
return FALSE;
sPiece.iX+=1;
return TRUE;
}
return FALSE;
}
// Name:ChangePiece()// Desc:左右のピースの入れ替え
BOOL ChangePiece()
{
INT iWork = sPiece.iBlock[0][0];
sPiece.iBlock[0][0] = sPiece.iBlock[1][0];
sPiece.iBlock[1][0] = iWork;
return TRUE;
}
// Name:CreatePiece()// Desc:次に使用するピースの生成
VOID CreatePiece( )
{
sNextPiece.iX = 9;
sNextPiece.iY = 2;
sNextPiece.dwKind = WHITE_B;
switch( rand()%3 )
{
case 0:
sNextPiece.iBlock[0][0] = WHITE_B;
break;
case 1:
sNextPiece.iBlock[0][0] = BLUE_B;
break;
case 2:
sNextPiece.iBlock[0][0] = RED_B;
switch( rand()%3 )
{
case 0:
sNextPiece.iBlock[0][0] = WHITE_B;
break;
case 1:
sNextPiece.iBlock[0][0] = BLUE_B;
break;
case 2:
sNextPiece.iBlock[0][0] = RED_B;
}
}
switch( rand()%3 )
{
case 0:
sNextPiece.iBlock[0][1] = WHITE_B;
break;
case 1:
sNextPiece.iBlock[0][1] = BLUE_B;
break;
case 2:
sNextPiece.iBlock[0][1] = RED_B;
switch( rand()%3 )
{
case 0:
sNextPiece.iBlock[0][1] = WHITE_B;
break;
case 1:
sNextPiece.iBlock[0][1] = BLUE_B;
break;
case 2:
sNextPiece.iBlock[0][1] = RED_B;
}
}
}
// Name:NextPiece()// Desc:次のピースへの切り替え
VOID NextPiece( )
{
sPiece = sNextPiece;
sPiece.iX = FRAME_W/2-1;
sPiece.iY = 0;
CreatePiece();
}
// Name:CopyPiece()// Desc:フレームにピースをコピー
VOID CopyPiece( )
{
INT i,j;
for(i=0 ; i<PIECE_W ; i++)
for(j=0 ; j<PIECE_H ; j++)
if( sPiece.iBlock[i][j] )
sBlock[sPiece.iX+i][sPiece.iY+j].dwKind = sPiece.iBlock[i][j];
sPiece.dwKind = 0;
}
// Name:DeleteBall()// Desc:ボールの削除
INT DeleteBall( )
{
int i,j,k,lf,df,ch,chh;
ch=0;
lf=1;
// つながっているブロックをクリア
while(lf==1){
Sleep(160);
nConnects = 0;
df=0;
chh=0;
// 座標をクリア
for(i = 0; i < MAX_CONNECT_BLOCK; i++)
{
nX[i] = 0;
nY[i] = 0;
}
for(i = 0; i < FRAME_W; i++)
{
for(j = 0; j < FRAME_H; j++)
{
// 連続しているブロックの数をカウント
if(sBlock[i][j].dwKind != NONE_D)
{
Count(i,j);
}
if(nConnects >= ERASE_MIN)
{
// 4つ以上連続しているブロックを消去
for(k = 0; k < nConnects; k++)
{
sBlock[nX[k]][nY[k]].dwKind = NONE_D;
df=1;
chh=chh+nConnects;
nX[k] = 0;
nY[k] = 0;
Sleep(100);
}
}
nConnects = 0;
}
}
if(df==1)
{
ch=ch+1;
Score=Score+ch*(10*chh);
chh=0;
}
ShiftBall();
if(df==0)
{
lf=0;
}
}
return 0;
}
void Count(int x,int y)
{
int c = sBlock[x][y].dwKind;
nX[nConnects] = x;
nY[nConnects] = y;
nConnects++; // カウント
sBlock[x][y].dwKind = NONE_D;
if(x+1<FRAME_W && sBlock[x+1][y].dwKind==c) Count(x+1,y);
if(y+1<FRAME_H && sBlock[x][y+1].dwKind==c) Count(x,y+1);
if(x-1>=0 && sBlock[x-1][y].dwKind==c) Count(x-1,y);
if(y-1>=0 && sBlock[x][y-1].dwKind==c) Count(x,y-1);
sBlock[x][y].dwKind = c;
}