파이썬 게임 개발 (초급) - 핑퐁(Pong)

2020. 7. 2. 00:57

핑퐁(Pong) 게임 기억나시나요? 오늘은 핑퐁 게임을 파이썬을 이용해서 간단히 개발을 해보도록 하겠습니다. 파이썬 게임 프로그램이든 어떤 프로그램이든 개발에 들어가기 앞서서 전체적인 프로그램을 설계하는 습관이 아주 중요한데요, 설계를 구체적으로 하게되면, 머리속으로 먼저 한번 프로그램을 해보게 되는 것이죠. 그러면 프로그램의 큰 그림을 볼 수가 있게 되고, 또한 막연히 생각만 하던 기능들을 구체화 시키면서 어떤 기능들이 필요한지도 정리가됩니다.

오락실의 핑퐁(Pong) 게임

 

1. 파이썬 핑퐁 게임 개발 - 기능을 정의하기

아래의 그림이 최종적으로 우리가 만들어볼 핑퐁 게임의 모습입니다. 그러면 이 핑퐁 게임을 제작하기 위해서 어떤 기능들이 필요할까요?

파이썬 개발한 핑퐁 게임

 

핑퐁 게임에 필요한 기능들

  • 게임 화면창 그리기
  • 핑퐁 바 그리기
  • 핑퐁 볼 그리기
  • 핑퐁 바를 상하로 움직이기
  • 공 튕기기
  • 점수를 계산하고 보여주기

이 정도로 간단한 기능들은 정리가 된 것 같네요. 다음은 이 기능들을 조금 더 상세하게 어떻게 구현할 것인지 설계해보도록 하겠습니다.

 

2. 파이썬 핑퐁 게임 개발 - 기능을 설계하기

기능 설계라고 하면, 위에 간단히 정의한 기능을 프로그램적으로 어떻게 구현할 건지를 좀 더 구체적으로 고민을 해보는 단계를 의미합니다. 

예를 들어서, 추상적으로 위에서는 '점수를 계산' 이라고만 이야기 했는데요, 어떤 경우에 점수를 셀 수 있을까요? 기능 설계는 이렇게 추상적으로만 생각한 기능들을 좀더 구체화 시키는 작업이고, 보다 프로그램적인 접근법이죠.

 

2.1 그리기 모듈은 turtle 모듈을 사용

이번 핑퐁 게임은 간단한 초급자용 게임 개발인 만큰 모듈을 turtle을 사용하겠습니다. turtle 모듈은 파이썬에서 기본적으로 제공되는 모듈이여서, pygame같이 모듈을 설치해주지 않아도 파이썬만 설치가 되어 있으면 누구나 쉽게 개발이 가능합니다.

 

2.2 키보드 입력을 받아서 핑퐁 바를 이동 시키기

핑퐁 볼을 치기 위해서는 핑퐁 바를 움직여야 되겠죠. turtle에 제공하는 listen함수를 이용해서, 키보드의 입력을 받고, 핑퐁 바의 y좌표를 상하로 이동시키주면 될 것 같습니다. 

 

2.3 핑퐁 볼을 움직이고 튕겨주기

제일 처음 핑퐁 볼은 가운데 지점에서 시작해서, 대각선으로 움직이는 것으로 하겠습니다.

핑퐁 볼을 움직인다는 것은 프로그램적으로는 x, y 좌표를 조금씩 옮겨준다는 것인데요, 대각선으로 움직이니까, x, y 좌표를 같은 비율로 옮겨주면 됩니다.

그럼 부딪혀서 튕겨진다는 것은 프로그램적으로는 어떻게 구현 할까요?

 

  • 위아래의 벽에 부딪힐 경우: x 좌표는 그대로 이동하고, y좌표만 반대 방향으로 이동
  • 핑퐁 바에 부딪힐 경우: y좌표는 그대로 이동하고, x좌표가 반대 방향으로 이동

 

2.4 언제 점수를 계산할 것인가?

핑퐁 게임에서 점수를 계산하는 경우는 언제일까요? 내가 점수를 얻는 경우는 상대방이 핑퐁 볼을 받아치지 못했을 경우 입니다. 다시 말하면, 핑퐁 볼이 좌우의 벽에 도착하면, 즉 x 좌표가 게임창의 끝에 도달하면  점수를 더해주면 됩니다. 그리고 점수를 얻으면 핑퐁 볼을 가운데에서 부터 다시 시작하게 하죠.

 

