撞到墙后龟不会转身

时间:2018-02-05 22:38:10

标签: python-3.x turtle-graphics

我做了这样,乌龟画了一个200x200的盒子,然后在里面弹跳。但问题是它不会从顶部或左侧墙壁反弹。

t = turtle.Turtle()
s = turtle.Screen()
t.speed(1)

for i in range(4):
    t.forward(200)
    t.left(90)

t.penup()
t.goto(4, 4)
t.seth(r.randint(1, 89))

while 200 > t.xcor() > 0 and 200 > t.ycor() > 0:
    if t.xcor() >= 197:
        t.right(200)
    if t.xcor() <= 3:
        t.seth(r.randint(t.heading(),180))
    if t.ycor() >= 197:
        t.seth(r.randint(t.heading(), 180))
    if t.ycor() <= 3:
        t.left(200)

    t.forward(1)

此代码允许乌龟从右墙和底墙反弹。当它到达左侧或顶部墙壁时,乌龟转向屏幕的左侧并继续离开屏幕。我尝试了setHeading()的随机数字,并尝试使用left()right()来控制乌龟撞到墙壁时的作用。我在这做错了什么?或者让乌龟远离墙壁的更好方法是什么?

解释不同:乌龟撞到左墙和顶墙时不转,为什么?我该如何解决?

2 个答案:

答案 0 :(得分:1)

现在您已解决了问题,请修复您的代码。当你写这样的循环时:

while 200 > t.xcor() > 0 and 200 > t.ycor() > 0:
    if t.xcor() >= 195:

您有效地创建了一个无限循环,因为内部逻辑阻止while条件成为False。就像你说while True:一样。但是你不应该在像乌龟这样的事件驱动环境中说while True:,因为你可以阻止其他事件和可能性。

让我们将您的代码重写为完全由事件驱动的,当我们在其中时,以屏幕为中心:

from turtle import Turtle, Screen
from random import randint

screen = Screen()

turtle = Turtle()
turtle.speed('fastest')

turtle.penup()
turtle.goto(-100, -100)
turtle.pendown()

for _ in range(4):
    turtle.forward(200)
    turtle.left(90)

turtle.penup()
turtle.home()
turtle.setheading(randint(0, 360))

def move():
    if -90 < turtle.xcor() < 90 and -90 < turtle.ycor() < 90:
        pass  # I hate 'if's like this but it's simpler than the alternative
    else:
        turtle.setheading(turtle.heading() + 180 + randint(-45, 45))
        turtle.forward(1)  # extra bump forward to get out of trouble

    turtle.forward(1)
    screen.ontimer(move, 25)

move()
screen.mainloop()

不完美,但你可以看到它得到你想要的动作,而不会锁定你可能想要发生的其他事情(比如键盘事件,通过点击关闭窗口等)。

答案 1 :(得分:0)

事实证明我的数字有点偏离,seth()setHeading()实际上可以达到360.所以当我random.randint(heading(), 180)时它可能找不到值如果heading()大于180.这些修改解决了我的问题。

if t.xcor() >= 195:
        t.seth(150)

    if t.xcor() <= 5:
        t.seth(r.randint(t.heading(),310))

    if t.ycor() >= 195:
        t.seth(r.randint(t.heading(), 300))

    if t.ycor() <= 5:
        t.left(150)