Turtle Game 4 - 울타리 안에서 못 벗어나게 하기

 

 

Turtle Game 4 - 울타리 안에서 못 벗어나게 하기

 

앞선 강좌에서 화면 안에 울타리를 그려보았다.

 

하지만 여전히 거북이는 울타리 밖으로 나갈 수 있다. 이번에는 거북이가 울타리 밖으로 나가지 못하도록 하는 코드를 추가해 본다.

 

 

1. 울타리의 개념

 

저번 강좌에서 그린 울타리는 한 좌표에서 다른 좌표로 선을 그린 것 뿐이다. 

 

이 선을 구성하는 것은 각 점이며, 각 점은 좌표를 가진다. 아래 그림을 보자.

 

오른쪽 울타리 - 검은색 선을 생각해본다.

 

오른쪽 울타리는 오른쪽 위(300, 300)에서 오른쪽 아래(300, -300)까지 이어진 선이다.

 

그리고 이 선을 4등분하여 나오는 점을 표시하면, 위쪽에서 아래쪽으로 각 점의 좌표는 아래와 같다.

 

(300, 300)

(300, 150)

(300, 0)

(300, -150)

(300, -300)

 

좌표 값을 보면 X축의 값은 300으로 고정되어 있고, Y축의 값만 변한다.

 

따라서 오른쪽 울타리(검은색 선)는 X축의 값이 300이고 Y축의 값은 300 ~ -300인 점의 모임이라고 할 수 있다.

 

같은 방식으로 왼쪽 울타리는 X축의 값이 -300이고, Y축의 값이 300 ~ -300인 점의 모임이 된다.

 

 

 

2. 거북이와 울타리의 관계

 

우리의 주인공 거북이는 화면 내에서 어디든지 돌아다닐 수 있다.

 

우리의 목표는 이 거북이가 울타리 밖으로 못 나가게 하는 것이다. 

 

거북이를 울타리 밖으로 못나가게 한다는 것을 프로그램적으로 말하면 거북이가 울타리로 그려진 선의 좌표를 넘지 못하게 한다는 것이 된다.

 

1번의 그림에서 나오는 오른쪽 울타리를 생각해보자. 이 오른쪽 울타리의 X좌표 값은 300이다. Y축의 좌표 값이 얼마가 되던, 오른쪽 울타리의 X좌표 값은 300으로 고정되어 있다.

 

이 것을 이용하며 생각해보면, 거북이가 오른쪽 울타리를 넘지 않는다는 것은 결국 거북이의 X좌표가 300이상 넘어가지 못하게 한다는것이 된다.

 

Turtle 객체의 좌표(coordinates) xcor() ycor()메서드로 구할 수 있다.

 

즉, 거북이의 X좌표값은 p.xcor() 이며, Y좌표 값은 p.ycor()가 된다.

 

 

 

3. 거북이를 울타리 안에 가두기

 

1번과 2번의 로직에서 거북이와 울타리의 관계를 알아내었다. 

 

이제 거북이를 울타리 밖으로 나가지 못하는 코드를 작성해보자.

 

1) 오른쪽 울타리 못 넘게 하기

 

거북이의 X좌표 값은 p.xcor() 이다.

오른쪽 울타리의 X좌표 값은 300이다.

 

따라서 거북이의 X좌표값이 300보다 크게되면 반대방향으로 방향을 회전하게 만든다.

 

if p.xcor() > 300:

    p.right(180)

 

 

2) 왼쪽 울타리 못 넘게 하기

 

쪽 울타리의 X좌표 값은 -300이다.

 

따라서 거북이의 X좌표값이 -300보다 작게되면 반대방향으로 방향을 회전하게 만든다.

 

if p.xcor() < -300:

    p.right(180)

 

 

3) 위쪽 울타리 못 넘게 하기

 

거북이의 Y좌표 값은 p.ycor() 이다.

위쪽 울타리의 Y좌표 값은 300이다.

 

따라서 거북이의 Y좌표값이 300보다 크게되면 반대방향으로 방향을 회전하게 만든다.

 

if y.xcor() > 300:

    p.right(180)

 

 

4) 아래쪽 울타리 못 넘게 하기

 

아래쪽 울타리의 Y좌표 값은 -300이다.

 

따라서 거북이의 Y좌표값이 -300보다 작게되면 반대방향으로 방향을 회전하게 만든다.

 

if y.xcor() < -300:

    p.right(180)

 

 

1), 2)번 코드를 합치고, 3) 4)번 코드를 합치면 아래와 같다.

 

if p.xcor() > 300 or p.xcor() < -300:
    p.right(180)
    
if p.ycor() > 300 or p.ycor() < -300:
    p.right(180)

 

 

매우 긴 설명(?)에 비해 코드는 매우 단순하다. 좌표와 선과의 관계 개념을 정확하게 이해하기 위한 긴 설명이라 생각하자~

 

이제 이전에 작성했던 코드에 추가해본다.

 

울타리를 넘지 못하게 하는 코드는 while True: 구문 안에 존재해야 한다.

 

완성된 코드를 추가한 전체 코드는 아래와 같다.

import turtle as t

 

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

 

#울타리 그리기
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()

 

#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)

 

 

실행 결과

# 방향키를 이용하여 거북이를 마음대로 움직여 보자.

# 아래 캡쳐된 이미지는 울타리 밖으로 나가지 못하는 것을 보여주기 위해 거북이의 penup()을 주석처리하여 실행한 결과이다.

 

 

 

Turtle Game 4 - 울타리 안에서 못 벗어나게 하기 끝

+ Recent posts