벽돌 그리기벽돌은 DrawBoard() 함수에서 보드와 함께 그려준다.
void CWATOneTetris::DrawBoard()
{
                  int tempX,tempY;
                  CMainFrame *pFrame = (CMainFrame *)AfxGetMainWnd();
                  CWATTetrisView
*pView
= (CWATTetrisView *)pFrame->GetActiveView();
                  
                  CClientDC                  pDC(pView);
// view 의 정보를 얻음
                  CPen penLine;            // 사용할 pen 의 셋팅
                  CPen *OldPen;           // 기존에 사용하던 설정으로 복구할 변수
                  penLine.CreatePen(0,3,RGB(0,0,0));
                  OldPen = pDC.SelectObject((&penLine));
                  
 
                  // 현재 벽돌 그림
                  for(tempY=0;tempY<4;tempY++)
                  {
                                   for( tempX=0;
tempX<4;
tempX++)
                                   {
                                                     if
(0 != g_NowBlockInfo[m_iNowBlockShape][m_iNowBlockDir][tempY][tempX])
                                                     {
                                                                       DrawOneBlock( m_iNowBlockY+tempY, m_iNowBlockX+tempX,m_iOneBlockSize,&pDC,RGB(250,050,250));
                                                     }
                                   }
                  }
 
                  // 보드 그림
                 for(tempY
= 0;tempY<BOARD_Y_SIZE+1;tempY++){
                                  for(tempX=0;
tempX<BOARD_X_SIZE+2; tempX++)
                                   {
                                                     if(0
!= m_BoardInfo[tempY][tempX]){
                                                                       DrawOneBlock((tempY),tempX,m_iOneBlockSize,&pDC,RGB(200,200,200));
 
                                                    }
                                   }
                 }
 
                  pDC.SelectObject(OldPen); //
기존의 상태로 복구
}
OnTimer() 함수에서 벽돌을 한칸씩 내리면 된다.
void CWATOneTetris::OnTimer()
{
                  m_iNowBlockY
+=1;
 
 
                  CMainFrame *pFrame = (CMainFrame *)AfxGetMainWnd();
                  CWATTetrisView
*pView
= (CWATTetrisView *)pFrame->GetActiveView();
                  DrawBoard();
                  pView->Invalidate(TRUE);
 
}
키보드로 각 게임을 제어해야 한다. 그러기 위해서는 각각의 키값이 결정되어야 한다.
키값에 관련된 변수를 선언하고, 셋팅 함수를 만든다.
void CWATOneTetris::SetDefineKey(int left, int right,
int ro,
int down)
{
                  m_iDefineLeftKey      = left;
                  m_iDefineRightKey   = right;
                  m_iDefineRotateKey  = ro;
// 회전
                  m_iDefineDownKey  = down;
}
키값을 셋팅한다.
                  m_oneTetris[0].SetDefineKey('A','D','W','S');
                  m_oneTetris[1].SetDefineKey('G','J','Y','H');
                  m_oneTetris[2].SetDefineKey(VK_LEFT,VK_RIGHT,VK_UP,VK_DOWN);
void CWATOneTetris::OnKey(int iKeyValue)
{
                  if( m_iDefineLeftKey
== iKeyValue){
                                   m_iNowBlockX --;
                  }else if( m_iDefineRightKey == iKeyValue){
                                   m_iNowBlockX ++;
                  }else if( m_iDefineRotateKey == iKeyValue){
                                   m_iNowBlockShape ++;
                  }else if( m_iDefineDownKey == iKeyValue){
                                   m_iNowBlockY ++;
                  }
}
각각의 클래스에서 키값을 보냄
                                  m_oneTetris[0].OnKey(pMsg->wParam);
                                  m_oneTetris[1].OnKey(pMsg->wParam);
                                  m_oneTetris[2].OnKey(pMsg->wParam);
 
void CWATOneTetris::OnKey(int iKeyValue)를 자세히 코딩해야 한다.
 
BOOL CWATOneTetris::CanMove(int iDir, int iCheckY, int iCheckX)
{
                  for (int iTempBlockY = 0;iTempBlockY<4;iTempBlockY++)
                  {
                                   for (int iTempBlockX = 0;iTempBlockX<4;iTempBlockX++)
                                   {
                                                     if(0
!= m_BoardInfo[iCheckY+iTempBlockY][iCheckX+iTempBlockX] && 0 != g_NowBlockInfo[m_iNowBlockShape][iDir][iTempBlockY][iTempBlockX]){
                                                                       return
FALSE;
 
                                                     }
                                   }
                  }
 
                  return TRUE;
}
 
BOOL CWATOneTetris::MoveLeft()
{
                  CMainFrame *pFrame = (CMainFrame *)AfxGetMainWnd();
                  CWATTetrisView
*pView
= (CWATTetrisView *)pFrame->GetActiveView();
                  if(CanMove(m_iNowBlockDir,m_iNowBlockY,m_iNowBlockX-1)){
                                   m_iNowBlockX -= 1;
                                   DrawBoard();
                                   pView->Invalidate(TRUE);
                  }
                  return TRUE;
}
 
BOOL CWATOneTetris::MoveRight()
{
                  CMainFrame *pFrame = (CMainFrame *)AfxGetMainWnd();
                  CWATTetrisView
*pView
= (CWATTetrisView *)pFrame->GetActiveView();
                  if(CanMove(m_iNowBlockDir,m_iNowBlockY,m_iNowBlockX+1)){
                                   m_iNowBlockX += 1;
                                   DrawBoard();
                                   pView->Invalidate(TRUE);
                  }
                  return TRUE;
}
 
BOOL CWATOneTetris::Rotate()
{
                  CMainFrame *pFrame = (CMainFrame *)AfxGetMainWnd();
                  CWATTetrisView
*pView
= (CWATTetrisView *)pFrame->GetActiveView();
                  if(CanMove((m_iNowBlockDir+1)%4,m_iNowBlockY,m_iNowBlockX)){
                                   m_iNowBlockDir = (++m_iNowBlockDir)%4;
                                   DrawBoard();
                                   pView->Invalidate(TRUE);
                  }
                  return TRUE;
}
 
BOOL CWATOneTetris::MoveDown()
{
                  CMainFrame *pFrame = (CMainFrame *)AfxGetMainWnd();
                  CWATTetrisView
*pView
= (CWATTetrisView *)pFrame->GetActiveView();
                  if(CanMove(m_iNowBlockDir,m_iNowBlockY+1,m_iNowBlockX)){
                                   m_iNowBlockY +=1;
                                   DrawBoard();
                                   pView->Invalidate(TRUE);
                  }
                  return TRUE;
}
 
void CWATOneTetris::OnKey(int iKeyValue)
{
                  if( m_iDefineLeftKey
== iKeyValue){
                                   MoveLeft();
                  }else if( m_iDefineRightKey == iKeyValue){
                                   MoveRight();
                  }else if( m_iDefineRotateKey == iKeyValue){
                                   Rotate();
                  }else if( m_iDefineDownKey == iKeyValue){
                                   MoveDown();
                  }
}
마지막으로 한줄이 완성되면 삭제하는 ChecknRemove()함수를 추가하면 된다.
(기존 함수 복사하여 사용하면 된다.)

소스 : WATTetris_20071025_1.zip