두근두근 파이썬 수업 7장 프로젝트 I
이번 장에서 만들 프로그램 (1) 거북이 경주 게임을 작성해본다. 난수를 이용하여야 한다. (2) 간단한 애니메이션을 만들어본다
난수 발생하기 난수(random number)는 게임과 시뮬레이션에 필수적이 다. >>> import random >>> random.random() # 0.0부터 1.0보다 작은 실수 난수 0.8345121533431609 >>> random.randint(1, 100) # 1부터 100 사이의 정수 난수 49
리스트에서 랜덤하게 선택 >>> import random >>> random.choice('abcdefghij') # 하나의 랜덤한 항목 'c'
터틀 그래픽 함수들
거북이 경주 게임 #1 거북이 2마리를 만들려면 다음과 같이 한다. import turtle t1 = turtle.Turtle() # 첫 번째 거북이 t2 = turtle.Turtle() # 두 번째 거북이
거북이 경주 게임 #2 거북이들을 구별하기 위하여 색상을 다르게 하고 모양도 다르게 하자. t1.color("pink") 거북이들을 구별하기 위하여 색상을 다르게 하고 모양도 다르게 하자. t1.color("pink") t1.shape("turtle") t1.shapesize(5) t1.pensize(5) t2.color("blue") t2.shape("turtle") t2.pensize(5)
거북이 경주 게임 #3 출발점에 세우기 t1.penup() t1.goto(-300, 0) t2.penup() (0, -500)
거북이 경주 게임 #4 100번 정도 반복하면서 한 번 반복할 때마다 난수만큼 이 동하도록 하자. for i in range(100): # 100번 반복한다. d1 = random.randint(1, 60) # 1부터 60 사이의 난수를 발생한다. t1.forward(d1) # 난수만큼 이동한다. d2 = random.randint(1, 60) # 1부터 60 사이의 난수를 발생한다. t2.forward(d2) # 난수만큼 이동한다.
외부 이미지를 사용하자 import turtle # 터틀 그래픽 모듈을 불러온다. import random # 난수 모듈을 불러온다. screen = turtle.Screen() image1 = "d:\\rabbit.gif" image2 = "d:\\turtle.gif" screen.addshape(image1) screen.addshape(image2) t1 = turtle.Turtle() # 첫 번째 거북이를 생성한다. t1.shape(image1) t2 = turtle.Turtle() # 두 번째 거북이를 생성한다. t2.shape(image2)
전체 소스 import turtle # 터틀 그래픽 모듈을 불러온다. import random # 난수 모듈을 불러온다. screen = turtle.Screen() image1 = "d:\\rabbit.gif" image2 = "d:\\turtle.gif" screen.addshape(image1) screen.addshape(image2) t1 = turtle.Turtle() # 첫 번째 거북이를 생성한다. t1.shape(image1) t1.pensize(5) # 팬의 두께를 5로 한다. t1.penup() # 펜을 든다. t1.goto(-300, 0) # (-300, 0) 위치로 간다.
전체 소스 t2 = turtle.Turtle() # 두 번째 거북이를 생성한다. t2.shape(image2) t2.pensize(5) # 팬의 두께를 5로 한다. t2.penup() # 펜을 든다. t2.goto(-300, -200) # (-300, -100) 위치로 간다. t1.pendown() # 첫 번째 거북이의 펜을 내린다. t2.pendown() # 첫 번째 거북이의 펜을 내린다. t1.speed(1) t2.speed(1)
전체 소스 for i in range(100): # 100번 반복한다. d1 = random.randint(1, 60) # 1부터 60 사이의 난수를 발생한다. t1.forward(d1) # 난수만큼 이동한다. d2 = random.randint(1, 60) # 1부터 60 사이의 난수를 발생한다. t2.forward(d2)
애니메이션 만들기 애니메이션도 쉽게 제작할 수 있다. 다음과 같은 애니메 이션을 작성해보자. 여러분은 이 애니메이션을 자신의 홈 페이지에서 사용하거나 동영상 제작에도 사용할 수 있다.
태극 무늬 그리는 함수 def draw_shape(radius, color1): t.left(270) t.width(3) t.color("black", color1) t.begin_fill() t.circle(radius/2.0, -180) t.circle(radius, 180) t.left(180) t.circle(-radius/2.0, -180) t.end_fill()
태극 무늬 그리는 함수 t= turtle.Turtle() t.reset() draw_shape(200, "red") t.setheading(180) draw_shape(200, "blue")
애스터로이드 게임 우리의 우주선을 충돌시켜서 소행성을 파괴하는 게임인 애스터로이드를 제작하고자 한다. 우리의 우주선은 “거 북이“ 형태로 하자. 소행성은 ”원”으로 한다.
우리 우주선 만들기 import turtle import random import math player = turtle.Turtle() player.color("blue") player.shape("turtle") player.penup() player.speed(0) screen = player.getscreen()
소행성 만들기 a1 = turtle.Turtle() a1.color("red") a1.shape("circle") a1.penup() a1.speed(0) a1.goto(random.randint(-300, 300), random.randint(-300, 300)) a2 = turtle.Turtle() a2.color("red") a2.shape("circle") a2.penup() a2.speed(0) a2.goto(random.randint(-300, 300), random.randint(-300, 300))
이벤트 처리하기 def turnleft(): player.left(30) # 왼쪽으로 30도 회전한다. def turnright(): player.right(30) # 오른쪽으로 30도 회전한다. screen.onkeypress(turnleft, "Left") screen.onkeypress(turnright, "Right") screen.listen()
이동하기 def play(): player.forward(2) # 2픽셀 전진 a1.forward(2) screen.ontimer(play, 10) # 10ms가 지나면 play()를 다시 호출 screen.ontimer(play, 10)
앵그리 터틀 게임 만들기 앵그리 버드와 유사한 게임 “앵그리 터틀”을 제작하여 보 자. 공을 발사하여서 초기 속도와 초기 각도에 의하여 비 행하다가 목표물에 맞으면 성공이다.
많은 변수가 필요하다. int v; - 거북이의 속도이다. int vx; - 거북이의 x 방향 속도이다. int vy; - 거북이의 y 방향 속도이다. int x; - 거북이의 현재 x좌표이다. int y; - 거북이의 현재 y좌표이다.
다음과 같이 가정하자. vx; 초기 속도에서 변하지 않는다. vy; 초기 속도에서 중력 가속도 만큼 점점 느려진다. vy vx
vx, vy의 계산 vx = vx vy = vy - 10
초기 속도 vx = velocity * math.cos(angle * 3.14 / 180.0) vy = velocity * math.sin(angle * 3.14 / 180.0)
소스 코드 import turtle import math player = turtle.Turtle() player.shape("turtle") screen = player.getscreen() def turnleft(): player.left(5) # 왼쪽으로 5도 회전 def turnright(): player.right(5) # 오른쪽으로 5도 회전
소스 코드 def fire(): x = 0 y = 0 velocity = 50 # 초기 속도 50픽셀/sec angle = player.heading() # 초기 각도 vx = velocity * math.cos(angle * 3.14 / 180.0) # 도 -> 라디안 vy = velocity * math.sin(angle * 3.14 / 180.0) # 도 -> 라디안 while player.ycor() >= 0 : # y좌표가 음수가 될 때까지 vx = vx vy = vy - 10 x = x + vx y = y + vy player.goto(x, y) screen.onkeypress(turnleft, "Left") screen.onkeypress(turnright, "Right") screen.onkeypress(fire, "space") # 사용자가 스페이스키를 누르면 screen.listen()