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
问题:Turtle" alex"使矩形(框)600px * 600px并写入列表liss中的所有坐标。然后是龟" sapa"往前走,如果乌龟碰到长方形墙,他必须向左转150度。和龟" sapa"必须在矩形中无限远,但在我的程序龟转向左一次然后乌龟不见墙。哪里有问题。
答案 0 :(得分:1)
因为亚历克斯从整数坐标开始追踪一个简单的矩形并且每步移动1个单位,所以liss[]
中存储的所有位置都是整数。但是在萨帕一度反弹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
答案 1 :(得分:0)
由于列表liss
中的所有值都是整数,而sapa's
反弹后,所有坐标值都以点(浮点值)为单位,您需要在将这些值与{{{{{ 1}}值。
答案 2 :(得分:0)
要进行无限循环,只需键入:
while True:
# your code