Python中的乌龟试图得到在矩形中无限移动的乌龟

2024-10-16 20:44:54 发布

您现在位置:Python中文网/ 问答频道 /正文

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

问:乌龟“亚历克斯”做一个长方形(盒子)600px*600px,并将所有坐标写在liss列表中。然后乌龟“萨帕”向前走,若乌龟碰到矩形的墙,他必须向左旋转150度。乌龟“萨帕”必须在矩形中无限大,但在我的程序中,乌龟向左拐一次,乌龟就看不到墙了。哪里出问题了。在


Tags: inboxforpositionrangeleftendfirst
2条回答

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

解决这一问题的方法是使用修改后的position函数,该函数将坐标舍入到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的东西改成

^{pr2}$

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

因为您使用的是python2,所以应该将range(100000)etc改为xrange(100000),因为这样更高效,而且使用的RAM更少。在

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

相关问题 更多 >