// 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;
}