8.1 절차지향으로 개발하기 1
Last updated
Was this helpful?
Last updated
Was this helpful?
바로 아래 화면의 우리가 만들게 될 게임의 최종 결과물을 먼저 보고나면 코드 이해가 훨씬 쉬울 것이다. 우리는 이 게임을 두 가지 프로그래밍 패러다임(, ) 각각을 사용한 두 가지 버전으로 만들어 볼 예정이다. 먼저 이전 절에서 예고했듯이 나만의 객체를 만들고 활용하는 것으로 배워 활용해 봄으로써 이제는 보편화되어 사용되는 객체지향형이 기존의 절자지향형과 어떠한 현격한 차이를 가지는지를 이해하고 객체지향 패러다임으로 입문하는 것이 이번 장의 과업이라고 할 수 있겠다.
우리는 이미 5-7장 통해 3개의 게임제작을 소화했기에 이미 튜토리얼 수준을 넘어섰다 볼 수 있다. 따라서, 이번 장부터는 이미 설명한 기본적인 내용에 대한 자세한 중복설명없이 빠르게 핵심적인 코딩에 대한 설명 위주로 진행하는 것이 여러분을 존중(?)하는 것이라 생각한다.
참고로 이번 게임제작에 필요한 사운드 등의 리소스들은 이곳에서 다운로드 할 수 있으며 게임에 필요한 효과음은 이미 sounds 폴더에 저장되어 있다고 간주하고 시작하겠다. 또는 커스텀 뮤 에디터를 사용 중이라면 뮤 에디터의 작업 디렉토리인 (사용자계정)\mu_code\examples\pygame_zero 안에서 해당 리소스들을 복사해 올 수 있다.
우선은 먼저 절차지향형으로성의 개발을 시작해 보자. 이 게임은 두 명의 유저가 공을 주고받는 탁구형식의 게임이나 구조적인 면에서는 공과 반사판을 사용한다는 점에서 이전에 만들어 본 오리지널 블록격파 게임의 확장판 정도로 여겨질 수 있다. 블록격파에서는 공을 반사시키는 반사판(또는 패들이라 불림)이 1개였으나, 여기서는 사용자별로 별도로 조작하는 2개의 반사판이 존재한다는 차이점 정도를 고려하면 되겠다.
현재는 절차지향형으로 개발하기로 했기때문에 필요한 기능들을 함수화(functionalize) 할 필요가 있다는 것을 배웠다. 이번 게임도 함수화를 진행해보자. 코딩에서 항상 염두해 두어야 할 점은 나와 남을 위해 가독성이 좋고, 추후 수정에 대비한 유지보수(maintenance) 측면을 늘 고려해야 한다. 사실상 함수도 그러한 이유로 출연했다고 할 수 있다. 함수의 주목적은 코드중복을 줄이는 것으로 그러나, 이번 게임에서도 여러 객체가 공통으로 사용할 함수로서 묶을 만한게 많지 않은데, 그나마 동일한 목적과 기능의 반사판 객체가 2개가 등장하고 있어, 이 반사판들이 함께 공유할 수 있는 함수목적에 부합하는 bar_move_collide 함수를 추가하자. 그밖에 나머지 함수들(reset_ball, ball_move_collide, gameover_draw)은 공통사용 목적이라기보다 기능적으로 분리된 함수들이라 하겠다.
여러분들은 이전에 블록격파 게임을 마무리하면서 제안했던 추가 도전과제들에 대해 기억하고 있는가? 그 도전과제들을 스스로 추가 기능구현해 봤는지 모르겠다. 이번 퐁 게임에서는 그 도전과제들에서 제안되었던 추가기능들을 포함해서 구현하도록 하겠다. 따라서, 게임의 흥미를 더하기 위해 두 게임 유저가 빠른 승부를 내지 못하고 계속 랠리(Rally)가 이어지면 점점더 공의 움직임의 속도를 빠르게 하기 위해 18라인에 SPEED_UP의 값만큼 속도를 증가시키는 알고리즘이 추가될 예정이고 그 때 사용하려고 매크로(Macro)를 미리 선언해 두었다.
그럼, 이제 다음 절에서부터 본격적으로 우리의 사용자 함수의 구현체를 구체적으로 채워보도록 하겠다.
그밖에 6장에서 만들어 본 블록격파 게임과 다른 점은 2인용 게임임에도 불구하고 1인용처럼 실행되자마자 곧바로 시작되면 당황스럽기 때문에, 두 게임유저가 준비되었을 때 스페이스 바를 눌러 플레이를 시작하고, 최종게임승패가 결정난 이후에도 다시 스페이스 바를 눌러 게임을 재시작 할 수 있는 기회가 제공된다. 이와 관련된 코드로는 22-23번 라인에서 점수의 초기값을 -1 로 정한 것으로 게임진행이 아직 시작 전 상태임을 구분하기 위한 목적이고, 스페이스 바를 누르면 72번 이하 라인이 적용되면서 플레이 상태로 들어간다.
위의 30번째 라인까지 코드는 게임무대의 배우객체들을 생성하는 것이다. 공(ball), 반사판(bar)와 2개를 생성한다. 각 객체를 만드는 부분은 기존의 오리지널 블록격파 게임과 크게 다르지 않다. 참고로 여기서 배우객체들은 Actor 클래스를 통해 생성한게 아니고, Rect 클래스를 통해 생성된 객체라는 것을 다시한번 유념하자.
다음 절부터 위에 언급된 함수들의 구현체를 만들어보기로 하고, 지금은 그 함수들을 제외한 나머지 코드들에 대해 더 검토해보자. 지금까지 모든 과정을 함께 공부해 온 여러분의 실력상 대부분은 이전에 이미 배웠던 것들의 약간의 변형이라 찬찬히 드려다보면 대부분 이해가 될 것으로 믿는다.