Python海龟在边界内的随机行走

4
我想用海龟制作一个程序,使其随机移动50次,移动方向和距离都是随机的,并保持在x和y轴上的-300到300范围内(当达到边界时,通过向相反方向旋转并向前移动来保持在范围内)。
当if语句为真时,代码运行良好,但有时由于超出边界而执行else语句时,else语句会一遍又一遍地执行,直到计数达到50。换句话说,它沿着同一条线来回移动。我不明白为什么,因为当海龟反弹后,它应该位于边界内并再次运行if语句,而不是else语句。如何修复此问题,使海龟在反弹后继续其随机行走?谢谢。
以下是我的代码:
import turtle
import random

count = 0
while count <51:
    count += 1
    if (turtle.xcor() >-300 and turtle.xcor() <300) and\
       (turtle.ycor() >-300 and turtle.ycor() <300):
        turtle.forward(random.randint(30,100))
        turtle.right(random.randint(0,360))
    else:
        turtle.right(180)
        turtle.forward(300)

发生的情况是它返回到窗口,然后旋转180度,沿着原路返回,并重复此过程,直到计数达到50。相反,我希望它在返回到窗口后(执行if语句),选择一个随机角度和距离,但它不断执行else语句。 - MissWizify
一个小提示:你可以使用“-300 < turtle.xcor() <300”来简化if条件。 - fredtantini
2个回答

5
在if语句中,你应该先转向再前进:
假设你在 (0,299) ,海龟面朝上,你将前进 (比如说100),然后转向(比如向左)。然后你将会在 (0, 399) ,面朝左。
接着你将进入else循环,向右/300,所以仍然超出范围(请注意,forward(300)可能太多了)。
如果你先转向再前进,你真的会绕个大圈。
但再次提醒,300可能太多了。我宁愿使用类似以下的方法来保存之前的距离:
if (-300 < turtle.xcor() <300) and (-300 < turtle.ycor() <300):
    turtle.right(random.randint(0,360))
    distance = random.randint(30,100) 
    turtle.forward(distance)
else:
    turtle.right(180)
    turtle.forward(distance)

假设您在(299, 299)处,以135° 的角度向上/左前进100步。那么您会发现y>300,如果您掉头向后走300步,您将会到达x>300。然后再进行循环操作。


2
是的,这确实很有道理,我没有想到过这种方式,而且我发现很难想象。感谢您的解释,这正是我在寻找的,现在运行得非常完美,非常感谢。 - MissWizify
@MissWizify 很高兴我能帮到你。 - fredtantini

1

你尝试过在if语句中交换turtle.forward(random.randint(30,100))turtle.right(random.randint(0,360))的顺序吗?

感觉你是先走出界,然后转向。然后进入else语句,再次转向,继续朝着越界区域走去。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接