본문 바로가기

공부/c언어

테트리스 소스 분석

반응형

참조 내용 : 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;

반응형