1

そこで、カメが壁にぶつかり、対応する角度で跳ね返る、現実的な跳ね返り機能を作ろうとしています。私のコードは次のようになります。

def bounce(num_steps, step_size, initial_heading):
   turtle.reset()
   top = turtle.window_height()/2
   bottom = -top
   right = turtle.window_width()/2
   left = -right

   turtle.left(initial_heading)
   for step in range(num_steps):
      turtle.forward(step_size)
      x, y = turtle.position()
      if left <= x <= right and bottom <= y <= top:
         pass
      else:
         turtle.left(180-2 * (turtle.heading()))

したがって、これは側壁に対しては機能しますが、上部/下部から正しく跳ね返らせる方法がわかりません。助言がありますか?

4

2 に答える 2

1

次のようなことを試してください:

if not (left <= x <= right):
    turtle.left(180 - 2 * turtle.heading())
elif not (bottom <= y <= top):
    turtle.left(-2 * turtle.heading())
else:
    pass

私のpython構文は少し錆びています、ごめんなさい:P. しかし、水平反転と垂直反転では計算が少し異なります。

編集

何が起こっているのかというと、あなたのカメが上向きで壁の上に引っかかっている状況になっているのではないかと思います. それはそれを無期限に反転させることにつながります。次の条件を追加してみてください。

if (x <= left and 90 <= turtle.heading() <= 270) or (right <= x and not 90 <= turtle.heading() <= 270):
    turtle.left(180 - 2 * turtle.heading())
elif (y <= bottom and turtle.heading() >= 180) or (top <= y and turtle.heading <= 180):
    turtle.left(-2 * turtle.heading())
else:
    pass

これが機能する場合は、コードのどこかにバグがある可能性があります。エッジ処理を正しく行うのは難しいです。turtle.heading() は常に 0 から 360 の間の値を返すと想定しています。

于 2009-09-22T01:02:33.480 に答える
0

今日、

あなたの問題は、あなたが上と下であるため、同じ三角法を使用して左右の壁を計算しているようです。必要なたわみを計算するには、紙と鉛筆で十分です。

def inbounds(limit, value):
    'returns boolean answer to question "is turtle position within my axis limits"'
    return -limit < value * 2 < limit

def bounce(num_steps, step_size, initial_heading):
    '''given the number of steps, the size of the steps 
        and an initial heading in degrees, plot the resultant course
        on a turtle window, taking into account elastic collisions 
        with window borders.
    '''

    turtle.reset()
    height = turtle.window_height()
    width = turtle.window_width()
    turtle.left(initial_heading)

    for step in xrange(num_steps):
        turtle.forward(step_size)
        x, y = turtle.position()

        if not inbounds(height, y):
            turtle.setheading(-turtle.heading())

        if not inbounds(width, x):
            turtle.setheading(180 - turtle.heading())

setheading関数とヘルパー関数 ( ) を使用してinbounds、ここでコードの意図をさらに宣言しました。ある種の doc-string を提供することは、あなたが書くどんなコードでも良い習慣です (それが示すメッセージが正確であることが条件です!!)

あなたのマイレージは、の使用によって異なる場合がありますxrange。Python 3.0+ では、単に に名前が変更されますrange

于 2009-09-22T03:47:19.483 に答える