파이썬-파이게임 제로 (순한맛)
매운맛으로 공부하기Mu에디터 커스텀 버전 다운로드Mu에디터 한글화 프로젝트 참여책관련 Q&A
  • 게임제작하며 프로젝트 기반으로 파이썬 배우기 (순한맛)
  • 1. 파이게임 제로(pygame zero) 라이브러리
  • 2. 개발환경 구축
  • 3. Hello World 프로그램에서 시작하자
  • 4. 게임 루프의 이해
  • 5. 플래피 버드(Flappy bird) 게임 만들기
    • 5.1 화면에 배경 이미지(오브젝트) 나타내기
    • 5.2 화면에 플래피버드(오브젝트) 나타내기와 움직이기
    • 5.3 화면에 플래피버드(오브젝트)의 자연스러운 움직임 만들기
    • 5.4 화면에 파이프(오브젝트) 나타내기와 움직이기
    • 5.5 플래피버드와 파이프의 충돌 구현하기
    • 5.6 플래피버드 게임 추가기능 구현하기 (점수기능)
    • 5.7 플래피버드 게임 추가기능 구현하기 (파이프 위치 랜덤화)
    • 5.8 플래피버드 게임 추가기능 구현하기 (플래피버드 애니메이션)
  • 6. 블록격파(Breakout) 게임만들기
    • 6.1 게임무대에 배경과 배우 등장시키기
    • 6.2 배우들의 움직임 구현하기
    • 6.3 공의 반사와 블록격파 구현하기
    • 6.4 충돌검사시 고려할 것들
    • 6.5 (보너스) 오리지널 게임처럼 만들어 보기
  • 7. 트윈비(TwinBee) 슈팅게임 만들기
    • 7.1 스크롤 배경객체 만들기, 배경음, 배우(적, 주인공) 등장시키기
    • 7.2 배우들의 움직임과 총알 공격 구현하기
    • 7.3 충돌처리 및 기타정보(점수 및 게임종료) 표기
    • 7.4 그 밖에 도전과제
  • 8. 퐁(Pong) 게임 만들기
    • 8.1 절차지향으로 개발하기 1
    • 8.2 절차지향형으로 개발하기 2
    • 8.3 객체지향 개발이론 (객제지향 디자인이란)
    • 8.4 객체지향 개발이론 (사용자 정의 객체 만들기, 상속)
    • 8.5 객체지향으로 개발하기 1
    • 8.6 객체지향으로 개발하기 2
    • 8.7 (보너스) 파이게임제로 예제버전 1
    • 8.8 (보너스) 파이게임제로 예제버전 2
  • 9. 배틀 시티(Battle city) 게임 만들기
    • 9.1 절차지향형으로 개발하기 1
    • 9.2 절차지향형으로 개발하기 2
    • 9.3 객체지향으로 개발하기 1
    • 9.5 객체지향 개발이론 (인터페이스)
    • 9.6 객체지향으로 개발하기 2
    • 9.7 객체지향으로 개발하기 3
    • 9.8 객체지향으로 개발하기 4
  • 10. 퐁(Pong)을 네트워크 게임으로 만들기
    • 10.1 네트워크 게임방식의 이해와 라이브러리 설치
    • 10.2 릴레이 서버 구동과 클라이언트 접속
    • 10.3 네트워크 게임으로 만들기 1
    • 10.4 네트워크 게임으로 만들기 2
  • 부록
    • 게임을 단 한 개의 실행파일로 패키징 하기
    • 뮤 에디터 단축키 모음
Powered by GitBook
On this page

Was this helpful?

  1. 8. 퐁(Pong) 게임 만들기

8.1 절차지향으로 개발하기 1

Previous8. 퐁(Pong) 게임 만들기Next8.2 절차지향형으로 개발하기 2

Last updated 2 months ago

Was this helpful?

