본문 바로가기
ETC

[python] turtle, 세마리의 거북이 충돌없이 이동하기

by 안주형 2021. 10. 24.

구현 사항

스크린샷 2021-10-02 오후 9 48 32

동작 화면

https://github.com/dkswnkk/DongA-Univ/tree/main/python

 

GitHub - dkswnkk/DongA-Univ: 🍊 DongA-Univ. - 학교 학습 내용

🍊 DongA-Univ. - 학교 학습 내용. Contribute to dkswnkk/DongA-Univ development by creating an account on GitHub.

github.com

 

코드

import turtle
import math
from random import randint, random


# 랜덤으로 거북이 이동 하기
def move_random(my_cute_turtle):
    flag = True
    my_cute_turtle.left(randint(-45, 45))   # 거북이의 각도를 -45~45 사이의 랜덤 값으로 바꿔준다.
    forward_rand = randint(0, 10) # 거북이가 얼마나 이동할지 0~10 사이의 랜덤 값을 정한다.
    for z in range(0, 3, 1):    # 거북이가 총 세마리 이므로 모든 거북이를 비교한다.
        for i in range(z + 1, 3, 1):
            # 두 점의 좌표를 구하는 공식을 이용하여 두 거북이의 거리를 구한다.
            d = math.sqrt(math.pow(turtles[z].xcor() - turtles[i].xcor(), 2) + math.pow(
                turtles[z].ycor() - turtles[i].ycor(), 2))
            if d > 45:  # 만약 두 거북이의 거리가 45이상 차이가 난다면 무시한다.
                continue
            else:   # 만약 두 거북이의 거리가 45 이하일 경우
                flag = False
                turtles[z].setheading(turtles[i].heading()) # 그 거북이의 각도(머리방향)을 거리가 45이하인 다른 거북이랑 똑같은 방향으로 지정한다.
                turtles[z].forward(forward_rand)    # 랜덤으로 이동한다.
                break
    if flag:    # 거북이가 화면의 스크린을 벗어나는지 판단하는 부분이다.
        if abs(my_cute_turtle.xcor() + forward_rand) < 220 and abs(my_cute_turtle.ycor() + forward_rand) < 220:
            my_cute_turtle.forward(forward_rand)    # 거북이가 화면 스크린을 벗어나지 않는다면 랜덤으로 현재 머리방향으로 거리를 이동한다.
        else:  # 만약 스크린을 벗어날 위험이 있을경우
            my_cute_turtle.setheading(my_cute_turtle.towards(0, 0)) # 거북이의 머리방향을 중앙을 향하도록하고
            my_cute_turtle.forward(11)  # 이동한다.
    else:
        return


# 거북이 초기 이동하기
def init_goto(my_cute_turtle, x, y):
    my_cute_turtle.penup()
    my_cute_turtle.goto(x, y)

# 초기 거북이 값 설정.
def init_random_turtle(x, y):
    my_cute_turtle = turtle.Turtle()
    my_cute_turtle.shape('turtle')  # 모양을 거북이로 설정
    init_goto(my_cute_turtle, x, y) # 랜덤 좌표로 초기 거북이의 위치를 설정해준다.
    my_cute_turtle.setheading(randint(0, 359))  # 랜덤으로 거북이의 각도를 설정해준다.
    my_cute_turtle.speed(0)
    my_cute_turtle.color(random(), random(), random())  # 랜덤으로 거북이의 색상을 지정해준다.
    return my_cute_turtle

if __name__ == "__main__":
    turtle.title("거북이 충돌없이 이동하기")
    my_cute_turtle = turtle.Turtle()
    my_cute_turtle.hideturtle()  # 화살표 숨기기

    turtles = []

    # 거북이 초기 생성
    for cnt in range(3):
        turtles.append(init_random_turtle(randint(-250,250), randint(-250,250)))

    while True:
        for my_cute_turtle in turtles:
            move_random(my_cute_turtle)

댓글