테트리스 ver 0.1 의 요구사항은 다음과 같습니다.


-> 상, 하, 좌, 우, 스페이스바 키 입력 처리

-> 한 줄 삭제 기능

-> 다음 블럭 출력 기능

-> 스피드 레벨 및 삭제 줄 수 출력 기능


먼저, 프로젝트 설계에 앞서, 위의 요구사항들을 해결하기 위한 방안을 생각해 보도록 하겠습니다.


[요구사항 1. 상, 하, 좌, 우, 스페이스바 키 입력 처리]


사용자 키 입력을 받아서, 몇 가지로 구분하여 어떤 처리를 할까 고민해 보았습니다.



사용자 키 입력을 받아서, 아래, 좌측, 우측 방향 키의 처리는 현재 움직이는 블럭을 그 방향대로 한 칸 이동 시키면 됩니다. 그리고, 위 방향 키의 처리는, 현재 움직이는 블럭을 시계 방향으로 90 도 회전을 시키는 것으로 합니다. 마지막으로, 스페이스 바 키를 입력 받으면, 현재 움직이는 블럭을 밑으로 내릴 수 있을 만큼 내려서, 가장 밑바닥으로 이동시킵니다. 기본적으로, 이 5 가지 사용자 입력 키를 처리하여 현재 움직이는 블럭의 상태를 변경해 줍니다.


[요구사항 2. 한 줄 삭제 기능]


테트리스에서 한 줄 삭제를 위해서 고민한 방법은, 테트리스 판의 각각의 네모 상자들의 상태를 활용하는 것입니다. 테트리스 판의 네모 상자들의 상태들을 상수로 정의한 내용은 다음과 같습니다. 



실제, 개발시에는, 상수를 사용할 것이지만, 요구사항 분석과 설계 단계에서는, 편의상 약어를 사용하도록 하겠습니다. 이와 같이 정의된 상태들을 바탕으로, 테트리스 판을 모두 채웁니다. 예를 들어, 아래와 같은 상황이라고 가정하겠습니다.



위의 테트리스 판에서, 빨간색 MB 는 현재 이동중인 블럭을 뜻하고, 파란색 FB 는 굳어진 블럭을 의미합니다. (나머지 벽이나 빈 공간의 설명은 생략하겠습니다.) 현재 이동중인 블럭이 내려온다고 가정했을 때, 이 블럭을 굳어진 블럭들의 빈 공간 사이에 끼워보겠습니다.



블럭을 내려서 사이에 끼우면, MB 가 FB 로 변하게 됩니다. 그리고, 가장 밑 라인부터, 가장 위 라인까지 살펴보면서, 해당 라인이 모두 FB 인지 체크합니다. 최종적으로, 해당 라인이 모두 FB 인 경우가 삭제할 대상으로 선정되기 때문입니다.



삭제해야할 행들을 모두 삭제하고 나면, 그 라인이 빈 공간이 됩니다. 그 빈공간을 그 위에 있던 잔여 FB 들을 밑으로 내려오게 해서, 메웁니다.


[요구사항 3. 다음 블럭 출력 기능]


테트리스에서 다음 블럭 출력 기능을 통해서, 미리 다음 수까지 예측하여 게임을 진행하게 되고, 보다 더 높은 점수를 얻는데 도움이 됩니다.



먼저, 출력될 수 있는 블럭의 종류는 위와 같이 총 7 가지 입니다. 각 블럭당 0 부터 6 까지의 정수가 부여되어 있습니다. 블럭을 처음 생성할 경우에는, current (현재 블럭 타입) 와 next (다음 블럭 타입) 모두 랜덤하게 생성합니다. 첫 번째 블럭 생성시에는, current 와 next 가 모두 비어 있을 것이기 때문에, 모두 생성하여 저장합니다. 두 번째 블럭 생성시부터는, current 와 next 가 채워져 있을 것이므로, 둘 다 다시 생성하지 말고, current 는 next 값을 가져오고 (다음 블럭은 현재 블럭이 됩니다.) next 만 다시 랜덤하게 생성합니다.


원래 테트리스의 블럭은 위 그림처럼 총 7 가지가 맞습니다. 하지만 본 ver 0.1 에서는 실제로 총 6 개만이 구현되어 있습니다. (블럭 4 번은 누락되어 있습니다.) 향후 추가 예정입니다.


[요구사항 4. 스피드 레벨 및 삭제 줄 수 출력 기능]


이 요구사항은 단순히 출력만 하면 되는 것이므로, 따로 해결 방법을 자세히 다루지는 않겠습니다.

by kkikkodev 2015. 6. 12. 11:18