<p>这里有一个你的代码的重做,我相信它能满足你的需要。我的大多数其他更改都是对代码的简化。一个主要的改变是我抛出了移动海龟的<code>while()</code>循环,并将它们放在自己的计时器上:</p>
<pre><code>import random
from turtle import Turtle, Screen
def moveRandom(wn, t):
coin = random.randrange(0, 2)
[t.left, t.right][coin](90)
t.forward(50)
if not isInScreen(t) or areColliding(t1, t2):
t.undo() # pretend it never happened
t.left(180) # turn around
t.forward(50) # go the other way
wn.ontimer(lambda: moveRandom(wn, t), 100)
def areColliding(t1, t2):
return t1.distance(t2) < 2
def isInScreen(t):
turtleX, turtleY = t.position()
return leftBound < turtleX < rightBound and bottomBound < turtleY < topBound
t1 = Turtle('turtle', visible=False)
t2 = Turtle('circle', visible=False)
wn = Screen()
leftBound, rightBound = -wn.window_width() // 2, wn.window_width() // 2
bottomBound, topBound = -wn.window_height() // 2, wn.window_height() // 2
t1.up()
t1.goto(random.randrange(leftBound, rightBound), random.randrange(bottomBound, topBound))
t1.setheading(random.randrange(0, 360))
t1.showturtle()
t1.down()
t2.up()
t2.goto(random.randrange(leftBound, rightBound), random.randrange(bottomBound, topBound))
t2.setheading(random.randrange(0, 360))
t2.showturtle()
t2.down()
moveRandom(wn, t1)
moveRandom(wn, t2)
wn.exitonclick()
</code></pre>
<p>为了处理这些碰撞,我调用了<code>isInScreen(t)</code>和<code>areColliding(t1, t2)</code>中的<code>moveRandom(wn, t)</code>并简单地撤消移动,如果它导致了碰撞,则转向相反的方向移动。在</p>