OF를 사용하는 자유프로젝트 주제로 파이프 게임을 떠올린건 수업시간에 Waterfall 프로젝트를 진행하면서였다.

대충 물줄기가 선반을 타고 흐르는 것을 표현하는 프로젝트였는데

 

구멍에서 물이 수직으로 떨어지고, 선분을 만나면 선분을 따라 흘러내린다

그냥 물이 흐르니... 수도꼭지를 생각하게 되었고... 자연스럽게 파이프 게임이 떠오른...

암튼 어릴때 많이 했던 파이프 게임도 이 원리를 이용하면 쉽게 구현할 수 있겠다 싶어서

자유 프로젝트 주제로 파이프 게임 구현을 선택하게 되었다.

수업시간에 배운 내용을 바탕으로 주제 구상하라고 했으니 안성맞춤.

전체적인 설계는 아래와 같다.

[ 게임을 구성하는 요소는 무엇인가? ]

1. 좌표 평면을 일정한 개수의 그리드로 나눈다. 이 때 가로 세로 그리드의 개수는 각각 3의 배수가 되어야 한다.

 

3*3의 파이프 블럭들을 빈틈없이 배치할 수 있도록 구성된 필드

2. 3*3의 그리드 안에 파이프를 배치한다. 정사각형 그리드 안에 배치하는 이유는 파이프를 원활하게 회전시키기 위함.

 

파이프를 4 방향으로 회전하기 위해서는 3*3 만큼의 자리가 필요하다

3. 파이프의 종류는 총 3가지이다 : 1자 파이프 1개와 ㄱ자 파이프 2개.

ㄱ자 파이프가 2개 필요한 이유는 물이 흐르는 방향에 따라 같은 모양의 ㄱ자 파이프를 2가지로 나누었기 때문이다.

 

총 세 종류의 파이프가 존재한다.

4. 물은 언제나 배치된 파이프의 중앙부로 흐르며, 빨간색 바가 있는 쪽으로만 흐를 수 있다.

 

즉 두번째 줄은 파이프를 잘못 배치한 경우에 해당한다.

5. 플레이어는 물줄기가 출발점에서 도착점으로 흐를수 있게 파이프를 배치해야 한다.

 

6. 스페이스바를 눌러 파이프를 배치할 수 있으며, 방향키로 파이프를 회전하거나 파이프의 종류를 바꿀 수 있다.

[ 물이 어떻게 흐르는가? ]

1. OF는 입력받은 정보를 주기적으로 화면에 반복하여 그린다. 이 사실을 이용하면 시간이 지남에 따라 물줄기가 점점 흐르는 것을 표현할 수 있다.

2. 이를 위해 연결리스트를 사용해 아래의 정보들을 저장한다.

- 파이프가 놓여진 위치 좌표 ( = 앞으로 물이 흘러야 할 위치 좌표)

- 이미 물이 흘러간 위치 좌표 ( = 물을 화면에 표시해야할 위치 좌표)

3. 시간이 지남에 따라 프로그램이 파이프가 놓여진 위치 좌표, 즉 앞으로 물이 흘러야 할 위치 좌표를 하나씩 읽는다.

4. 그 좌표를 다시 물이 흘러간 위치 좌표를 저장하는 연결리스트에 그 저장한다.

5. 화면에는 매번 물이 흘러간 위치 좌표에 파란색 흔적을 출력할 것이다. 물이 흘러간 위치 좌표가 점점 늘어날수록 출력되는 파란색 흔적, 즉 물이 흘러간 자국은 점점 길어질 것이다.

 

물줄기는 배치된 파이프를 따라 점점 흘러간다.

[ 언제 게임오버가 되는가? ]

게임오버가 되는 상황은 세가지 이다.

1. 파이프가 이미 놓여진 곳에 또 파이프를 배치해야 하는 경우

>> 파이프를 배치할 때 마다 현재 파이프를 배치하고자 하는 필드의 색상을 check 한다.

>> 색상이 흰색(게임 기본 배경색)이면 그 자리에 파이프가 없는 것으로 간주, 색상이 흰색이 아니면 파이프가 이미 놓여진 것으로 간주한다. 이미 놓여진 경우 그 자리에 파이프를 배치하면 게임오버가 된다.

 

2. 물이 흘러야 하는데 더 이상 놓여진 파이프가 없는 경우(or 경로가 끊어진 경우)

>> 프로그램은 시간이 지남에 따라 물이 흘러야 하는 경로를 저장하는 연결리스트를 처음부터 차례대로 읽는다.

>> 아직 도착점 좌표에 도달하지 않았는데 연결리스트가 갖고 있는 좌표점의 개수가 모두 떨어졌다면? 물이 흘러야 하는데 더이상 놓여진 파이프가 없는 것 : 게임오버 처리된다.

>> 즉 플레이어는 물이 흐르는 속도보다 빠르게 파이프를 배치해야 한다.

 

3. 파이프가 화면의 경계를 넘어가는 경우

>> 파이프를 배치한 다음 파이프를 배치할 수 있는 위치는 해당 파이프의 빨간색 바를 기준으로 선택된다.

>> 즉 그리드를 오른쪽으로 세칸 이동할 것인지, 왼쪽/위/아래로 세칸 이동할 것인지는 빨간색 바를 기준으로 결정된다.

>> 예를들어 게임을 표시하는 화면의 크기가 10*10이라고 했을 때, 이동한 그리드의 좌표가(10,10)을 넘는다면 화면의 경계를 넘어간 것 : 게임오버 처리된다.

 

[ 점수는 어떻게 측정되는가? ]

1. 점수는 플레이 시간에 비례한다. 즉 파이프의 경로를 구불구불하고 복잡하게 만들어 물줄기가 오래 흐르게 할수록 높은 점수를 얻을 수 있다.

2. 점수는 우측 상단에 계속 표시되며, 물줄기가 도착점에 도착하면 점수 계산이 멈추고 최종 점수를 확인할 수 있다.


이제 위 설계 내용을 바탕으로 코드를 작성해보자.

해당 부분은 다음 글에서 자세히 설명하겠다.