여기까지 간단히 프로그램의 기능 설계를 간단히 해보았는데요. 위의 내용을 다 이해하지 못했어도 괜찮습니다. 코딩전에 설계하는 연습을 해본 것이고요, 밑의 코딩에서 보다 자세한 설명을 해드리도록 하겠습니다. 그럼 개발을 시작해볼까요.

 

3. 파이썬 핑퐁 게임 개발 - 코딩 준비 운동

3.1 프로그램 밑그림 그리기

그림 그릴 때 우리는 밑그림을 그립니다. 프로그램도 그림과 마찬가지로 밑그림을 그리면 프로그램을 보다 체계적으로 구분질 수가 있는데요, 아래 코드가 위의 우리가 정의한 기능을 바탕으로 그려본 프로그램 밑그림 입니다. 

#Ping Pong Game

import turtle

## 화면에 아이템의 초기 이미지 그리기 ##
# 게임 화면창 그리기
# 핑퐁 볼 그리기
# 핑퐁 바 그리기
# 점수판 그리기

## 키보드 입력받고, 핑퐁 바 움직이기 ##

while True:
    ## 화면의 변화를 업데이트 해주기 ##
    scr.update()
    # 핑퐁 볼을 대각선으로 움직이기
    # 볼이 위아래 벽에 부딪혔을 경우 튕기기
    # 볼이 좌우 벽에 도달하면, 점수를 세고, 볼을 가운데로 옮기기
    # 볼이 핑퐁 바에 부딪혔을 경우 튕기기
    

간단히 보면 프로그램 처음에는 게임에 있는 아이템들을 그리는 부분이 있고, 밑에 while 반복문에서는 아이템들의 변화를 게임창에 반영하는 부분입니다. 그리고, 가운데 부분이 키보드 입력을 받아서, 핑퐁 바를 움직이는 부분이 될 겁니다. 이렇게 보니 무척 간단하네요^^

그러면 프로그램을 해볼까요.

 

3.2 프로그램의 정해진 값들을 변수로 지정

프로그램에서 정해진 정수 값들이 있습니다. 화면 사이즈, 볼이 이동하는 x, y 간격, 핑퐁 바의 사이즈 등. 이 값들을 직접 입력해도 프로그램적으로 문제는 없지만, 이 정수값을 변수 지정하면 아래와 같이 좋은 점이 있습니다.

 

  • 숫자가 어떤 값을 의미 하는지 알수 있다.
  • 나중에 숫자를 변경될 때, 변수를 지정한 값만 한번 바꿔주면 된다.

그래서 핑퐁 게임에 필요한 정수값들을 간단히 변수로 지정해 보았습니다. 

import turtle

#화면창 크기
src_width = 800
src_height = 600

#키보드 입력에 의한 핑퐁바 이동 픽셀
bar_mov_pixel = 20

#핑퐁바와 좌우벽의 간격
bar_gab = 50

#핑퐁바 폭
bar_width = 4

#핑퐁볼 이동 x, y 픽셀
ball_mov_pixel = 2

#핑퐁볼 반지름,핑퐁바의 두깨의 반
dot_radius = 10

#점수
score_a = 0
score_b = 0

위의 있는 숫자들은 밑에서 코딩하면서 더 자세히 설명을 하겠습니다.

 

4. 파이썬 핑퐁 게임 개발 - 코딩하기 

이제 본격적으로 파이썬 게임 개발 코딩을 해보도록 하겠습니다.

 

4.1 게임 화면창 그리기

# 게임 화면창 그리기
scr = turtle.Screen()
scr.title("Ping Pong")
scr.bgcolor("black")
scr.setup(width=src_width, height=src_height)  # w:-400~400,h:-300~300 
scr.tracer(0)      # Stop from tracing -> speed up game

게임 화면창은 turtle에 있는 Screen 클래스를 이용해서 화면창 객체를 만듭니다. 이 화면창에서 화면이름(title), 배경색깔(bgcolor), 화면창 크기(setup)를 지정해줄 수 있습니다. tracer(0)는 화면의 tracing을 안하겠다는 의미로 화면의 속도를 높여주는 효과가 있어서 추가했습니다.

 

게임 화면창을 잘 그려졌나 확인해 볼까요?

 

파이썬으로 그린 핑퐁 화면창

항상 한개의 기능을 코딩한 다음에는 테스트를 해주는 버릇도 중요합니다. 그래야 버그가 있을때 바로 바로 찾아서 수정할 수가 있죠.

 

4.2 핑퐁 볼 그리기