바로 아래 화면의 우리가 만들게 될 게임의 최종 결과물을 먼저 보고나면 코드 이해가 훨씬 쉬울 것이다. 우리는 이 게임을 두 가지 프로그래밍 패러다임(, ) 각각을 사용한 두 가지 버전으로 만들어 볼 예정이다. 먼저 이전 절에서 예고했듯이 나만의 객체를 만들고 활용하는 것으로 배워 활용해 봄으로써 이제는 보편화되어 사용되는 객체지향형이 기존의 절자지향형과 어떠한 현격한 차이를 가지는지를 이해하고 객체지향 패러다임으로 입문하는 것이 이번 장의 과업이라고 할 수 있겠다.

우리는 이미 5-7장 통해 3개의 게임제작을 소화했기에 이미 튜토리얼 수준을 넘어섰다 볼 수 있다. 따라서, 이번 장부터는 이미 설명한 기본적인 내용에 대한 자세한 중복설명없이 빠르게 핵심적인 코딩에 대한 설명 위주로 진행하는 것이 여러분을 존중(?)하는 것이라 생각한다.

참고로 이번 게임제작에 필요한 사운드 등의 리소스들은 에서 다운로드 할 수 있으며 게임에 필요한 효과음은 이미 sounds 폴더에 저장되어 있다고 간주하고 시작하겠다. 또는 를 사용 중이라면 뮤 에디터의 작업 디렉토리인 (사용자계정)\mu_code\examples\pygame_zero 안에서 해당 리소스들을 복사해 올 수 있다.

import math
import random

# 게임화면
TITLE = 'pong'
WIDTH = 800
HEIGHT = 600
GAP_FROM_SCR = 20

# 반사판
BAR_H = 100
BAR_W = 15

# 볼
vx = 5
vy = 5
BALL_RADIUS = 10
SPEED_UP = 1.05

# 점수
FINAL_SCORE = 11
b1_score = -1
b2_score = -1

# 배우객체들
ball = Rect(WIDTH/2, HEIGHT/2, \ 
        BALL_RADIUS * math.sqrt(2), BALL_RADIUS * math.sqrt(2))
bar1 = Rect(GAP_FROM_SCR, HEIGHT/2 - BAR_H/2, BAR_W, BAR_H)
bar2 = Rect(WIDTH - BAR_W - GAP_FROM_SCR, HEIGHT/2 - BAR_H/2, BAR_W, BAR_H)
bars = [bar1, bar2]


def reset_ball():
    pass
    
def ball_move_collide():
    pass
    
def gameover_draw():
    pass
    
def bar_move_collide(player):
    pass

def draw():
    screen.clear()
    # 중심선
    screen.draw.line((WIDTH/2, GAP_FROM_SCR), (WIDTH/2, HEIGHT - GAP_FROM_SCR), color='grey')

    # 배우들
    screen.draw.filled_circle(ball.center, BALL_RADIUS, 'white')
    for bar in bars:
        screen.draw.filled_rect(bar, 'white')

    # 점수
    screen.draw.text(str(b1_score), (WIDTH/4, GAP_FROM_SCR), color='yellow', fontsize=60)
    screen.draw.text(str(b2_score), ((WIDTH/4)*3, GAP_FROM_SCR), color='yellow', fontsize=60)
    if b1_score == FINAL_SCORE or b2_score == FINAL_SCORE:
        gameover_draw()

def update():
    global b1_score, b2_score
    
    # 공
    ball_move_collide()

    # 반사판
    for bar in bars:
        bar_move_collide(player)

    # 게임시작 조건
    if (b1_score == FINAL_SCORE or b2_score == FINAL_SCORE) or \
        (b1_score == -1 and b2_score == -1):
        if keyboard.space:
            b1_score = 0
            b2_score = 0
            reset_ball()
    else:  # 공
        ball_move_collide()

