Измерьте расстояние между черепахами - PullRequest
0 голосов
/ 27 мая 2020

Я участвую в гонке черепах в Python, где мы должны заново изобрести базовый код. Моя идея заключалась в том, чтобы создать подиум и поставить 3 первых победителя. Мне удалось поставить первого победителя на пьедестал почета, но теперь я не знаю, как измерить расстояние между черепахами и узнать, кто на втором и третьем местах. Любые идеи? Это окончательный результат: конец игры

while True:
    turtle_winner = choice([maria, jaquina, toino, celeste, tia])
    turtle_winner.forward(randint(1, 5))
    if turtle_winner.xcor() > 70:
        break
turtle_winner.shapesize(3)
screen.ontimer(winner_podium, 250)

Ответы [ 4 ]

1 голос
/ 27 мая 2020

Вот минимальный пример того, как вы могли бы это сделать. В качестве демонстрации я создал несколько черепах со случайными позициями. Обратите внимание, что я дал атрибуты имени черепах, иначе ваше положение будет просто именами самих объектов, что не очень удобно для чтения. Важная часть состоит в том, как отсортировать список черепах по их атрибуту xcor на предпоследней строке.

from random import random

class Turtle:
    def __init__(self, name):
        self.xcor = random()
        self.name = name

a = Turtle('a')
b = Turtle('b')
c = Turtle('c')
d = Turtle('d')
e = Turtle('e')

turtles = [a,b,c,d,e]
final_standings = [t.name for t in sorted(turtles, key=lambda turtle: turtle.xcor)]

print(final_standings)

Вывод:

['d', 'c', 'b', 'e', 'a']

Надеюсь, это должно начать работу.

0 голосов
/ 15 июня 2020

Вам просто нужно создать функцию, когда каждая черепаха финиширует перед break, и только когда все они закончат sh, появится подиум. Вам также понадобится список мест.

places = []

def onFinish(turtleName):
    places.append(turtleName)

Вам просто нужно ввести имя черепахи в функцию, затем она перечислит их все с 1-го по последнее, что вы можете использовать для подиума.

0 голосов
/ 28 мая 2020

Я мог бы go об этом использовать словарь вместо переменных верхнего уровня, чтобы содержать поле бегунов:

from turtle import Turtle
from operator import itemgetter
from random import randint

STARTING_POINT = (0, 0)

RUNNERS = ["Maria", "Jaquina", "Toino", "Celeste", "Tia"]

def show_winners(field):
    return sorted(((turtle.distance(STARTING_POINT), name) for name, turtle in field.items()), key=itemgetter(0), reverse=True)

field = {runner: Turtle() for runner in RUNNERS}

for turtle in field.values():  # simulate a race for example purposes
    turtle.forward(randint(10, 100))

print(show_winners(field))

ВЫХОД

% python3 test.py
[(75.0, 'Celeste'), (53.0, 'Toino'), (52.0, 'Maria'), (44.0, 'Tia'), (24.0, 'Jaquina')]
%

Результаты включают расстояния, чтобы вы могли видеть, что он работает. Если вам нужны только имена, вы можете упростить код в соответствии со строками решения @ SimonR (+1):

def show_winners(field):
    return sorted(field, key=lambda name: field[name].distance(STARTING_POINT), reverse=True)

И выбросить import из itemgetter (который был только для того, чтобы избежать ошибка в случае с ie.)

% python3 test.py
['Toino', 'Jaquina', 'Tia', 'Maria', 'Celeste']
%
0 голосов
/ 27 мая 2020

Попробуйте следующее:

print(Turtle1.distance(Turtle2))
...