Gday,
Ваша проблема, кажется, в том, что вы используете ту же тригонометрию для расчета правой и левой стен, так как вы - верх и низ. Кусок бумаги и карандаш должны быть достаточными для расчета требуемых отклонений.
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-строки также является хорошей практикой в любом коде, который вы пишете (при условии, что сообщение, в котором оно указано, является точным!)
Ваш пробег может отличаться при использовании xrange
, Python 3.0+ переименовывает его в range
.