Turtle Game 6 - 벌레 잡아먹기

 

 

Turtle Game 6 - 벌레 잡아먹기

 

앞선 강좌에서 거북이와 벌레를 만들어 울타리속에서 움직이도록 만들었다.

 

이번에는 거북이가 벌레를 잡아먹는 동작을 구현해보도록 한다.

 

 

1. 거북이가 벌레를 잡아먹는 로직

 

거북이가 벌레를 잡아먹는것을 어떻게 표현할까?

 

현실적으로 보면 거북이가 벌레를 먹는 것은 입을 벌려 벌레를 입속에 집어 넣는 것이다.

 

Turtle 모듈의 거북이는 입도 없고, 입을 벌려서 벌레를 먹는 것을 구현할 수 없다. 그래서 거북이가 벌레를 먹는다는 것은 거북이가 벌레와 만나는 것으로 생각한다.

 

 

 

그렇다면 거북이와 벌레가 만나는 것은 어떻게 구현할까?

 

거북이는 객체이다. 벌레도 객체이다. 두 객체의 위치는 좌표로 나타낼 수 있다.

 

따라서, 두 객체가 만난다는 것을 프로그램적으로 생각하면, 움직이는 두 객체의 좌표가 같을 때 만났다고 할 수 있다.

 

하지만, 움직이는 두 객체의 좌표가 일치되기는 힘들다. 특히 우리는 거북이 게임을 통해 거북이가 벌레를 잡아먹는 것을 구현하려고 하는데, 거북이와 벌레의 좌표가 일치되어어야만 벌레를 먹은 것으로 생각한다면 벌레 한마리 잡아먹기가 매우 힘들 것이다. 

 

따라서 거북이와 벌레의 좌표가 일치되지는 않더라도  두 객체의 거리가 일정 값 이하가 되면 만났다고 생각하여 거북이가 벌레를 먹은것으로 한다.

 

그렇다면 두 객체의 거리는 어떻게 구할 수 있을까?

 

두 객체의 거리는 점과 점사이의 거리 또는 좌표간의 거리를 구하는 공식으로 구할 수 있다.

 

점과 점사이의 거리 구하는 공식은 다음 링크에서 확인한다.  https://www.jbmpa.com/python_tip/10

 

 

1) 거북이가 벌레의 거리를 통해 벌레를 잡아먹은 효과 구현

# for count in range(maxBugs):  구문 안에 입력

# math를 사용하기 위해서 import math 를 추가함

#두 점의 거리 구하기

d = math.sqrt( math.pow(p.xcor() - bugs[count].xcor(), 2) + math.pow(p.ycor() - bugs[count].ycor(), 2))

 

#두 점과의 거리가 0일때 일치, 서로간의 거리가 20정도 되면 먹은 것으로 생각
if d < 20:
    print("벌레 먹음")
else:

    #벌레 못 먹음 
    pass

 

 

전체 코드

import turtle as t
import random
import math

 

#스크린 객체 생성
screen = t.Screen()
#스크린 배경색 지정
screen.bgcolor("lightgreen")
screen.tracer(2)

 

#울타리 그리기
mypen = t.Turtle()
mypen.penup()
mypen.setposition(-300, 300)
mypen.pendown()
mypen.pensize(3)

for x in range(4):
    mypen.forward(600)
    mypen.right(90)
mypen.hideturtle()


#Create bugs 
maxBugs = 20
bugs = []
colors = ['red','blue','purple','white','black', 'pink'
,'#FFFF00']
shapes = ['arrow', 'blank', 'circle', 'classic', 'square', 'triangle']

 

for count in range(maxBugs):
    c = random.randint(0,6)
    s = random.randint(0,5)
    bugs.append(t.Turtle())
    bugs[count].color(colors[c])
    bugs[count].shape(shapes[s])
    bugs[count].penup()
    bugs[count].speed(0)
    bugs[count].setposition(random.randint(-300, 300), random.randint(-300, 300))
    bugs[count].right(random.randint(0,360))

 

#Turtle 객체 p 생성
p = t.Turtle()
#p 객체의 모양을 거북이로 만들기
p.shape("turtle")
#p 객체 크기 설정
p.turtlesize(2,2)
#p 객체 색상 설정, 
#색상은 색상 이름 또는 색상 코드(#FFFFFF) 등을 이용하여 설정 할 수 있다.
p.color("blue")
#거북이를 따라다니는 선을 제거
#p.penup()

#거북이의 움직임 속도
speed = 1

 

def turnleft():
    p.left(30)

 

def turnright():
    p.right(30)

 

def increasespeed():
    global speed
    speed += 1

 

def decreasespeed():
    global speed
    speed -= 1

 

screen.listen()
screen.onkey(turnleft, "Left")
screen.onkey(turnright, "Right")
screen.onkey(increasespeed, "Up")
screen.onkey(decreasespeed, "Down")


while True:
    p.forward(speed)
    
    #울타리 체크
    if p.xcor() > 300 or p.xcor() < -300:
        p.right(180)
    
    if p.ycor() > 300 or p.ycor() < -300:
        p.right(180)
        
    
    #다수의 벌레 움직이기
    for count in range(maxBugs):        
        
        bugs[count].forward(5)
    
        #울타리 체크
        if bugs[count].xcor() > 300 or bugs[count].xcor() < -300:
            bugs[count].right(180)
            #soundBounce()
                    
        if bugs[count].ycor() > 300 or bugs[count].ycor() < -300:
            bugs[count].right(180)    
   

        #두 점의 거리 구하기
        d = math.sqrt( math.pow(p.xcor() - bugs[count].xcor(), 2) + math.pow(p.ycor() - bugs[count].ycor(), 2))

        #두 점과의 거리가 0일때 일치, 서로간의 거리가 20정도 되면 먹은 것으로 생각
        if d < 20:
            print("벌레 먹음", count)
        else:        
            #벌레 못 먹음 
            pass

 

 

 

 

