INT PlaceNotEmpty()
{
 int result = 0;
 INT i,j;
 for(i=0 ; i<PIECE_W ; i++)
  for(j=0 ; j<PIECE_H ; j++)
   if( sBlock[FRAME_W/2+i][j].dwKind )
   {
    // 新しい場所にすでにブロックがあったらゲームオーバー
     result = 1;
   }
 return result;
}
VOID DrawScoreNum(int x,int y,int num)
{
 int pos,i;
 char s[16];
 sprintf(s,"%05d",num);
 for(i = 0; i < 5; i++)
 {
  pos = (int)(s[i] - '0');
  DrawSprite(
   lpDev,lpTex2,
   (FLOAT)x * B_SIZE + i * NUMBER_W, (FLOAT)y * B_SIZE,
   NUMBER_W,NUMBER_H,
   NUMBER_W/2,NUMBER_H/2,
   1,1,
   (FLOAT)pos*NUMBER_W,0.f,
   0,0xffffffff);
 }
}
VOID DrawScoreChar()
{
 int i,j;
 // スコア表示領域の確保
 for(i = 0; i < SCORE_W; i++)
  for(j=0 ; j< SCORE_H ; j++ )
    DrawSprite(
     lpDev,NULL,
     (FLOAT)(SCORE_PX + i)*B_SIZE, (FLOAT)(SCORE_PY+j)*B_SIZE,
     B_SIZE, B_SIZE,
     B_SIZE/2, B_SIZE/2,
     1, 1,
     0, 0,
     0, 0xffffffff); 
 // スコアの文字の表示
 DrawSprite(
   lpDev,lpTex2,
   (SCORE_PX)*B_SIZE, (SCORE_PY)*B_SIZE,
   100.f, 24.f,
   50.f, 12.f,
   0, 0,
   0, 24,
   0, 0xffffffff); 
}
VOID Draw()
{
 int i,j;
 BYTE bKey[256];
 // 経過時間を取得
 FLOAT fTime = DXUtil_Timer(T_GETELAPSEDTIME);
 //アルファブレンドの設定
 SetAlphablend(lpDev, TRUE);
 //キー情報を取得
 GetKeyboardState( bKey );
 //ピースの操作
 if( iDel == 0 ){
  if( bKey[VK_RIGHT]&0x80 && !(bSaveKey[VK_RIGHT]&0x80) ) //右へ
   MovePiece( RIGHT_P );
  if( bKey[VK_LEFT]&0x80 && !(bSaveKey[VK_LEFT]&0x80) ) // 左へ
   MovePiece( LEFT_P );
  if( bKey[VK_DOWN]&0x80 ) // 下へ
   MovePiece( DOWN_P );
  if( bKey[VK_SPACE]&0x80 && !(bSaveKey[VK_SPACE]&0x80) ) //回転
   ChangePiece( );
 }
 //キー情報の保管
 memcpy( bSaveKey, bKey, sizeof(BYTE)*256 );
 //更新時間の制御
 {
  static DWORD dwLastTime = timeGetTime();
  DWORD dwTime = timeGetTime();
  if( dwTime - dwLastTime > 800 )
  {
   if( iDel == 0 )
   {
    if( MovePiece( DOWN_P ) )
    {
     //下に移動できた時の作業
    }
    else
    {
     //下に移動できなかった時の作業
     CopyPiece();
     ShiftBall();
     DeleteBall();
     if(PlaceNotEmpty())
     {
      fGameOver = 1;
      // ゲームオーバーのエフェクト
      DrawGameOverEffect();
      return;
     }
     if( iDel == 0 )
      NextPiece();
    }
   }
   else
   {
    iDel = 0;
    NextPiece();
   }
    
   dwLastTime = dwTime;
  }
 }
 // クリア
 lpDev->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(128,128,128), 1.0f, 0 );
 // 描画開始
 if( SUCCEEDED( lpDev->BeginScene() ) )
 {
  //背景描画
  DrawSprite(lpDev,lpTex3, 0, 0, 256, 384, 128, 400, 1, 1, 256, 0, 0, 0xffffffff);
  DrawSprite(lpDev,lpTex3, 0, 384, 800, 216 , 128, 400, 1, 1, 256, 0, 0, 0xffffffff);
  //配置ブロック描画
  for( i=0 ; i<WINDOW_WIDTH / B_SIZE ; i++)
  {
   for( j=0 ; j<FRAME_H ; j++ )
   {
    //壁面描画
    if(i >= FRAME_W )
    {
     DrawSprite(
      lpDev,lpTex,
      (FLOAT)i*B_SIZE, (FLOAT)j*B_SIZE,
      B_SIZE, B_SIZE,
      B_SIZE/2, B_SIZE/2,
      1, 1,
      (FLOAT)(WALL1_B-1)*B_SIZE, 0,
      0, 0xffffffff);
     continue;
    }
    //通常ブロック描画
    if( sBlock[i][j].dwKind )
     DrawSprite(
      lpDev,lpTex,
      (FLOAT)i*B_SIZE, (FLOAT)j*B_SIZE,
      B_SIZE, B_SIZE,
      B_SIZE/2, B_SIZE/2,
      1, 1,
      (FLOAT)(sBlock[i][j].dwKind-1)*B_SIZE, 0,
      0, 0xffffffff);
   }
  }
  //操作ピース描画
  if( sPiece.dwKind )
   for(i=0 ; i<PIECE_W ; i++)
    for(j=0 ; j<PIECE_H ; j++)
     if(sPiece.iBlock[i][j])
      DrawSprite(
       lpDev, lpTex,
       (FLOAT)(sPiece.iX+i)*B_SIZE, (FLOAT)(sPiece.iY+j)*B_SIZE,
       B_SIZE, B_SIZE,
       B_SIZE/2, B_SIZE/2,
       1, 1,
       (FLOAT)(sPiece.iBlock[i][j]-1)*B_SIZE, 0,
       0, 0xffffffff);
  //予告ピース描画
  if( sNextPiece.dwKind )
   for(i=0 ; i<PIECE_W ; i++)
    for(j=0 ; j<PIECE_H ; j++)
     if(sNextPiece.iBlock[i][j])
      DrawSprite(
       lpDev, lpTex,
       (FLOAT)(sNextPiece.iX+i)*B_SIZE, (FLOAT)(sNextPiece.iY+j)*B_SIZE,
       B_SIZE, B_SIZE,
       B_SIZE/2, B_SIZE/2,
       1, 1,
       (FLOAT)(sNextPiece.iBlock[i][j]-1)*B_SIZE, 0,
       0, 0xffffffff);
  // スコア文字の表示
  VOID DrawScoreChar();
  // スコアの表示
  DrawScoreNum(SCORE_PX+4,SCORE_PY+1,Score);
  // FPS表示
  DrawFps(lpDev, 1.f);
  // 描画終了
  lpDev->EndScene();
 }
 VOID DrawScoreChar();
 //
 lpDev->Present( NULL, NULL, NULL, NULL );
}