핑퐁 볼을 화면 가운데에 그려보겠습니다. 

# 핑퐁 볼 그리기
ball = turtle.Turtle()
ball.speed(0)   #움직이는 속도
ball.shape("circle")
ball.color("red")
ball.penup()    #penup: 이동하는 선을 그리지 않음
ball.goto(0, 0)
ball.dx = ball_mov_pixel
ball.dy = ball_mov_pixel

핑퐁 볼은 turtle 모듈의 Turtle 클래스 이용해서 turtle 객체를 만듭니다. Turtle 클래스는 기본적으로 선을 그리는 기능을 합니다. 그런데 우리는 선을 그릴게 아니라 점만 있으면 되기 때문에, 움직이는 속도(speed) 0로 하고, penup() 함수를 사용했습니다. penup()을 사용하지 않으면 기본값인 pendown 상태가 되서, 볼을 움직일경우 움직이는 경로가 전부 그려지게됩니다.

그리고 형태는 둥글한 "circle"로 하고, 색깔은 빨간색으로 지정했습니다. 또한 볼은 가운데에서 시작하기 때문에 x 좌표 0, y 좌표 0 로 이동시킵니다. 마지막에 있는 dx, dy는 볼의 x, y좌표 이동 방향과 간격입니다. 이것은 밑에서 핑퐁 볼을 움직이는 코딩에서 더 자세히 설명하겠습니다.

 

핑퐁볼이 잘  그려졌나 볼까요?

 

파이썬으로 그린 핑퐁 볼

참고로 turtle의 shape 종류에는 arrow, turtle, circle, square, triangle, classic 가 있는데요, 눈에 띄는게 있었습니다. turtle?! 갑자기 이 거북이 모양이 어떻게 생겼나 궁금해지더군요. 한번 볼의 형태를 turtle로 바꿔봤습니다.

 

거북이 모양 핑퐁 볼

ㅎㅎㅎ 거북이 핑퐁볼이 마음에 드시는 분들은 이것으로 해도 되겠네요 ㅎㅎㅎ

 

4.3 핑퐁 바 그리기

장난은 여기까지 하고 진진하게 다시 코딩을 해보겠습니다. 핑퐁 바를 그려볼까요.

# 핑퐁 바 그리기
# 왼쪽 바
bar_a = turtle.Turtle()
bar_a.speed(0)                          
bar_a.shape("square")
#점을 늘려서 핑퐁바로 만들기
bar_a.shapesize(stretch_wid=bar_width, stretch_len=1)
bar_a.color("white")
bar_a.penup()                           
bar_a.goto(-(src_width/2 - bar_gab), 0) # -350

# 오른쪽 바
bar_b = turtle.Turtle()
bar_b.speed(0)
bar_b.shape("square")
bar_b.shapesize(stretch_wid=bar_width, stretch_len=1)
bar_b.color("white")
bar_b.penup()
bar_b.goto((src_width/2 - bar_gab), 0) # 350

핑퐁 바는 핑퐁 볼 그릴 때와 비슷합니다만, 틀린 점은 핑퐁 바는 점이 아니라 긴 막대기 같은 형태여야 하기 때문에, shapesize 함수를 사용해서 옆을 늘려 줬습니다. 그리고, 막대기이기때문에 모양은 사각형(square)로 하고, 위치는 각각 약간의 간격(bar_gab = 50)을 두고 왼쪽 끝과 오른쪽 끝으로 이동시켜 줍니다. 

핑퐁 바가 잘 그려졌나 한번 확인해보죠.

 

파이썬으로 그린 핑퐁 바

위의 코드에서 조금 마음에 걸리는 부분이 있는데요. 핑퐁 바는 두개가 있어서 두개를 따로 그렸습니다만, 왼쪽 바와 오른쪽 바의 코딩의 차이점은 위치 밖에 없기 때문에 대분분의 코드가 중복되네요. 이렇게 중복되는 코드가 있을 경우 이것을 함수로 만들어 주는 것이 좋습니다. 그러면 변경사항이 있을 때, 그 함수만 한번 변경해주면 둘다 반영이 되니까 코딩량이 줄어들고, 프로그램 시간이 단축되죠. 아래 처럼 함수로 한번 변경해 봤습니다.

# 핑퐁 바 그리기
def draw_bar(pos):
    bar = turtle.Turtle()
    bar.speed(0)
    bar.shape("square")
    #점을 늘려서 핑퐁바로 만들기
    bar.shapesize(stretch_wid=bar_width, stretch_len=1)
    bar.color("white")
    bar.penup()
    bar.goto(pos, 0)
    return bar

