如何在python中同时移动多个海龟?
嗨,我有一个任务,要求在一条赛道上放置两只乌龟(大小相同但不同的赛道)。我可以让他们移动,但第二个移动时,只有第一个移动了一半的轨道。我不知道如何让海龟同时移动。这是我的代码,如果你有任何想法,请帮助我。谢谢大家!如何在python中同时移动多个海龟?,python,turtle-graphics,Python,Turtle Graphics,嗨,我有一个任务,要求在一条赛道上放置两只乌龟(大小相同但不同的赛道)。我可以让他们移动,但第二个移动时,只有第一个移动了一半的轨道。我不知道如何让海龟同时移动。这是我的代码,如果你有任何想法,请帮助我。谢谢大家! import turtle import random import time wn = turtle.Screen() wn.bgcolor("lightgreen") t = turtle.Turtle() t.shape('turtle') t.color('red')
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()
有几种方法可以解决这个问题 使用
screen.ontimer()
事件的一种方法(请参阅文档)。这种方法很好,因为您可以根据实际时钟时间调整turtle,这可以在turtle事件循环中运行,以便也可以发生其他事件(如exitonclick()
)
我在下面使用的方法是在Python生成器中将海龟的运动分解为小步,每一步运动后都会生成一个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()
从海龟导入海龟,屏幕
screen=screen()
屏幕颜色(“浅绿色”)
turtle1=海龟(shape='Turtle')
套头衫1.颜色(“红色”)
套头衫1.速度(“慢”)#=3
turtle1.penup()
turtle2=海龟(shape='Turtle')
套头衫2.颜色(“蓝色”)
套头衫2.速度(4)#“慢”(3)<4<“正常”(6)
turtle2.penup()
#用户输入功能
周长=screen.numinput(“跟踪周长”,“请输入周长:”,默认值=2000,最小值=500,最大值=3000)
def全航迹爬网(乌龟、短边、长边):
速度=乌龟。速度()
乌龟
对于范围(2)内的j:
对于范围内的i(0,int(短边),速度):
乌龟。前进(速度)
收益率(0)
乌龟。左(90)
对于范围内的i(0,int(长边),速度):
乌龟。前进(速度)
收益率(0)
乌龟。左(90)
乌龟
#设定轨道
def牵引轨道(周长、比率):
短边=(周长/2.0)/(比率+1)
长边=比率*短边
屏幕设置(短边*2+60,长边+40)
套头衫1.设置位置(-短边-10,-长边/2)
turtle2.设置位置(10,-长边/2)
发电机1=全轨道爬网(套头衫1、短边、长边)
发电机2=全轨道爬网(套头衫2、短边、长边)
而(next(generator1,1)+next(generator2,1)<2):
通过
绞车轨道(周长,2)
screen.exitonclick()
赛车快乐 我让海龟们每次重复移动一个微小的增量,这样它们之间的最大距离只有1个像素:
# Setup
import turtle
screen = turtle.Screen()
screen.bgcolor("white")
screen.title("Turtle Movement")
screen.setup(width=500, height=500)
# Object 1 set up
obj1 = turtle.Turtle()
obj1.color("red") # Sets obj1's colour
obj1.speed(0) # The drawing speed will go as fast as it can if it is set to zero
obj1.penup() # Don't want it to draw a line as I goes to 0, -50
obj1.goto(0, -50) # goes to 0, -50
obj1.pendown() # Now we want it to draw
# Object 2 set up
obj2 = turtle.Turtle()
obj2.color("blue") # sets obj2's colour
obj2.speed(0) # The drawing speed will go as fast as it can if it is set to zero
obj2.penup() # Don't want it to draw a line as I goes to 0, -50
obj2.goto(0, 50) # goes to 0, 50
obj2.pendown() # Now we want it to draw
# Movement of objects
while True: # infinite loop
obj1.forward(1) # Moves obj1 forwards by 1
obj2.forward(1) # Moves obj2 forwards by 1
# Notes
# -----
# The smaller the 'Movement amount' is,
# e.g forward(Movement amount is in here)
# the smoother the movement gets, but you will lose speed.
# I encourage you to tweak the values and experiment!
希望对你有帮助 感谢您的回复,您能否解释代码行:yield(0),while(next(generator1,1)+next(generator2,1)<2):pass。括号中的#1是什么意思?@CodeLearner,这里有点诡计。生成器要么产生0,要么耗尽结果。
next(…,1)
的可选第二个参数是我们希望在生成器没有结果时返回的参数。因此,在两个next()
语句之和等于2之前,其中一个生成器仍在生成结果。也就是说,至少有一只海龟还在比赛中,所以请继续调用生成器。谢谢您的回复。我已经搜索了收益率和生成器的含义,但我不确定它们是什么。下一个(…,1),下一个(…,1)