我遇到一个小环,让乌龟在遇到广场角落后转90度。第一个循环很好,但Python似乎忘记在下一个循环中检查条件。
我开始画画
t.setpos(-300,300)
这适用于第一个循环:
for i in range(4):
t.forward(600)
print(t.pos())
if t.pos() > (300,300):
t.right(90)
elif t.pos() > (300,-300):
t.right(90)
elif t.pos() > (-300, -300):
t.right(90)
elif t.pos() > (-300,300):
t.right(90)
但是,当我将range()
增加到5时,代码会忘记检查elif t.pos() > (-300,300):
到t.right(90)
,而是Python继续将t.forward(600)
绘制到此位置:
( - 300.00,900.00)
for i in range(5):
t.forward(600)
print(t.pos())
if t.pos() > (300,300):
t.right(90)
elif t.pos() > (300,-300):
t.right(90)
elif t.pos() > (-300, -300):
t.right(90)
elif t.pos() > (-300,300):
t.right(90)
任何想法为什么Python忘记检查这样的条件?不知怎的,我觉得我在某个地方做错了。
答案 0 :(得分:1)
这是我的解决方案,它可能效率不高,但它可以工作,不知怎的......
if myturtle[count].xcor() > 300 and myturtle[count].heading() == 0:
myturtle[count].right(90)
if myturtle[count].ycor() < -300 and myturtle[count].heading() == 270:
myturtle[count].right(90)
if myturtle[count].xcor() < -300 and myturtle[count].heading() ==180:
myturtle[count].right(90)
if myturtle[count].ycor() > 300 and myturtle[count].heading() == 90:
myturtle[count].right(90)
答案 1 :(得分:1)
看似简单的解决方法是这种比较是落后的:
elif t.pos() > (-300, 300):
它应该是:
elif t.pos() < (-300, 300):
在range(4)
情况下没有看到它的原因是循环在执行之前退出。在range(5)
情况下,它最终执行,反向比较导致失败。
但是,此代码存在严重问题,在您构建时会出现这些问题。虽然您的调试print(t.pos())
语句显示:
(300.00,300.00)
(300.00,-300.00)
(-300.00,-300.00)
(-300.00,300.00)
(-300.00,900.00)
真正发生的事情是:
(300.0, 300.0)
(300.00000000000006, -300.0)
(-299.99999999999994, -300.00000000000006)
(-300.00000000000006, 299.99999999999994)
(-300.00000000000017, 900.0)
您没有看到这一点的原因是因为t.pos()
没有返回通用tuple
,它会返回tuple
{@ 1}}的特化,其中包含Vec2D
通过仅显示两位精度数字来掩盖浮点模糊性的自己的repr()
方法:
def __repr__(self):
return "(%.2f,%.2f)" % self
您可能希望您的条款按顺序触发,但它们不会:
职位:(300.0, 300.0)
跳过第二个条款:elif t.pos() > (300,-300):
职位:(300.00000000000006, -300.0)
跳过第一个条款:if t.pos() > (300,300):
职位:(-299.99999999999994, -300.00000000000006)
跳过第三个条款:elif t.pos() > (-300, -300):
和职位:
(-300.00000000000006, 299.99999999999994)
(-300.00000000000017, 900.0)
不要绊倒任何条款。添加一些print()
语句以说服自己。