# 왼쪽 바
bar_a = draw_bar(-(src_width/2 - bar_gab)) # -350

# 오른쪽 바
bar_b = draw_bar(src_width/2 - bar_gab) # 350

함수를 사용할 때 주의 할 점은 함수를 호출하기 전에 먼저 정의 해줘야 한다는 겁니다.

 

4.4 키보드 입력받고, 핑퐁 바 움직이기

이미지를 그렸으니 이제 움직여 볼까요? 먼저 핑퐁 바를 움직여 보겠습니다. 핑퐁 바를 움직이려면 키보드의 입력값을 받아야 합니다. 왼쪽 바는 "w", "s" 키로 오른쪽 바는 위("Up"), 아래("Down") 방향키로 위 아래를 조종하겠습니다.

## 키보드 입력받기 ##
scr.listen()
scr.onkeypress(move_bar_a_up, "w")
scr.onkeypress(move_bar_a_down, "s")
scr.onkeypress(move_bar_b_up, "Up")
scr.onkeypress(move_bar_b_down, "Down")

turtle의 Screen 클래스는 listen 함수를 제공하는데, 이 함수를 실행하면, onkeypress 함수를 이용해서 키보드의 입력값을 인식할 수 있습니다. onkeypress 첫번째 인수는 키보드를 입력됐을 때 불려지는 함수 이름이고, 두번째 인수는 인식하는 키보드 키값 입니다.

 

위에서도 언급했지만, 함수는 호출 되기 전에 정의가 되어야 하기 때문에 위의 키 입력 코딩 부분 위에 핑퐁 바 움직이는 함수를 아래와 같이 정의 해둡니다.

## 핑퐁 바 움직이기 ##
def move_bar_a_up():
    bar_a.sety(bar_a.ycor() + bar_mov_pixel) #20픽셀 위로

def move_bar_a_down():
    bar_a.sety(bar_a.ycor() - bar_mov_pixel) #20픽셀 아래로

def move_bar_b_up():
    bar_b.sety(bar_b.ycor() + bar_mov_pixel) #20픽셀 위로

def move_bar_b_down():
    bar_b.sety(bar_b.ycor() - bar_mov_pixel) #20픽셀 아래로

## 키보드 입력받기 ##
scr.listen()
scr.onkeypress(move_bar_a_up, "w")
scr.onkeypress(move_bar_a_down, "s")
scr.onkeypress(move_bar_b_up, "Up")
scr.onkeypress(move_bar_b_down, "Down")

 

주의 할점은 w, s의 키의 경우 대소문자도 구분하고, 한글로 키가 되어 있을 경우에도 인식이 안되니, w, s 키가 인식이 안되는 분들은 한번 확인해 보세요. 그럼 핑퐁바가 문제 없이 잘 움직이는지 확인해 볼까요?

 

위아래로 움직이는 핑퐁 바

4.5 핑퐁 볼을 대각선으로 움직이기

이제 볼을 움직여 보겠습니다. 

while True:
   ## 화면의 변화를 업데이트 해주기 ##
    scr.update()

    #핑퐁 볼을 대각선으로 움직이기
    ball.setx(ball.xcor() + ball.dx)
    ball.sety(ball.ycor() + ball.dy)

 

앞에서 핑퐁 볼을 그릴때 x, y 좌표의 이동방향과 간격을 dx, dy를 각각 2로 지정했습니다. 즉, 볼의 초기 x, y 값은 0, 0 이고, dx, dy가 각각 2 필셀이므로, 위의 코드는 while이 반복문 실행 될때 마다 핑퐁 볼을 오른쪽으로 2픽셀, 위로 2픽셀씩 대각선으로 이동시켜줍니다.

 

화면의 좌표와 핑퐁 볼의 이동방향

 

4.6 벽에 볼이 부딪혔을 경우

이제 핑퐁 볼을 이동 시켰으니 볼은 사방의 벽에 부딪힐 겁니다. 그러면 기능 설계에서 우리가 정의한 대로 아래와 같이 방향을 바꿔주면 됩니다.

 

  • 위아래의 벽에 부딪힐 경우: x 좌표는 그래도 이동하고, y좌표만 반대 방향으로 이동
  • 좌우 벽에 부딪힐 경우: 점수를 추가하고, 가운데(x, y 좌표 0)로 이동 한 후, x좌표 이동방향 전환.

 

