我必须编写一个程序,其中一只乌龟需要90度转弯,在屏幕周围随机选择左右,直到它撞到墙壁,转180度然后回到屏幕上走动。当它撞到墙壁4次时,循环终止。我遇到的问题是,当它从墙上反弹时它就会停止行走,并且循环已经明显终止,因为我可以通过点击它来关闭窗口(wn.exitonclick
)。这是完整的计划:
import turtle
import random
def isInScreen(w,t):
leftBound = w.window_width() / -2
rightBound = w.window_width() / 2
bottomBound = w.window_height() / -2
topBound = w.window_height() / 2
turtlex = t.xcor()
turtley = t.ycor()
stillIn = True
if turtlex < leftBound or turtlex > rightBound or turtley < bottomBound or turtley > topBound:
stillIn = False
return(stillIn)
def randomWalk(t,w):
counter = 0
while isInScreen(w,t) and counter < 4:
coin = random.randrange(0,2)
if coin == 0:
t.left(90)
else:
t.right(90)
t.forward(50)
t.left(180)
t.forward(50)
counter = counter+1
wn = turtle.Screen()
wn.bgcolor('lightcyan')
steklovata = turtle.Turtle()
steklovata.color('darkslategray')
steklovata.shape('turtle')
randomWalk(steklovata,wn)
wn.exitonclick()
我很困惑为什么它会停止,考虑到一旦乌龟反弹回来,它的x和y坐标符合isInScreen(w,t)的要求为真,从而回到步行。有什么想法吗?
编辑:接受Sukrit的答案,因为它最容易与我已编程的内容相关,并给了我一些关于其他内容的指示,但Brian的答案也非常有用,我接受两者如果有可能。非常感谢你们两个人!
答案 0 :(得分:3)
您的counter = counter + 1
错了。当您的isInScreen
返回False
时,while循环中断并且代码结束,因为,计数器正在递增,但您不会再次循环。请参阅以下代码 -
import turtle
import random
def isInScreen(w,t):
leftBound = w.window_width() / -2.0
rightBound = w.window_width() / 2.0
bottomBound = w.window_height() / -2.0
topBound = w.window_height() / 2.0
turtlex = t.xcor()
turtley = t.ycor()
if turtlex < leftBound or turtlex > rightBound or turtley < bottomBound or turtley > topBound:
return False
return True
def randomWalk(t,w):
counter = 0
while True:
while isInScreen(w,t):
coin = random.randrange(0,2)
if coin == 0:
t.left(90)
else:
t.right(90)
t.forward(50)
t.left(180)
t.forward(50)
counter += 1
if counter == 4:
break
wn = turtle.Screen()
wn.bgcolor('lightcyan')
steklovata = turtle.Turtle()
steklovata.color('darkslategray')
steklovata.shape('turtle')
randomWalk(steklovata,wn)
wn.exitonclick()
PS - 如果stillIn
条件评估为if
,则只需True
,您就不需要存储return False
的变量,如果它不是return True
。 (上述代码中反映的变化)。
答案 1 :(得分:2)
作为嵌套循环的替代方法并避免一些冗余语句,以下内容应该与Sukrit的答案产生相同的结果。
def randomWalk(t,w):
counter = 0
while counter < 4:
if not isInScreen(w,t):
t.left(180)
counter += 1
else:
coin = random.randrange(0,2)
if coin == 0:
t.left(90)
else:
t.right(90)
t.forward(50)
核心问题是确保isInScreen
返回false不会导致while循环终止,同时也会在循环体内递增counter
。
答案 2 :(得分:0)
你的大回路有失败的原因,你知道。所以你可以做的是使while循环只检查计数器而不是作为while循环的一部分进行isInScreen()。现在检查你是否可以前进,你可以通过在跳跃之前查看作弊,即将50的值添加到当前位置并检查你是否会在屏幕中,如果不是前进,否则尽可能接近你可以,增加碰撞计数器,然后转身。或者,Sukrit Kalra的答案可能更容易实现。