다음 벽돌이 다시 나와야 한다.
바닥에 닿으면 다음 벽돌 생성
벽돌을 한칸씩 내려오게 하는 함수를 변경하면 된다.
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
..
이렇게 소스를 보다보니 변수를 선언하실때 int나 bool 이렇게 나누시는데
이건 앞의 함수의 선언에 따라 함수 내부 변수를 달리하신건가요....
그리고.. 변수를 이렇게 정의 내리신 이유는 무엇때문이죠....