蟒蛇龟 - 试图获得在矩形中移动无限的乌龟

时间:2014-10-07 04:18:58

标签: python python-2.7 coordinates turtle-graphics

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"必须在矩形中无限远,但在我的程序龟转向左一次然后乌龟不见墙。哪里有问题。

3 个答案:

答案 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