以前のプログラム (ランダムに歩き、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
両方のタートルを同じ場所に送り、テキストを出力する別の関数を書きました(誰かが不思議に思っているなら、それはすべてのように内部の冗談です)私が思いついた反転名) if collide(t,u)
returns True
. 実行すると、テキスト DID が出力され、衝突検出が適切に機能していることがわかります...しかし、ループはどういうわけか、タートルが衝突したときに停止する必要があることを Python に伝えていません。これは機能です:
def raul(t,u,w):
t.goto(1,1)
u.goto(1,1)
if collide(t,u):
t.write('RAUL SUNTASIG')
これで、なぜ機能しないのかについてのアイデアが得られますか?