int m_iScore;// 점수 변수를 만들고,
점수 추가 함수 만들고
int CWATOneTetris::AddScore(int iData)
{
m_iScore +=iData;
return m_iScore;
}
벽돌 한줄이 완성될때마다 점수를 추가한다.
if (iRemoveLineCount>0)
{
AddScore(iRemoveLineCount*iRemoveLineCount);
}
미리보기추가
DrawBoard 함수에서 점수와 다음벽돌을 표시해 주고
// 점수 표시
pDrawDC->TextOut(m_iBoardX+((BOARD_X_SIZE+3)*m_iOneBlockSize),m_iBoardY,"SCORE");
strKeyValue.Format("%d ",AddScore(0));
pDrawDC->TextOut(m_iBoardX+((BOARD_X_SIZE+3)*m_iOneBlockSize),m_iBoardY+(0+1)*m_iOneBlockSize,strKeyValue);
// 미리보기 표시
for(tempY=0;tempY<4;tempY++)
{
for( tempX=0;
tempX<4;
tempX++)
{
if
(0 != g_NowBlockInfo[m_iNextBlockShape][0][tempY][tempX])
{
DrawOneBlockbyCDC( 1+tempY, BOARD_X_SIZE+4+tempX,m_iOneBlockSize,pDrawDC,GetColorByNUM(m_iNextBlockShape+1));
}
}
}
게임 종료체크
끝났는지 체크하여 끝이 났을 경우 더 이상 진행하지 않고,
벽돌은 회색으로 변경시킨다.
void CWATOneTetris::OnTimer()
{
CMainFrame *pFrame = (CMainFrame *)AfxGetMainWnd();
CWATTetrisView
*pView
= (CWATTetrisView *)pFrame->GetActiveView();
if(CanMove(m_iNowBlockDir,m_iNowBlockY+1,m_iNowBlockX)){
m_iNowBlockY +=1;
}else{
if (IsGameEnd())
{
SetGameEND();
}else{
ChecknRemove();
m_iNowBlockX = BOARD_X_SIZE/2-1;
m_iNowBlockY = 0;
m_iNowBlockShape = m_iNextBlockShape;
m_iNextBlockShape = rand()%7;
}
}
DrawBoard();
}
void CWATOneTetris::SetGameEND()
{
int tempX,tempY;
// 모든 벽돌을 회색으로 변경하자.
for(tempY
= 0;tempY<BOARD_Y_SIZE+1;tempY++){
for(tempX=0;
tempX<BOARD_X_SIZE+2; tempX++)
{
if(0
!= m_BoardInfo[tempY][tempX]){
m_BoardInfo[tempY][tempX] = GetColorByNUM(0);
}
}
}
}
소스 : WATTetris_20071109.zip
실행 파일 : WATTetris.zip
먼저 이건 3년전에 작성했고 지금은 코드를 보지 않아 가물가물하다는 말씀을 드립니다.^^
1. 게임 종료
보드의 특정 위치(아마도 위쪽의 가운데)에 벽돌이 걸리면 게임이 종료됩니다.
현재 특정 메세지는 출력하지 않고, 그냥 타이머 종료로 끝낼겁니다.
IsGameEnd() 함수가 게임 끝인지 검사할겁니다.
그 부분에 Messagebox("끝"); 하면 됩니다.^^
2. 게임 스피드
스피드는 SetTimer 함수를 수정하면 됩니다.
SetTimer(1000,......) 하면 1초마다 벽돌이 떨어지는 것이고,
Settimer(500,......) 하면 0.5초마다 벽돌이 떨어지는 겁니다.^^
3. 1인용 게임
1인용 게임은 View 에서 하나의 CTetris 클래스만 사용하면 되고,
가운데위치에서 출력하려면... 보드를 생성할때, 위치를 설정해 주면 됩니다.^^