在我掌握了我之前的程序的窍门后(乌龟随机行走并从墙上弹起,直到撞到它们 4 次),我尝试在指南中进行以下练习,它要求两只乌龟具有随机起始位置并四处走动屏幕并从墙壁反弹,直到它们相互碰撞——没有计数器变量来决定它们何时应该停止。我设法写了整个事情,除了它们碰撞和停止的部分:我想出了一个布尔函数,True
如果海龟的 X 和 Y 坐标相同并且False
如果它们不一样,则返回该函数,但它们保持步行和终止程序的唯一方法是强制解释器退出。我究竟做错了什么?
import turtle
import random
def setStart(t):
tx = random.randrange(-300,300,100)
ty = random.randrange(-300,300,100)
t.penup()
t.goto(tx,ty)
t.pendown()
def throwCoin(t):
coin = random.randrange(0,2)
if coin == 0:
t.left(90)
else:
t.right(90)
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 collide(t,u):
if t.xcor() == u.xcor() and t.ycor() == u.ycor():
return True
return False
def randomWalk(t,w):
if not isInScreen(w,t):
t.left(180)
else:
throwCoin(t)
t.forward(100)
def doubleRandom(t,u,w):
while not collide(t,u):
randomWalk(t,w)
if collide(t,u):
break
randomWalk(u,w)
wn = turtle.Screen()
wn.bgcolor('lightcyan')
steklovata = turtle.Turtle()
steklovata.color('darkslategray')
steklovata.shape('turtle')
setStart(steklovata)
catshower = turtle.Turtle()
catshower.color('orangered')
catshower.shape('turtle')
setStart(catshower)
doubleRandom(steklovata,catshower,wn)
wn.exitonclick()
编辑:为了测试错误是在collide(t,u)
函数中还是在while
调用它的循环中,我编写了另一个函数,将两个海龟发送到同一个位置并打印出一些文本(如果有人想知道,这是一个内部笑话,就像每个我想出的翻转名称)如果collide(t,u)
返回True
。当我运行它时,文本 DID 打印出来,这告诉我碰撞检测工作正常......但循环不知何故并没有告诉 Python 海龟在碰撞时应该停止。这是功能:
def raul(t,u,w):
t.goto(1,1)
u.goto(1,1)
if collide(t,u):
t.write('RAUL SUNTASIG')
这是否让你们知道为什么它不起作用?