핑퐁볼이 좌우 벽에 도달하면 가운데로 이동한 후에 x축의 이동방향을 전환해 주는 부분이 추가 되었네요. 그 이유는 x좌표를 전환해주지 않으면 계속 한쪽 방향으로만 이동하기 때문에 한쪽 핑퐁 바에게만 계속 날라 오게 되죠. 불공평한 게임이 되겠죠 ㅎㅎ.

 

while True:
    ...
    ...
    ...
    
    #볼이 위아래 벽에 부딪혔을 경우 튕기기
    y_pos = src_height/2 - dot_radius #높이 300 - 10
    x_pos = src_width/2 - dot_radius #폭 400 - 10
    #위벽
    if ball.ycor() > y_pos: 
        ball.sety(y_pos)
        ball.dy *= -1     #y축 이동방향 전환
    #아래벽
    if ball.ycor() < -y_pos: 
        ball.sety(-y_pos)
        ball.dy *= -1
        
    #볼이 좌우 벽에 도달했을 경우 가운데로 이동하고, x축 이동방향 전환
    #왼쪽벽
    if ball.xcor() > x_pos:
        ball.goto(0, 0)   #가운데로 이동
        ball.dx *= -1     #x축 이동방향 전환

    #오른쪽벽
    if ball.xcor() < -x_pos:
        ball.goto(0, 0)
        ball.dx *= -1

 

점수를 추가하는 부분은 밑에서 점수 표시하는 부분에서 같이 코딩하도록 하겠습니다.

 

4.7 핑퐁 바로 볼을 튀기기

그러면 볼이 핑퐁 바에 의해 튕겨 나간다는 것을 어떻게 알 수 있을까요? 

 

공이 바에 튕겼을 경우

 

오른쪽 핑퐁바를 기준으로 봤을 때 아래와 같이 경우가 공이 바에 맞았다고 할 수 있겠습니다.

  • 공의 x 좌표가 330[400 - 50(바와 벽의 간격) - 10(바의 폭/2) - 10(공의 반지름)] 보다 크고 350 보다 작은 경우
  • 그리고 공의 y 좌표가 바의 y좌표의 +40 보다 작고, -40 보다 큰 경우

 

 

while True:
    ...
    ...
    ...
    ...
    #bar_b 볼을 튕기기
    # 400 - 50(바와 벽의 간격) - 10(바의 폭/2) - 10(공의 반지름) = 330
    x_pos_bar_min = src_width/2 - bar_gab - dot_radius - dot_radius # 330
    x_pos_bar_max = src_width/2 - bar_gab # 400 - 50 = 350
    y_pos_bar = 40
    if ball.xcor() > x_pos_bar_min and ball.xcor() < x_pos_bar_max and ball.ycor() < (bar_b.ycor() + y_pos_bar) and ball.ycor() > (bar_b.ycor() - y_pos_bar):
        #x좌표 330~350까지를 부딪혔다고 판단하고, 330을 넘었을 경우 
        #표면에서 부딪힌 것처럼 보이기 위해서, x좌표 330로 볼을 이동
        ball.setx(x_pos_bar_min)  
        ball.dx *= -1 #x축 이동방향 전환

    #bar_a 볼을 튕기기
    if ball.xcor() < -x_pos_bar_min and ball.xcor() > -x_pos_bar_max and ball.ycor() < (bar_a.ycor() + y_pos_bar) and ball.ycor() > (bar_a.ycor() - y_pos_bar):
        ball.setx(-x_pos_bar_min)
        ball.dx *= -1

조금 복잡해 보이지만, 코딩을 하면서 값을 조금씩 변경 하면서(330을 340으로 변경) 실제로 화면에서 어떻게 보이는지 확인을 해보면 더 이해하기 쉬워질 수 있습니다. 

 

4.8 점수 계산하고 카운트 하기

이제 복잡한 코딩은 다 끝났습니다. 

다음으로 점수를 표시해볼까요.  초기 점수를 표시하는 부분을 코딩해 보면 다음과 같습니다.

 

# 점수판 그리기
pen = turtle.Turtle()
pen.speed(0)
pen.color("white")
pen.penup()
pen.hideturtle()
pen.goto(0, 250)
pen.write("Player A: 0 Player B: 0", align="center", font=("Courier", 24, "normal"))

Turtle 클래스의 write함수를 이용해서, 글자 위치(align) 글자체(font) 등을 지정할 수 있습니다.

점수판이 잘 그려졌는지 확인해 볼까요?

 

파이썬으로 점수판 표시

