【问题标题】:Turtle in python - Trying to get the turtle which move infinity in rectangle蟒蛇中的乌龟 - 试图让乌龟在矩形中无限移动
【发布时间】:2014-12-01 10:27:51
【问题描述】:
import turtle
wn=turtle.Screen()
wn.bgcolor("white")


#-Turtle_box-
alex=turtle.Turtle()
alex.shape("turtle")
alex.speed(10)
alex.pensize(2)
alex.color("red")
#-Turtle_box_end-

#-Turtle_first-
sapa=turtle.Turtle()
sapa.shape("turtle")
sapa.speed(2)
sapa.pensize(2)
sapa.color("red")
#-Turtle_first_end-

#-Var&list-start-
liss=[]
#-Var&list-end-


#-Turtle_box_start-
alex.penup()
alex.forward(300)
alex.left(90)
alex.pendown()

for i in range(300):
    alex.forward(1)
    x=alex.position()
    liss.append(x)
for i in range(3):
    alex.left(90)
    for i in range(600):
        alex.forward(1)
        liss.append(alex.position())
alex.left(90)
for i in range(300):
    alex.forward(1)
    liss.append(alex.position())
#-Turtle_box_end-


#-Turtle_first_start-
for i in range(100000):
    sapa.forward(1)
    if sapa.position() in liss:
        sapa.left(150)

wn.exitonclick

问题:海龟“alex”制作矩形(框)600px*600px,并将所有坐标写入列表liss。然后乌龟 "sapa" 向前走,如果乌龟碰到矩形的墙,他必须向左转 150 度。并且乌龟“sapa”必须在矩形中无限远,但是在我的程序中乌龟向左转一次然后乌龟看不到墙。哪里有问题。

【问题讨论】:

  • “去无穷大”是什么意思?
  • 乌龟沙巴必须撞墙再转150度,然后他往前走,直到再次撞墙再转150度。他必须无限远

标签: python python-2.7 coordinates turtle-graphics


【解决方案1】:

因为 alex 从整数坐标开始绘制一个简单的矩形,每步移动 1 个单位,所以存储在 liss[] 中的所有位置都是整数。但在 sapa 反弹一次 150 度后,他的坐标不再是整数,因此它们不太可能与 liss[] 中的值完全匹配。

解决此问题的方法是使用修改后的位置函数,将坐标四舍五入为int。例如,将此函数放在程序顶部附近:

def int_position(t):
    x, y = t.position()
    return int(x + 0.5), int(y + 0.5)

现在改变你所有的

liss.append(alex.position())

liss.append(int_position(alex))

别忘了修复x=alex.position()liss.append(x)

现在把 sapa 的东西改成

for i in range(100000):
    sapa.forward(1)
    if int_position(sapa) in liss:
        sapa.left(150)

FWIW,在我的程序版本中,我使用了sapa.color("blue") 以便更容易查看发生了什么。

由于您使用的是 Python 2,您应该将 range(100000) 等更改为 xrange(100000),因为它更高效并且使用 更多 更少的 RAM。

【讨论】:

    【解决方案2】:

    由于列表liss 中的所有值都是整数,并且在sapa's 反弹后,所有坐标值都以点为单位(浮点值),因此您需要在将这些值与liss 值进行比较之前将其四舍五入。

    【讨论】:

    • 嗯,我刚刚说过......而且将坐标存储为int 可能在空间方面更有效。
    【解决方案3】:

    要进行无限循环,只需键入:

    while True:
        # your code
    

    【讨论】:

    • 嘿,我觉得删除帖子很粗鲁,但也许您可以将此作为评论添加到@PM2Ring 的答案中?您是对的,他们的答案中缺少这部分,但该答案总体上推动了问题的解决。
    • 嗨,我没有删除任何帖子,我一定是不小心按了删除或什么的。我无意删除可以帮助他人的内容
    • 大声笑我的意思是我的分类选项之一是删除答案。您没有做错任何事情,但请考虑我关于将您的答案作为对已接受答案的评论的其余评论。稍后!
    猜你喜欢
    • 2021-10-01
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 2017-08-09
    • 2022-10-15
    • 2013-07-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多