현재는 절차지향형으로 개발하기로 했기때문에 필요한 기능들을 함수화(functionalize) 할 필요가 있다는 것을 배웠다. 이번 게임도 함수화를 진행해보자. 코딩에서 항상 염두해 두어야 할 점은 나와 남을 위해 가독성이 좋고, 추후 수정에 대비한 유지보수(maintenance) 측면을 늘 고려해야 한다. 사실상 함수도 그러한 이유로 출연했다고 할 수 있다. 함수의 주목적은 코드중복을 줄이는 것으로 그러나, 이번 게임에서도 여러 객체가 공통으로 사용할 함수로서 묶을 만한게 많지 않은데, 그나마 동일한 목적과 기능의 반사판 객체가 2개가 등장하고 있어, 이 반사판들이 함께 공유할 수 있는 함수목적에 부합하는 bar_move_collide 함수를 추가하자. 그밖에 나머지 함수들(reset_ball, ball_move_collide, gameover_draw)은 공통사용 목적이라기보다 기능적으로 분리된 함수들이라 하겠다.

그럼, 이제 다음 절에서부터 본격적으로 우리의 사용자 함수의 구현체를 구체적으로 채워보도록 하겠다.

우선은 먼저 절차지향형으로성의 개발을 시작해 보자. 이 게임은 두 명의 유저가 공을 주고받는 탁구형식의 게임이나 구조적인 면에서는 공과 반사판을 사용한다는 점에서 이전에 만들어 본 의 확장판 정도로 여겨질 수 있다. 블록격파에서는 공을 반사시키는 반사판(또는 패들이라 불림)이 1개였으나, 여기서는 사용자별로 별도로 조작하는 2개의 반사판이 존재한다는 차이점 정도를 고려하면 되겠다.

그밖에 6장에서 만들어 본 블록격파 게임과 다른 점은 2인용 게임임에도 불구하고 1인용처럼 실행되자마자 곧바로 시작되면 당황스럽기 때문에, 두 게임유저가 준비되었을 때 스페이스 바를 눌러 플레이를 시작하고, 최종게임승패가 결정난 이후에도 다시 스페이스 바를 눌러 게임을 재시작 할 수 있는 기회가 제공된다. 이와 관련된 코드로는 22-23번 라인에서 점수의 초기값을 -1 로 정한 것으로 게임진행이 아직 시작 전 상태임을 구분하기 위한 목적이고, 스페이스 바를 누르면 72번 이하 라인이 적용되면서 플레이 상태로 들어간다.

위의 30번째 라인까지 코드는 게임무대의 배우객체들을 생성하는 것이다. 공(ball), 반사판(bar)와 2개를 생성한다. 각 객체를 만드는 부분은 기존의 오리지널 블록격파 게임과 크게 다르지 않다. 참고로 여기서 배우객체들은 Actor 클래스를 통해 생성한게 아니고, 를 통해 생성된 객체라는 것을 다시한번 유념하자.

다음 절부터 위에 언급된 함수들의 구현체를 만들어보기로 하고, 지금은 그 함수들을 제외한 나머지 코드들에 대해 더 검토해보자. 지금까지 모든 과정을 함께 공부해 온 여러분의 실력상 대부분은 이전에 이미 배웠던 것들의 약간의 변형이라 찬찬히 드려다보면 대부분 이해가 될 것으로 믿는다.

여러분들은 이전에 블록격파 게임을 마무리하면서 제안했던 에 대해 기억하고 있는가? 그 도전과제들을 스스로 추가 기능구현해 봤는지 모르겠다. 이번 퐁 게임에서는 그 도전과제들에서 제안되었던 추가기능들을 포함해서 구현하도록 하겠다. 따라서, 게임의 흥미를 더하기 위해 두 게임 유저가 빠른 승부를 내지 못하고 계속 랠리(Rally)가 이어지면 점점더 공의 움직임의 속도를 빠르게 하기 위해 18라인에 SPEED_UP의 값만큼 속도를 증가시키는 알고리즘이 추가될 예정이고 그 때 사용하려고 (Macro)를 미리 선언해 두었다.

🔢
🔢
오리지널 블록격파 게임
🔢
이곳
커스텀 뮤 에디터
매크로
절자지향형
객체지향형
Rect 클래스
추가 도전과제들