如何同时移动多只乌龟?

Cod*_*ner 5 python turtle-graphics python-turtle

我有一项任务,要求将两只乌龟放在赛道上(大小相同但赛道不同)。我可以让它们移动,但只有当第一个移动了一半轨道时,第二个才会移动。我不知道如何让乌龟同时移动。这是我的代码:

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()
Run Code Online (Sandbox Code Playgroud)

cdl*_*ane 4

有几种方法可以解决这个问题。

使用该screen.ontimer()事件的一种方法(请参阅海龟文档)。这种方法很好,因为您可以将海龟调整为实际时钟时间,并且这可以在海龟事件循环内运行,以便其他事件也可以发生(例如exitonclick())。

我下面使用的方法是将海龟运动分解为 Python生成器内的微小步骤,该生成器在每次运动后都会产生结果。这使我们能够在海龟之间交替。比赛在海龟事件循环之前进行,因此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()
Run Code Online (Sandbox Code Playgroud)

快乐赛车!