두근두근 파이썬 수업 14장 프로젝트 II
이번 장에서 만들 프로그램 이번 장에서 클래스를 사용하여서 간단한 게임을 작성해보자. 화면의 왼쪽 공에서 포를 쏘아서 오른쪽 공을 맞추는 게임이다. 오른쪽 공은 상하로 움직인다. 녹색공을 우리 우주선이라고 생각하고 빨강색공을 외계 우주선이라고 생각하자.
공을 클래스로 표현하자. 객체 = 속성(ATTRIBUTE) + 메소드(METHOD) 공의 속성 공의 동작 ball.color ball.size ball.x 공의 동작 ball.move()
Ball 클래스 class Ball: def __init__(self): # 생성자 self.color="red" self.size=30 self.x = 0 self.y = 0 self.xspeed = 0 self.yspeed = 0 def move(self): # Ball을 이동시키는 함수 pass
객체 생성 class Ball: def __init__(self): # 생성자 self.color="red" self.size=30 self.x = 0 self.y = 0 self.xspeed = 0 self.yspeed = 0 def move(self): # Ball을 이동시키는 함수 pass ball = Ball() print("공의 색상=", ball.color) print("공의 크기=", ball.size) print("공의 x좌표=", ball.x) 공의 색상= red 공의 크기= 30 공의 x좌표= 0
다양한 공을 만들어보자. class Ball: def __init__(self, color, size, x, y, xspeed, yspeed): # 생성자 self.color = color # Ball의 색상 self.size = size # Ball의 크기 self.x = x # Ball의 중심점의 x좌표 self.y = y # Ball의 중심점의 y좌표 self.xspeed = xspeed # Ball의 수평방향 속도 self.yspeed = yspeed # Ball의 수직방향 속도 def move(self): # Ball을 이동시키는 함수 pass ballA = Ball("red", 30, 0, 0, 0, 0) print("공의 색상=", ballA.color) print("공의 크기=", ballA.size) print("공의 x좌표=", ballA.x) print("") ballB = Ball("blue", 100, 50, 50, 10, 10) print("공의 색상=", ballB.color) print("공의 크기=", ballB.size) print("공의 x좌표=", ballB.x)
다양한 공을 만들어보자. 공의 색상= red 공의 크기= 30 공의 x좌표= 0 공의 색상= blue 공의 크기= 100
Ball 클래스에서 원 그리기 from tkinter import * class Ball: def __init__(self, canvas, color, size, x, y, xspeed, yspeed): self.canvas = canvas # 캔버스 객체 self.color = color # Ball의 색상 self.size = size # Ball의 크기 self.x = x # Ball의 x좌표 self.y = y # Ball의 y좌표 self.xspeed = xspeed # Ball의 수평방향 속도 self.yspeed = yspeed # Ball의 수직방향 속도 self.id = canvas.create_oval(x, y, x+size, y+size, fill=color) def move(self): # Ball을 이동시키는 함수 pass WIDTH = 800 # 윈도우의 가로 크기를 저장한다. HEIGHT = 400 # 윈도우의 세로 크기를 저장한다. window = Tk() canvas = Canvas(window, width=WIDTH, height=HEIGHT) canvas.pack() ballA = Ball(canvas, "red", 30, 0, 0, 0, 0)
실행결과 공이 화면에서 보이지만 움직이지 않는다.
공을 움직여보자. from tkinter import * class Ball: def __init__(self, canvas, color, size, x, y, xspeed, yspeed): self.canvas = canvas # 캔버스 객체 self.color = color # Ball의 색상 self.size = size # Ball의 크기 self.x = x # Ball의 x좌표 self.y = y # Ball의 y좌표 self.xspeed = xspeed # Ball의 수평방향 속도 self.yspeed = yspeed # Ball의 수직방향 속도 self.id = canvas.create_oval(x, y, x+size, y+size, fill=color) def move(self): # Ball을 이동시키는 함수 self.canvas.move(self.id, self.xpseed, self.yspeed) WIDTH = 800 # 윈도우의 가로 크기를 저장한다. HEIGHT = 400 # 윈도우의 세로 크기를 저장한다. window = Tk() canvas = Canvas(window, width=WIDTH, height=HEIGHT) canvas.pack() ballA = Ball(canvas, "red", 30, 0, 0, 0, 0)
공을 움직여보자. # 무한 루프이다. while True: ball.move() window.update() time.sleep(0.03)
공을 화면에서 반사시키자 공이 오른쪽 벽에 충돌하면 반사되도록 만들어보자. Ball 클래스에 공이 한 번에 움직이는 거리를 나타내는 변수 xspeed, yspeed가 있다. 한번 반복할 때마다 공을 (xspeed, xspeed) 만큼 움직이는 것으로 하자.
공을 움직여보자. def move(self): # Ball을 이동시키는 함수 self.canvas.move(self.id, self.xspeed, self.yspeed) (x1, y1, x2, y2) = self.canvas.coords(self.id) # 공의 현재 위치를 얻는다. (self.x, self.y) = (x1, y1) if x1 <= 0 or x2 >= WIDTH: # 공의 x좌표가 음수이거나 오른쪽 경계를 넘으면 self.xspeed = - self.xspeed # 속도의 부호를 반전시킨다.
움직이는 볼을 여러 개 만들어 보자. 앞 절에서 작업한 내용을 가지고 화면에 공을 여러 개를 만들고 움직여 보자. 이번에는 공의 크기와 색상도 다양 하게 변경하여 본다. 공의 속도도 난수로 설정된다.
공을 움직여보자. color_list = [ "yellow", "green", "blue", "red", "orange", "pink", "grey", "black" ] # 공들이 저장되는 리스트를 만든다. balls_list = [] # 10번 반복하면서 Ball 클래스의 객체를 생성하여 리스트에 저장한다. for i in range(10): color = random.choice(color_list) size = random.randrange(10, 100) xspeed = random.randrange(1, 10) yspeed = random.randrange(1, 10) balls_list.append(Ball(canvas, color, size, 0, 0, xspeed, yspeed)) # 리스트에 저장된 각각의 공들을 이동시킨다. while True: for ball in balls_list: ball.move() window.update() time.sleep(0.03)
간단한 게임 작성 #1 tkinter만을 사용하여 간단한 게임을 제작해보자. 왼쪽에 녹색 원이 있고 오른쪽에 빨강색 원이 있다. 녹색원에서 포를 쏘아서 빨강색 원을 맞추는 게임이다. 빨강색 원은 위아래로 움직인다.
간단한 게임 작성 #1 from tkinter import * import time import random class Ball: def __init__(self, canvas, color, size, x, y, xspeed, yspeed): self.canvas = canvas # 캔버스 객체 self.color = color # Ball의 색상 self.size = size # Ball의 크기 self.x = x # Ball의 x좌표 self.y = y # Ball의 y좌표 self.xspeed = xspeed # Ball의 수평방향 속도 self.yspeed = yspeed # Ball의 수직방향 속도 self.id = canvas.create_oval(x, y, x+size, y+size, fill=color) def move(self): # Ball을 이동시키는 함수 self.canvas.move(self.id, self.xspeed, self.yspeed) (x1, y1, x2, y2) = self.canvas.coords(self.id) # 공의 현재 위치를 얻는다. (self.x, self.y) = (x1, y1) if x1 <= 0 or x2 >= WIDTH: # 공의 x좌표가 음수이거나 x좌표가 오른쪽 경계를 넘으면 self.xspeed = - self.xspeed # 속도의 부호를 반전시킨다. if y1 <= 0 or y2 >= HEIGHT: # 공의 x좌표가 음수이거나오른쪽 경계를 넘으면 self.yspeed = - self.yspeed # 속도의 부호를 반전시킨다.
간단한 게임 작성 #2 마우스 버튼이 눌리면 포를 발사하도록 하자. 포탄도 Ball 클래스를 이용하여 생성한다.
간단한 게임 작성 #2 bullets = [] def fire(event): bullets.append(Ball(canvas, 10, "red", 100, 200, 10, 0)) ... canvas.bind("<Button-1>", fire)
이번 장에서 배운 것 tkinter를 이용하여 간단한 게임을 작성해보았다.. 클래스를 이용하여 공을 표현하였다. 이벤트를 사용하여 사용자의 입력을 처리하였다. 리스트를 사용하여 포탄을 저장하였다.
Q & A