그럼 이제 점수를 세는 코딩을 해야합니다. 서두의 기능 설계에서 정의 한 것처럼, 볼이 좌우벽에 도달하게 되면 반대편 쪽에게 점수를 추가해주면 됩니다. 위에 우리는 볼이 좌우벽에 도달 했을 때의 코딩을 했으니 거기에 점수를 추가 하고, 화면에 추가된 점수를 다시 표시해주는 부분을 더해주겠습니다. 

 

    #왼쪽벽
    if ball.xcor() > x_pos:
        ball.goto(0, 0)   #가운데로 이동
        ball.dx *= -1     #x축 이동방향 전환
        score_a +=1
        pen.clear()
        pen.write(f"Player A: {score_a} Player B: {score_b}", align="center", font=("Courier", 24, "normal"))
    #오른쪽벽
    if ball.xcor() < -x_pos:
        ball.goto(0, 0)
        ball.dx *= -1
        score_b +=1
        pen.clear()
        pen.write(f"Player A: {score_a} Player B: {score_b}", align="center", font=("Courier", 24, "normal"))

위의 코드를 보면 pen.clear()라는 코드가 있는데, 이 함수를 처리해주지 않고, 새로운 점수를 그대로 표시해주면, 이전 점수가 계속 겹쳐서 쓰여지는 현상이 발생하게 됩니다. 

 

점수가 겹쳐서 쓰여지는 현상

 

4.9 보너스 코딩 - 소리 추가하기

우리가 설계한 기능들은 다 구현을 해보았습니다. 그런데 역시 게임에서는 소리가 없으면 심심하겠죠. 그래서 보너스 코딩으로 볼이 핑퐁바에 부딪혔을 때 '팅' 하고 소리가 나는 기능을 추가해보도록 하겠습니다. 

 

코딩에 앞서서 파이썬은 대부분 기능들이 모든 운영체제에 동일하게 적용될 수 있도록 되어 있는데, 이 소리를 나게 하는 부분은 운영체제별로 다르게 코딩을 해줘야 합니다. 저는 맥(Mac)을 사용하기 때문에 Mac의 코딩을 하겠습니다만, Window와 Linux용 코딩은 주석으로 표현해 놓겠습니다. 

 

코딩 첫부분 import 부분에 운영체제와 연동할 수 있는 모듈을 import 합니다.

import turtle
import os #Mac, Linux 용
#import winsound #Windows 용

 

그 다음으로 공이 핑퐁 바에 부딪히는 부분의 코딩에 소리를 내는 부분을 추가하겠습니다. 

 

    #bar_b 볼을 튕기기
        ...
        ball.dx *= -1 #x축 이동방향 전환
        os.system("afplay bounce.wav&") #Mac
        #os.system("aplay bounce.wav&") #Linux
        #winsound.PlaySound("bounce.wav", winsound.SND_ASYNC) #Windows

    #bar_a 볼을 튕기기
    	...
        ball.dx *= -1
        os.system("afplay bounce.wav&") #Mac
        #os.system("aplay bounce.wav&") #Linux
        #winsound.PlaySound("bounce.wav", winsound.SND_ASYNC) #Windows

소리 파일 bounce.wav를 사용했고요, 이 파일은 파이썬 파일과 같은 폴더에 있어야 됩니다. 그리고 위의 코드에 보면 Mac, Linux의 경우에는 파일명 뒤에 '&'가 있고, Windows의 경우에는 winsound.SND_ASYNC 인자가 추가 되어 있는데요. 그 이유는 이 부분이 추가 되지 않으면 소리가 출력되는 순간에 화면이 잠깐 멈추는 현상이 발생합니다. 한번 이 부분을 빼고 실행을 해보시면 제가 무슨 말을 하는 지 알 수 있을 겁니다. 

 

여기까지 파이썬으로 핑퐁 게임을 개발 해보았습니다. 몇가지 기능들은 아직 더 보완하면 더 좋을 것은데요. 예를 들어 지금은 게임이 무한대로 계속 진행되는데, 점수가 10점 정도 되면 게임을 멈추고 'You Win' 같은 글씨를 표시해 주면 더 재미있을 것 같습니다. 

 

완성된 소스코드는 밑의 Github에 올려놨습니다. 즐겜되세요^^

 

소스코드 다운로드(Github) :

https://github.com/tutletscom/pythonpong.git

 

흥미로운 다른글들

이 글을 공유합시다

facebook twitter googleplus kakaoTalk kakaostory naver band