我做了这样,乌龟画了一个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()
来控制乌龟撞到墙壁时的作用。我在这做错了什么?或者让乌龟远离墙壁的更好方法是什么?
解释不同:乌龟撞到左墙和顶墙时不转,为什么?我该如何解决?
答案 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)