pygame으로 만드는 슈팅게임

파이썬(Python) Project#1_Younggi Invasion

by Younggi Seo


무조건 반복문(while loop)과 조건 반복문(for - if)의 제어구조를 쉽게 활용하는 슈팅 게임 만들기

게임 다운로드
1) https://github.com/DanielNoah/pygame_ShootingGame.git
2) pygame library 필요 (파이썬 Python 3.10 이상 버전은 필요 없음)
3) 다운로드 후 Python IDLE에서 invasion.py 파일을 실행시키면 된다.
4) 내려오는 Younggi(필자)에 비행기가 부딪히거나, 화면 바닥에 닿는 횟수가 세 번이면 게임은 종료된다.




Python으로 만들어보는 슈팅게임 제작 초기의 화면




2년 전에 python 코딩을 배울 겸 해서 구입했던 외국 서적에 나온 세 가지 프로젝트를 전부 따라한 적이 있다. 첫 번째는 pygame이라는 라이브러리를 이용해 비행기 슈팅 게임을 만드는 거였고, 두 번째는 데이터 시각화와 관련해서 Pygal 라이브러리를 이용해서 CSV 형식과 JSON 형식 파일을 다운로드해서 시각화 결과물을 github에 연동시키는 거였다. 그리고 세 번째 프로젝트는 파이썬 django(장고)

를 통해 웹서비스(피자 주문) 애플리케이션을 제작하는 거였다.



셋 다 만들었었으나, 어정쩡한 코딩 문법 개념만으로 무작정 원서를 보고 타이핑한 거라서 첫 번째로 만들었던 게임은 미사일을 발사해서 외계인(Aliens)들이 제거는 되나 득점 집계까지는 하지 않았고, 두 번째는 몇 개의 그래프만을 표시하는데 필요한 라이브러리를 다운로드하는 데 진을 빼서 맛만 보고 넘겼고, 세 번째는 애플리케이션은 구성했는데 로그인에서 버그가 났던 것을 디버깅하느라 때려치웠던 것으로 기억한다.


책을 보고 그대로 타이핑한다고 프로그램이 구현되면 다행일 수도(하지만 코딩 개념은커녕 뭘 하는 건지 모를 수도) 있겠지만, 파이썬 문법과 프로그래밍 구조에 대한 정확한 개념이 없으면 뭐 때문에 에러가 뜨는지 찾는데만 애를 먹을 수도 있기 때문에, 대강 파이썬이라는 언어는 이렀구나 하고 넘겼다.



하지만 이번 기회에 다시 그 세 가지의 프로젝트 중 첫 번째 슈팅게임 만드는 것부터 차근차근 다시 정립한 프로그램의 구조를 다 살펴봐가면서(마치 영어를 문장 단위가 아닌 문단 단위의 구조와 세세한 문법까지 신경 쓰면서) 다시 완성해봤다(득점 통계_scoring stat는 다음 주까지 완료하려고 함). 주말을 반납하며 이 프로젝트를 진행하면서 기본적으로 파이썬이라는 프로그래밍 언어를 제대로 환기하고 개념을 정립하는데 참고한 서적은 에리카 한양대 도경구 교수님이 편찬한 '프로그래밍의 정석'이라는 책이었다.



재귀(recursive)와 반복에서 자연수 계산이라는 장에서 재귀의 개념을 환기하면서, 이 파이썬이라는 언어는 재귀에 대해서 타 언어(C나 C++)보다 계산의 한계가 있다는 것을 알았다. 파이썬을 만든 '귀도 반 로섬'은 재귀를 파이썬에 쉽게 사용할 수 있도록 만들지는 않았나 보다는 썰이 포함한 그의 동영상 강의에서 재귀는 결국 '반복 계산 구조(while loop)'와 원칙적으로 동일함을 강조한다.



재귀로 사고하여 함수를 작성하는 원리를 다양한 자연수 계산 문제로 실습하고 개념을 공부하는 와중에 이 pygame이라는 라이브러리를 이용한 '영기 침공(Younggi Invasion)'이라는 프로젝트를 시작하였고, 2주간에 걸쳐서 이전과 달리 게임을 쉽게 완성하고 제어구조가 게임에서 쉽게 활용될 수 있다는 것을 알 수 있었다. 이 게임을 만드는 것을 소개한 저서에서는 while loop문이 들어있는 메인 파일(invasion.py)을 아래와 같이 설명한다.

