Этот вопрос несколько более интересен, чем кажется на первый взгляд, поскольку в нем есть одна довольно тривиальная, а другая немного более сложная часть.
Мне нужен код, который позволил бы мне завершить цикл поворота, как только одна из черепах попадет на последнюю строку.
Так как финишная линия - это последняя линия, нарисованная в цикле for step in range (11) :
, мы можем просто сохранить координату x черепахи (возвращаемую .xcor()
), когда линии нарисованы, и получить последнюю линию. позиция после цикла:
for step in range(11):
…
finish = xcor() # remember where line has been drawn
forward(20)
Одна из черепах, попадающая на финишную черту, означает, что хотя бы одна из координат x черепах достигает finish
; с этим условием нам не нужно предполагать максимальное количество витков и мы можем использовать while
вместо for
loop:
while max(aaa.xcor(), bbb.xcor(), ccc.xcor(), ddd.xcor()) < finish:
aaa.forward(randint(1, 5))
bbb.forward(randint(1, 5))
ccc.forward(randint(1, 5))
ddd.forward(randint(1, 5))
Но теперь, когда мы смотрим на картину в конце гонки, мы видим, что победившие черепахи пересекли финишную черту с центром их тел (потому что центр тела взят как позиция черепахи), хотя черепаха должна скорее победить, как только ее голова достигнет финиша. Таким образом, чтобы сделать это правильно, нам нужно отрегулировать значение finish
, чтобы учесть направление головы относительно центра. Для этого мы можем использовать .get_shapepoly()
, который возвращает текущий многоугольник формы как кортеж пар координат , e. г.
((0, 16), (-2, 14), (-1, 10), (-4, 7), (-7, 9), (-9, 8), (-6, 5), (-7, 1), (-5, -3), (-8, -6), (-6, -8), (-4, -5), (0, -7), (4, -5), (6, -8), (8, -6), (5, -3), (7, 1), (6, 5), (9, 8), (7, 9), (4, 7), (1, 10), (2, 14))
Центр фигуры находится в (0, 0), и возвращаемый многоугольник всегда имеет одинаковую ориентацию, в случае черепахи с головой, направленной вверх, поэтому нам нужна максимальная координата y для корректировки, которая должна быть расположена перед Поворот петли :
# adjust the finish line position for the turtle's head rather than its center
finish -= max([y for x, y in aaa.get_shapepoly()]) # y as head points upwards