참조 내용 : http://cafe.naver.com/cafec/281172
소스보기
➀ 벽과 빈 공백 화면을 배열에 저장
board[x][y] = (y==0 || y==BH+1 || x==0 || x==BW+1) ? WALL:EMPTY;
➁ 바탕화면(보드의 벽, 글씨) 그리기
DrawScreen();
➂ 블럭 선택
brick=random(sizeof(Shape)/sizeof(Shape[0]));
➃ 블럭을 화면에 그리기
PrintBrick(TRUE);
➄ 보드의 맨 위의 줄에 블럭을 그릴 수 있는지 검사
GetAround(nx,ny,brick,rot)
➅ 맨 위의 줄에 블럭을 그릴 수 없으면 게임 종료
if (GetAround(nx,ny,brick,rot) != EMPTY) break;
for문을 빠져 나와서 gameover라는 말을 화면에 남기고 main함수를 종료하게됨
➆ --nStay == 0이면
1] nStay = nFrame //nStaty = 20;
2] 블럭을 한칸 내림
➇ --nStay != 0 이면 ProcessKey()(키 눌림을 검사)를 실행
ProcessKey()가 반환값 true을 받으면
보드의 바닥에 블럭이 도착하거나 블럭의 한줄이 완성되어 한줄이 삭제된 상태를 나타냄
반환값 false를 받으면
보드의 바닥에 블럭이 도착하지 못하고 블럭이 공중에 떠 있는 상태
1) 왼쪽
1] 왼쪽으로 이동한 블럭을 그릴 수 있는지 검사
***** 가능
현재 위치 블럭 삭제
왼쪽으로 이동한 위치에 블럭을 그림
return false
***** 불가능
return false
2) 오른쪽
1) 왼쪽과 같음
3) 위쪽
1] 블럭의 회전(rot)이 3을 넘어가면 0으로 돌림, 3미만이면 rot+1
2] 회전한 모양(trot)이 화면에 그릴 수 있는지 검사
****가능
현재 위치 블럭 삭제
rot = trot 회전한 모양으로 설정
회전한 모양을 화면에 그림
return false;
*****불가능
return false;
4) 아래쪽
if (MoveDown())
{
return TRUE; //MoveDown()의 반환값이 true면
}
return FALSE; //MoveDown()의 반환값이 false면
MoveDown()의 반환값이 true면 블럭이 보드의 바닥에 도착하거나 블럭의 한줄이 완성되어 한줄이
삭제된 상태를 나타냄
반환값 false를 받으면
보드의 바닥에 블럭이 도착하지 못하고 블럭이 공중에 떠 있는 상태
1] 한칸 아래에 블럭 그릴 수 있는지 검사
*******그릴 수 있음
현재 위치의 블럭을 화면에서 지움
한칸 아래쪽으로 이동 ny++;
한칸 아래에 블럭을 그림
return false;
********그릴 수 없음
TestFull()실행
1> board배열에 현재 블럭의 위치에 블럭이라고 저장
board[nx+Shape[brick][rot][i].x][ny+Shape[brick][rot][i].y]=BRICK;
2> 모든 보드판 좌표를 검사
for(y=1; y<BH+1; y++)
for(x=1; x<BW+1; x++)
3> 한 줄이 모두 블럭으로 채워졌는지 검사
if(board [x][y] != BRICK)
break;
if(x == BW+1)
************한 줄이 모두 블럭으로 채워짐(x==BW+1)
1~ 모두 채워진 줄을 삭제하고 위에 남아 있는 블럭들을 한칸씩 아래로 내림
ty > 1인 이유: 맨 위에 1번줄은 사용되지 않는 줄임
for (ty=y;ty>1;ty--) {
for (x=1;x<BW+1;x++) {
board[x][ty]=board[x][ty-1];
2~ 보드를 다시 그림
DrawBoard();
3~ 1/5초 정지
************한 줄이 모두 블럭으로 채워지지 않음(x!=BW+1)
아무것도 실행하지 않음
5) 띄어쓰기
블럭이 바닥에 닿을 때까지 계속 아래로 블럭을 이동
while(MoveDown() == false)
return TRUE;