다음 벽돌이 다시 나와야 한다.
바닥에 닿으면 다음 벽돌 생성
벽돌을 한칸씩 내려오게 하는 함수를 변경하면 된다.
void CWATTetrisView::OnTimer(UINT nIDEvent) 
{
                  if(CanMove(m_iNowBlockDir,m_iNowBlockY+1,m_iNowBlockX)){
                                   m_iNowBlockY +=1;
                  }else{
                                   m_iNowBlockY = 0;
                                   m_iNowBlockShape = (++m_iNowBlockShape)%7;
                  }
                  Invalidate();
                                                      
                  CFormView::OnTimer(nIDEvent);
}
벽돌이 바닥에 쌓이지 않고 진행될 것이다. 바닥에 쌓으려면 어떻게 해야 할까?
다음 벽돌이 생성되기 전에 현재의 벽돌 상태를 보드에 저장하면 된다.
void CWATTetrisView::OnTimer(UINT nIDEvent) 
{
                  if(CanMove(m_iNowBlockDir,m_iNowBlockY+1,m_iNowBlockX)){
                                   m_iNowBlockY +=1;
                  }else{
                                   for (int iTempBlockY = 0;iTempBlockY<4 && (m_iNowBlockY+iTempBlockY<BOARD_Y_SIZE+1);iTempBlockY++)
                                   {
                                                     for
(int iTempBlockX = 0;iTempBlockX<4;iTempBlockX++)
                                                     {
                                                                       if(0
== g_BoardInfo[m_iNowBlockY+iTempBlockY][m_iNowBlockX+iTempBlockX] ){
                                                                                        if(                  0 !=g_NowBlockInfo[m_iNowBlockShape][m_iNowBlockDir][iTempBlockY][iTempBlockX]){
                                                                                                          g_BoardInfo[m_iNowBlockY+iTempBlockY][m_iNowBlockX+iTempBlockX] = g_NowBlockInfo[m_iNowBlockShape][m_iNowBlockDir][iTempBlockY][iTempBlockX];
                                                                                        }
                                                                       }
                                                     }
                                   }
                                   m_iNowBlockY = 0;
                                   m_iNowBlockShape = (++m_iNowBlockShape)%7;
                  }
                  Invalidate();
                                                      
                  CFormView::OnTimer(nIDEvent);
}
한줄 없애기
이제 한줄이 다 완성되면 그 한줄을 없애는 기능을 추가하자.
                                   // 한줄 없애기
                                   BOOL bGoodOneLine = TRUE;
                                   for ( iTempBlockY = 0;iTempBlockY<4 && (m_iNowBlockY+iTempBlockY<BOARD_Y_SIZE);iTempBlockY++)
                                   {
                                                     bGoodOneLine = TRUE;
                                                     for
(int iTempBlockX = 0;iTempBlockX<BOARD_X_SIZE+2;iTempBlockX++)
                                                     {
                                                                       if(0
== g_BoardInfo[m_iNowBlockY+iTempBlockY][iTempBlockX] ){ // 한칸이라도 빈칸이 있으면.
                                                                                        bGoodOneLine = FALSE;
                                                                                        iTempBlockX = BOARD_X_SIZE + 2;
                                                                       }
                                                     }
                                                     if(TRUE == bGoodOneLine){
                                                                       int
iRemoveLineNum = m_iNowBlockY+iTempBlockY;
                                                                       for(int
i=iRemoveLineNum ; i>0 ; i--){
                                                                                        for(int
j=1;j<BOARD_X_SIZE+2;j++){
                                                                                                          g_BoardInfo[i][j] =g_BoardInfo[i-1][j] ;
                                                                                        }
                                                                       }
                                                     }
                                   }
몇가지 기능 추가
스페이스바 누르면 벽돌이 바닥에 붙게 하기
                                   {
                                                     while(CanMove(m_iNowBlockDir,m_iNowBlockY+1,m_iNowBlockX))
                                                                       MoveDown();
                                                     ChecknRemove();
                                   }
벽돌모양 랜덤하게 만들기
srand( (unsigned)time( NULL ) ); 
                  m_iNowBlockShape
= rand()%7;
게임 끝인지 체크하는 함수
BOOL CWATTetrisView::IsGameEnd(){
                 for(int
tempY
= 0;tempY<2
;tempY++){
                                  for(int
tempX=3;
tempX<7;
tempX++)
                                   {
                                                     if(0
!= g_BoardInfo[tempY][tempX]){
                                                                       return
TRUE;
                                                    }
                                   }
                 }
                  return FALSE;
}
끝인지 체크는 벽돌이 바닥에 닿았을때 체크하면 된다.
                  if(IsGameEnd()){
                                   KillTimer(1);
                                   if(IDYES == MessageBox("한판 더 해?","게임이 끝났습니다.",MB_YESNOCANCEL)){
                                                     GameStart();
                                   }
                  }
다음블럭 미리보기
m_iNextBlockShape 변수를 추가하여 블록이 생성될때 미리 다음 블록을 생성한다.
void CWATTetrisView::DrawNextBlock(CClientDC *pDC)
{
                 for(int
tempY
= 0;tempY<4;tempY++){
                                  for(int
tempX=0;
tempX<4;
tempX++)
                                   {
                                                     if(0
!= g_NowBlockInfo[m_iNextBlockShape][0][tempY][tempX]){
                                                                      DrawOneBlock((BOARD_Y_POS+tempY),BOARD_X_POS+BOARD_X_SIZE+3+tempX,m_iOneBlockSize,pDC,RGB(50,200,200));
 
                                                    }
                                   }
                 }
}
소스 파일 : WATTetris_20071018.zip
실행 파일 : WATTetris.exe
..

 
	
		 


 
    
 
    
 
     


 
  
 
 
  
  
 

 



 37
37
이렇게 소스를 보다보니 변수를 선언하실때 int나 bool 이렇게 나누시는데
이건 앞의 함수의 선언에 따라 함수 내부 변수를 달리하신건가요....
그리고.. 변수를 이렇게 정의 내리신 이유는 무엇때문이죠....