2. 거북이가 벌레를 먹은 이후 동작 구현

 

위에서 거북이가 벌레를 먹은 것을 표현하기 위해 거북이와 벌레가 만났을 때, 즉 두 객체의 좌표간의 거리를 구하여 구현하였다.

보통 게임에서 두 객체의 거리를 구하는 것을 많이 사용하는데, 만난다는 표현보다는 "두 객체의 충돌"이라는 표현을 많이 사용한다.

이후에는 우리도 충돌이라는 용어를 사용하도록 한다.

 

이번에는 거북이와 벌레가 충돌이후, 다양한 동작들을 구현해보도록 한다.

 

1) 거북이와 충돌후 벌레의 위치 옮기기

 

거북이가 벌레를 먹고 난 뒤, 벌레가 계속 움직이면 좌표간의 거리때문에 여러번 먹은 것이 될 수 있다. 따라서 거북이와 벌레가 충돌하면 바로 벌레의 위치를 옮겨보도록 하자.

벌레의 위치를 옮길 때, 벌레의 모양과 색상도 변경한다.

 

벌레 위치 옮기기

#두 점의 거리 구하기
d = math.sqrt( math.pow(p.xcor() - bugs[count].xcor(), 2) + math.pow(p.ycor() - bugs[count].ycor(), 2))

 

#두 점과의 거리가 0일때 일치, 서로간의 거리가 20정도 되면 먹은 것으로 생각
if d < 20:

    #벌레가 먹히면 색상, 모양 변경후 다른 곳으로 이동
    bugs[count].setposition(random.randint(-300, 300), random.randint(-300, 300))
    bugs[count].right(random.randint(0,360))
    s = random.randint(0,5)
    c = random.randint(0,6)
    bugs[count].shape(shapes[s])        
 
   bugs[count].color(colors[c])
else:        
    #벌레 못 먹음 
    pass

 

 

 

전체 코드

import turtle as t
import random
import math

 

#스크린 객체 생성
screen = t.Screen()
#스크린 배경색 지정
screen.bgcolor("lightgreen")
screen.tracer(2)

 

#울타리 그리기
mypen = t.Turtle()
mypen.penup()
mypen.setposition(-300, 300)
mypen.pendown()
mypen.pensize(3)

 

for x in range(4):
    mypen.forward(600)
    mypen.right(90)


mypen.hideturtle()


#Create bugs 
maxBugs = 20
bugs = []
colors = ['red','blue','purple','white','black', 'pink'
,'#FFFF00']
shapes = ['arrow', 'blank', 'circle', 'classic', 'square', 'triangle']

 

for count in range(maxBugs):
    c = random.randint(0,6)
    s = random.randint(0,5)
    bugs.append(t.Turtle())
    bugs[count].color(colors[c])
    bugs[count].shape(shapes[s])
    bugs[count].penup()
    bugs[count].speed(0)
    bugs[count].setposition(random.randint(-300, 300), random.randint(-300, 300))
    bugs[count].right(random.randint(0,360))

 

#Turtle 객체 p 생성
p = t.Turtle()
#p 객체의 모양을 거북이로 만들기
p.shape("turtle")
#p 객체 크기 설정
p.turtlesize(2,2)
#p 객체 색상 설정, 
#색상은 색상 이름 또는 색상 코드(#FFFFFF) 등을 이용하여 설정 할 수 있다.
p.color("blue")
#거북이를 따라다니는 선을 제거
#p.penup()

#거북이의 움직임 속도
speed = 1

 

def turnleft():
    p.left(30)

 

def turnright():
    p.right(30)

 

def increasespeed():
    global speed
    speed += 1

 

def decreasespeed():
    global speed
    speed -= 1

 

screen.listen()
screen.onkey(turnleft, "Left")
screen.onkey(turnright, "Right")
screen.onkey(increasespeed, "Up")
screen.onkey(decreasespeed, "Down")


while True:
    p.forward(speed)
    
    #울타리 체크
    if p.xcor() > 300 or p.xcor() < -300:
        p.right(180)
    
    if p.ycor() > 300 or p.ycor() < -300:
        p.right(180)
        
    #다수의 벌레 움직이기
    for count in range(maxBugs):        
        
        bugs[count].forward(5)
    
        #울타리 체크
        if bugs[count].xcor() > 300 or bugs[count].xcor() < -300:
            bugs[count].right(180)
            #soundBounce()
            
        if bugs[count].ycor() > 300 or bugs[count].ycor() < -300:
            bugs[count].right(180)    
   

        #두 점의 거리 구하기
        d = math.sqrt( math.pow(p.xcor() - bugs[count].xcor(), 2) + math.pow(p.ycor() - bugs[count].ycor(), 2))

        #두 점과의 거리가 0일때 일치, 서로간의 거리가 20정도 되면 먹은 것으로 생각
        if d < 20:
            #벌레가 먹히면 색상, 모양 변경후 다른 곳으로 이동
            bugs[count].setposition(random.randint(-300, 300), random.randint(-300, 300))
            bugs[count].right(random.randint(0,360))
            s = random.randint(0,5)
            c = random.randint(0,6)
            bugs[count].shape(shapes[s])        
            bugs[count].color(colors[c])
        else:        
            #벌레 못 먹음 
            pass

 

 

 

 

 

실행 결과 - 거북이가 벌레를 먹으면 벌레는 다른 모양과 색상으로 변경되어 다른 곳에서 나타난다.

 

 

Turtle Game 6 - 벌레 잡아먹기 끝

+ Recent posts