2016-10-14 4 views
0

안녕하세요 저는 경주 트랙 (같은 크기이지만 별도 트랙)에서 두 거북을 설정하도록 요청받은 과제가 있습니다. 나는 그들을 움직일 수 있지만 두 번째는 첫 번째가 트랙의 절반을 움직일 때만 움직인다. 나는 거북이를 동시에 움직이는 방법을 모르겠다. 여기에 내 코드가있다. 그것에 대해 알고 싶다면 저를 도와주세요. 고맙습니다!동시에 여러 거북이를 비단뱀으로 움직이는 방법?

import turtle 
import random 
import time 


wn = turtle.Screen() 
wn.bgcolor("lightgreen") 

t = turtle.Turtle() 
t.shape('turtle') 
t.color('red') 

t2 = turtle.Turtle() 
t2.shape('turtle') 
t2.color('blue') 

#user input function 

p = float(input('please insert the perimeter:')) 

#set the track 
def drawTrack(p,r): 
    shortside = (p/2.0)/(r+1) 
    longside = r*shortside 
    turtle.setup((shortside*2)+60, longside +40) 
    t.penup() 
    t2.penup() 
    t.setposition(-shortside-10, -longside/2) 
    t2.setposition(10, -longside/2) 
    for i in range (2): 
     #first track 
     t.speed(1) 
     t.pendown() 
     t.forward(shortside) 
     t.left(90) 
     t.forward(longside) 
     t.left(90) 

     #second track 
     t2.speed(1) 
     t2.pendown() 
     t2.forward(shortside) 
     t2.left(90) 
     t2.forward(longside) 
     t2.left(90) 

drawTrack(p,2) 

wn.exitonclick() 

답변

2

여기에 대해서는 몇 가지 방법이 있습니다.

screen.ontimer() 이벤트를 사용하는 한 가지 방법 (거북이 문서 참조). 이 방법은 거북이를 실제 시계 시간으로 조정할 수 있고 거북 이벤트 루프 내에서 실행할 수있어 다른 이벤트도 발생할 수 있으므로 (예 : exitonclick()) 좋습니다.

아래에서 사용한 접근법은 거북 모션을 파이썬 생성자 내부의 작은 스텝으로 분해하여 동작 할 때마다 발생합니다. 이것은 우리가 거북 사이를 번갈아 가도록 해줍니다. 경주는 거북 이벤트 루프 이전에 발생하므로 exitonclick()은 경기가 끝날 때까지 유효하지 않습니다.

차동 속도를 제공하기 위해 거북선 드로잉 속도를 모션 계산의 일부로 사용 했으므로 turtle1.speed("fast")이라고 말하면 turtle2.speed("slow")에 비해 빠르게 이동합니다. 무작위 및/또는 다양한 속도를 사용하여이 문제를 해결할 수있는 다른 방법이 있습니다.

내가 대화 상자로 주변의 프롬프트를 변경하고했습니다 다양한 스타일의 비틀기 :

from turtle import Turtle, Screen 

screen = Screen() 
screen.bgcolor("lightgreen") 

turtle1 = Turtle(shape='turtle') 
turtle1.color('red') 
turtle1.speed("slow") # = 3 
turtle1.penup() 

turtle2 = Turtle(shape='turtle') 
turtle2.color('blue') 
turtle2.speed(4) # "slow" (3) < 4 < "normal" (6) 
turtle2.penup() 

# user input function 

perimeter = screen.numinput("Track Perimeter", "Please enter the perimeter:", default=2000, minval=500, maxval=3000) 

def full_track_crawl(turtle, shortside, longside): 
    speed = turtle.speed() 
    turtle.pendown() 

    for j in range (2): 
     for i in range(0, int(shortside), speed): 
      turtle.forward(speed) 
      yield(0) 
     turtle.left(90) 
     for i in range(0, int(longside), speed): 
      turtle.forward(speed) 
      yield(0) 
     turtle.left(90) 

    turtle.penup() 

# set the track 
def drawTrack(perimeter, ratio): 
    shortside = (perimeter/2.0)/(ratio + 1) 
    longside = ratio * shortside 

    screen.setup(shortside * 2 + 60, longside + 40) 

    turtle1.setposition(-shortside - 10, -longside/2) 
    turtle2.setposition(10, -longside/2) 

    generator1 = full_track_crawl(turtle1, shortside, longside) 
    generator2 = full_track_crawl(turtle2, shortside, longside) 

    while (next(generator1, 1) + next(generator2, 1) < 2): 
     pass 

drawTrack(perimeter, 2) 

screen.exitonclick() 

해피 경주!

+0

회신 해 주셔서 감사합니다. – CodeLearner

+0

수익 (0), 다음 (발전기 1, 1) + 다음 (발전기 2, 1) <2) : 이 통과하는 동안 코드 줄을 설명해 주실 수 있습니까? 브라켓의 # 1은 무엇을 의미합니까? – CodeLearner

+0

@ CodeLearner, 여기에 약간의 속임수가 있습니다. 발전기는 0을 산출하거나 결과가 부족합니다. 'next (..., 1)'에 대한 선택적인 두 번째 인수는 생성기의 결과가 떨어지면 반환해야하는 것이다. 그래서, 두 개의'next()'문장의 합이 2가 될 때까지, 생성자 중 하나는 여전히 결과를 산출하고 있습니다. 나는. 적어도 하나의 거북이가 여전히 경주를하고 있으므로 계속 발전기를 가동하십시오. – cdlane

관련 문제