본문 바로가기

프로그램언어/파이썬

거북이가 서로 만나게 하기

거북이가 세마리는 서로 만날 때가지 화면을 임의로 돌아다닌다. 세 마리 중 서로 만나는 거북이가 있다면 움직임을 멈추고 모든 거북이를 세배로 키운다.

 

소스코드

import turtle

import math

import random

 

## 전역 변수 선언 부분 ##

t1, t2, t3 = [None] * 3

t1X, t1Y, t2X, t2Y, t3X, t3Y = [0] * 6

swidth, sheight = 300, 300

 

## 메인 코드 부분 ##

if __name__ == "__main__" :

    turtle.title('거북이 만나기')

    turtle.setup(width = swidth + 50, height = sheight + 50)

    turtle.screensize(swidth, sheight)

 

    t1 = turtle.Turtle('turtle'); t1.color('red'); t1.speed(10); t1.penup()

    t2 = turtle.Turtle('turtle'); t2.color('green'); t2.speed(10); t2.penup()

    t3 = turtle.Turtle('turtle'); t3.color('blue'); t3.speed(10); t3.penup()

 

    t1.goto(-100, -100); t2.goto(0, 0); t3.goto(100, 100)

 

    while True:

        angle = random.randrange(0, 360)

        dist = random.randrange(1, 50)

        t1.left(angle); t1.forward(dist)

        angle = random.randrange(0, 360)

        dist = random.randrange(1, 50)

        t2.left(angle); t2.forward(dist)

        angle = random.randrange(0, 360)

        dist = random.randrange(1, 50)

        t3.left(angle); t3.forward(dist)

 

        ## xcor() : 거북이의 현재 x좌표 반환, ycor() : 거북이의 현재 y좌표 반환 ##

        t1X = t1.xcor(); t1Y = t1.ycor()

        t2X = t2.xcor(); t2Y = t2.ycor()

        t3X = t3.xcor(); t3Y = t3.ycor()

 

## 거북이끼기 거리가 20미만이면 만난 것으로 처리 ##

## 두 거북이의 거리는 (x2 -x1)의 제곱 + (y2-y1)의 제곱으로 계산 ##

        if math.sqrt(((t1X - t2X) * (t1X - t2X)) + ((t1Y - t2Y) * (t1Y - t2Y))) <= 20 or \

           math.sqrt(((t1X - t3X) * (t1X - t3X)) + ((t1Y - t3Y) * (t1Y - t3Y))) <= 20 or \

           math.sqrt(((t2X - t3X) * (t2X - t3X)) + ((t2Y - t3Y) * (t2Y - t3Y))) <= 20 :

            t1.turtlesize(3); t2.turtlesize(3); t3.turtlesize(3)

 

turtle.done()

 

거북이 세 마리가 화면을 돌아다니다가 서로 만나면 만난 위치에 도장을 찍고 계속 움직이는 프로그램을 작성하시오. 프로그램은 무한 반복된다. 거북이가 화면 밖으로 나가면 다시 각자의 처음 위치로 이동 [ 거북이1은 -100, -100에 거북이2는 0, 0에 거북이3은 100, 100으로 이동]

 

소스코드

import turtle

import math

import random

 

## 전역 변수 선언 부분 ##

t1, t2, t3 = [None] * 3

t1X, t1Y, t2X, t2Y, t3X, t3Y = [0] * 6

swidth, sheight = 300, 300

 

         

## 메인 코드 부분 ##

if __name__ == "__main__" :

    turtle.title('거북이 만나기')

    turtle.setup(width = swidth + 50, height = sheight + 50)

    turtle.screensize(swidth, sheight)

 

    t1 = turtle.Turtle('turtle'); t1.color('red'); t1.speed(10); t1.penup()

    t2 = turtle.Turtle('turtle'); t2.color('green'); t2.speed(10); t2.penup()

    t3 = turtle.Turtle('turtle'); t3.color('blue'); t3.speed(10); t3.penup()

 

    t1.goto(-100, -100); t2.goto(0, 0); t3.goto(100, 100)

 

    while True:

        angle = random.randrange(0, 360)

        dist = random.randrange(1, 50)

        t1.left(angle); t1.forward(dist)

        angle = random.randrange(0, 360)

        dist = random.randrange(1, 50)

        t2.left(angle); t2.forward(dist)

        angle = random.randrange(0, 360)

        dist = random.randrange(1, 50)

        t3.left(angle); t3.forward(dist)

 

        ## xcor() : 거북이의 현재 x좌표 반환, ycor() : 거북이의 현재 y좌표 반환 ##

        t1X = t1.xcor(); t1Y = t1.ycor()

        t2X = t2.xcor(); t2Y = t2.ycor()

        t3X = t3.xcor(); t3Y = t3.ycor()

 

        ## 거북이가 화면 밖으로 나가면 처음 위치로 설정 ##

        if not((-swidth / 2 <= t1X and t1X <= swidth / 2) and (-sheight / 2 <= t1Y and t1Y <= sheight / 2)):

            t1.goto(-100, -100)

        if not((-swidth / 2 <= t2X and t2X <= swidth / 2) and (-sheight / 2 <= t2Y and t2Y <= sheight / 2)):

            t2.goto(0, 0)

        if not((-swidth / 2 <= t3X and t3X <= swidth / 2) and (-sheight / 2 <= t3Y and t3Y <= sheight / 2)):

            t3.goto(100, 100)

 

## 거북이끼기 거리가 20미만이면 만난 것으로 처리 ##

## 두 거북이의 거리는 (x2 -x1)의 제곱 + (y2-y1)의 제곱으로 계산 ##

        if math.sqrt(((t1X - t2X) * (t1X - t2X)) + ((t1Y - t2Y) * (t1Y - t2Y))) <= 20 :

            t1.stamp(); t2.stamp()

        elif math.sqrt(((t1X - t3X) * (t1X - t3X)) + ((t1Y - t3Y) * (t1Y - t3Y))) <= 20 :

            t1.stamp(); t3.stamp()

        elif math.sqrt(((t2X - t3X) * (t2X - t3X)) + ((t2Y - t3Y) * (t2Y - t3Y))) <= 20 :

            t2.stamp(); t3.stamp()

 

turtle.done()