Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

파이썬으로 만드는 공 잡기 게임 완벽 가이드

파이썬은 데이터 분석이나 웹 개발뿐만 아니라 컴퓨터 게임 제작에도 활용할 수 있습니다. 이번 글에서는 파이썬의 기본 GUI 라이브러리인 tkinter를 이용해 간단하면서도 재미있는 '공 잡기 게임'을 만드는 방법을 단계별로 살펴보겠습니다.

이 게임의 규칙은 다음과 같습니다. 캔버스 창 상단에서 공이 계속 떨어지고, 창 하단에는 막대(바)가 하나 놓여 있습니다. 마우스로 버튼을 눌러 막대를 좌우로 움직여 떨어지는 공을 받아내면 점수를 얻고, 공을 놓치면 게임이 종료됩니다. 공은 매번 서로 다른 위치에서 떨어지기 때문에 타이밍과 집중력이 중요합니다.

게임 구현 접근 방식

게임을 만들기 위한 전체적인 흐름은 아래 5단계로 정리할 수 있습니다.

  • 1단계 – tkinter로 직사각형 캔버스를 생성합니다. 이 캔버스는 그래픽, 텍스트, 이미지 등 이후 추가될 모든 레이아웃 요소를 담는 배경 역할을 합니다.

  • 2단계 – 상단에서 떨어질 공을 만듭니다. create_oval 메서드를 사용하며, 이 메서드는 원과 사각형의 성질을 모두 가진 타원을 그리기 위해 4개의 좌표값을 입력받습니다.

  • 3단계 – 화면 하단에 좌우로 이동 가능한 막대를 생성합니다. 이때는 create_rectangle 메서드를 활용합니다.

  • 4단계canvas.move 메서드를 사용해 공과 막대를 이동시킵니다. 이 메서드는 객체를 세로 방향과 가로 방향 모두 이동할 수 있게 해줍니다.

  • 5단계 – 하단의 막대를 조작하기 위한 버튼을 만듭니다. 버튼에는 클릭 이벤트가 연결되어 있어, 클릭하는 순간 지정된 동작이 실행됩니다.

전체 소스 코드

위에서 설명한 단계를 바탕으로 작성한 완성된 파이썬 코드는 다음과 같습니다.

#Catching the ball game using Python

from tkinter import Tk, Button, Label
from tkinter import Canvas
from random import randint
base = Tk()
base.title("BALL GAME")
base.resizable(False, False)
color = Canvas(base, width=590, height=610)
color.pack()
standard = 0
length = 5
marks = 0
class model:
   def __init__(self, color, m1, n1, m2, n2):
      self.m1 = m1
      self.n1 = n1
      self.m2 = m2
      self.n2 = n2
      self.color = color
      self.circle = color.create_oval(self.m1, self.n1, self.m2, self.n2,fill="blue", tags='dot1')
   def Game(self):
      offset = 5
      global standard
      if standard >= 510:
         global length, marks, next
         if (length - offset <= self.m1 and
            length + 40 + offset >= self.m2):
            marks += 5
            color.delete('dot1')
            game_play()
         else:
            color.delete('dot1')
            slide.remove(self)
            result()
         return

      standard += 1
      self.color.move(self.circle, 0, 1)
      self.color.after(10, self.Game)
class slide:
   def __init__(self, color, m1, n1, m2, n2):
      self.m1 = m1
      self.n1 = n1
      self.m2 = m2
      self.n2 = n2
      self.color = color
      self.num = color.create_rectangle(self.m1, self.n1, self.m2, self.n2, fill="green",       tags='dot2')
   def push(self, num):
      global length
      if (num == 1):
         self.color.move(self.num, 20, 0)
         length += 20
   else:
      self.color.move(self.num, -20, 0)
      length -= 20
   def remove(self):
      color.delete('dot2')
def game_play():
   global standard
   standard = 0
   size = randint(0, 570)
   game1 = model(color, size, 20, size + 30, 50)
   game1.Game()
def result():
   base2 = Tk()
   base2.title("THE BALL GAME")
   base2.resizable(False, False)
   set = Canvas(base2, width=300, height=300)
   set.pack()
   z = Label(set, text="
Game over

You have scored = " + str(marks) + "

")
   z.pack()
   btx = Button(set, text="Enter if you want to play again", bg="yellow", command=lambda:    repeat(base2))
   btx.pack()
   bty = Button(set, text=" CLOSE ", bg="red",command=lambda: destroy(base2))
   bty.pack()
def repeat(base2):
   base2.destroy()
   function()
def destroy(base2):
   base2.destroy()
   base.destroy()
def function():
   global marks, length
   marks = 0
   length = 0
   x1 = slide(color, 5, 560, 45, 575)
   Bt0 = Button(color, text="move right**", bg="pink",command=lambda: x1.push(1))
   Bt0.place(x=335, y=580)
   Bt1 = Button(color, text="**move left ", bg="pink", command=lambda: x1.push(0))
   Bt1.place(x=260, y=580)
   game_play()
   base.mainloop()
if (__name__ == "__main__"):
   function()

실행 결과

위 코드를 실행하면 다음과 같은 결과 화면을 확인할 수 있습니다.

파이썬으로 만드는 공 잡기 게임 완벽 가이드

코드 핵심 포인트 정리

  • model 클래스: 떨어지는 공을 담당합니다. after(10, ...) 메서드로 10밀리초마다 공을 한 칸씩 아래로 이동시켜 자연스러운 낙하 효과를 만듭니다.
  • slide 클래스: 플레이어가 조작하는 막대를 담당합니다. 버튼 클릭 시 20픽셀씩 좌우로 이동합니다.
  • 충돌 판정: 공이 바닥(y좌표 510 이상)에 도달했을 때 막대의 x 범위와 비교하여 성공 여부를 판단하고, 성공 시 5점을 획득한 뒤 새 공이 생성됩니다.
  • 게임 오버 처리: 공을 놓치면 별도의 결과 창이 열려 최종 점수를 보여주고, 재시작 또는 종료 버튼을 제공합니다.

이 예제는 초보자도 쉽게 따라 할 수 있는 수준의 프로젝트이지만, tkinter의 캔버스 그래픽, 이벤트 처리, 객체지향 설계, 재귀적 애니메이션 루프까지 폭넓게 경험할 수 있다는 점에서 학습 가치가 매우 높습니다. 낙하 속도 조절, 남은 기회 추가, 키보드 조작 지원 등으로 확장해 나가면 더 완성도 높은 게임으로 발전시킬 수 있습니다.