The main loop of the game, which is a while loop(무조건 반복문) that calls functions as below.
무조건 반복문(while loop) 설정한 게임 코딩 예

그러면 게임에서는 왜 조건 제어문(if나 elif)으로 게임의 시작과 종료를 제어하지 않고 위와 같이 무조건 반복문인 while True: 구문을 쓸까? 한 번의 게임실행으로 중간에 프로그램이 종료하지 않고 게임의 상태를 유지하도록 하기 위해서이다. 이렇게 while 키워드로 감싼 프로그램 구조를 while 루프(loop)라고 한다(2021, 도경구).



이후 게임 속 비행기의 생명이 3보다 작으면 화면을 정지(game over) 시키기 위해 아래와 같이 코드 변경이 되었다. if 키워드 아래의 코드는 게임이 진행 중(정지되지 않은 상태) 일 때만 실행 상태를 유지하도록 하기 위한 구문들이다. 일단 비행기 모듈(ship.py)의 업데이트 함수가 호출되고, 게임 기능 모듈(gf로 gamefunction의 별칭)의 미사일(bullets)과 영기(younggis) 함수가 역시 각 형식 파라미터에 해당하는 인자를 전달받으면서 호출된다.

무조건 반복문 내에 조건문(if)을 설정한 게임 코딩 예



반면 for 키워드의 코드 블록에 중첩(nested)되어 있는 if 키워드를 사용한 코드 블록의 예다. for 루프는 길이가 고정된 시퀀스의 원소를 하나씩 차례로 처리해야 하는 경우 편리하다(2021, 도경구). 조건 분기문인 if라는 명령을 통해, 침공한 필자(younggis)가 화면의 바닥에 닿으면 비행기의 생명(게임 횟수)이 하나씩 깎이는 ship_hit 함수를 호출하고 if문을 빠져나오는 제어구조도 아래 화면에서 확인할 수 있다.



게임은 아래와 같은 그래픽과 본래 UFO였던 이미지를 나의 사진으로 바꾼 younggis(fleet, 전함)가 좌우로 움직이면서 아래로 내려가는 진행 절차를 가진다. 아직 Scoring(득점) 모듈은 빌드업하지 않아서, 일단 필자의 사진을 전부 다 맞추면 게임은 다시 시작되기만 한다. 만약 게임을 한 번 하고 싶으시다면 이 글의 맨 위에 링크 걸어둔 github 주소에서 폴더 전체를 다운로드해서 'invasion.py' 파일을 Python idle로 실행시키면 된다.



필자가 어릴 적에 모노 그래픽(CGA)으로 처음 게임을 시작할 때, 같은 반 여자 친구로부터 빌린 PC 게임 중에 갤로그라는 당시에 꽤 유명했던 비행기 슈팅게임이 있었는데 집의 컴퓨터(대우 통신의 XT 286 컴퓨터)로는 구동이 안되어서 그 친구 집의 컴퓨터(아마도 386의 VGA 그래픽카드)에서만 실행되는 것을 보고 허탈했던 기억이 난다. 당시 초등학교 3학년쯤 되었으니(한국에서 대전엑스포가 열렸던 해다), 그때쯤 만약 이러한 게임을 만들 도전 정신이 있었다면, 일론 머스크와 같이 페이팔(paypal)이라는 결제 애플리케이션 하나 만들어서 대박 터뜨리지 않았을까? 중국의 마윈도 결제 서비스 앱(알리바바)으로 스타트업 대박 터뜨렸었는데 말이다. 두 사람의 공통점은 영어를 기본적으로 잘했다는 점이다. 일론은 남아프라카 공화국 출신이었고, 마윈은 영어 강사 출신이었다.


영어를 잘하면 프로그래밍의 개념도 영어 원서를 보면서 더욱 직관적으로(프로그래밍 언어 자체가 영어권의 네이티브가 보통 만들었기 때문에) 익힐 수 있고, 그러면 보통 한국의 IT 서적들과 달리, 코딩의 개념뿐만 아니라 프로그래밍 전체 구조와 각 코딩 블록의 실행에 대해서도 세세하게 다루고 있기 때문에 막무가내식 코딩을 지양하고 프로그램의 구조를 더 큰 프레임에서 볼 수 있는데 도움이 된다.



참조 및 발췌

1) Matthes, E. (2016). Python crash course. No Starch Press.

2) 도경구 (2021). 제어 구조의 설계 원리를 중심으로 배우는 프로그래밍의 정석 파이썬.