Как добавить позиционные условия для черепахи в Python? - PullRequest
0 голосов
/ 21 января 2019

Я хочу добавить такое условие, что если какой-либо из черепах в гонке пересекает финишную черту или указанную позицию, цикл автоматически заканчивается там. Это гоночная программа, в которой участвуют 4 черепахи, перемещаясь на произвольные расстояния по очереди. Поэтому я хотел бы код, который позволил бы мне завершить цикл поворота, как только одна из черепах попадет на последнюю строку. Я пытался использовать его в цикле, но это не сработало; Я надеюсь, что кто-нибудь сможет исправить мой код.

ЗДЕСЬ МОЙ КОД ::::

from turtle import *

from random import randint

from turtle import position

penup ()
speed (10)
goto (-140, 125)

for step in range (11) :
  write (step, align = "center")
  right (90)
  forward (10)
  pendown ()
  forward (150)
  penup ()
  backward (160)
  left (90)
  forward (20)

aaa = Turtle()
aaa.color ("red")
aaa.shape ("turtle")
aaa.penup ()
aaa.goto (-150, 100)
aaa.pendown ()

bbb = Turtle()
bbb.color ("blue")
bbb.shape ("turtle")
bbb.penup ()
bbb.goto (-150, 60)
bbb.pendown ()

ccc = Turtle()
ccc.color ("yellow")
ccc.shape ("turtle")
ccc.penup ()
ccc.goto (-150, 20)
ccc.pendown ()

ddd = Turtle()
ddd.color ("green")
ddd.shape ("turtle")
ddd.penup ()
ddd.goto (-150, -20)
ddd.pendown ()

for turn in range (1) :
  aaa.right(360)
  bbb.left(360)
  ccc.right(360)
  ddd.left(360)

for turn in range (70) :
  aaa.forward(randint(1, 5))
  bbb.forward(randint(1, 5))
  ccc.forward(randint(1, 5))
  ddd.forward(randint(1, 5))

1 Ответ

0 голосов
/ 22 января 2019

Этот вопрос несколько более интересен, чем кажется на первый взгляд, поскольку в нем есть одна довольно тривиальная, а другая немного более сложная часть.

Мне нужен код, который позволил бы мне завершить цикл поворота, как только одна из черепах попадет на последнюю строку.

Так как финишная линия - это последняя линия, нарисованная в цикле 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
...