Как переместить несколько черепах в цикле for?

Итак, я недавно начал изучать python, и для моего класса мне поручили создать гонку черепах с 10 черепахами, которые все движутся и должны останавливаться на финише. Мне дали указания составить список для черепах и иметь цикл while, чтобы заставить их перемещаться на случайную величину, и вложенный цикл if для проверки победителя. У меня возникли проблемы с перемещением всех черепах одновременно, когда я запускаю свой код, он перемещает черепах одну за другой, а не все вместе, есть идеи?

import turtle as trtl
import random as rand
zoomers = []
zom = [0,1,2,3,4,5,6,7,8,9]
tloc = -130
trtl.penup()
trtl.goto(-150, 150)
trtl.pendown()
trtl.goto(-150,-140)
trtl.penup()
trtl.goto(180,150)
trtl.pendown()
trtl.goto(180,-140)
trtl.hideturtle()
for z in zom:
  zoom = trtl.Turtle("turtle")
  zoom.penup()
  zoom.goto(-150,-tloc)
  tloc += 25
  robux = rand.randrange(0,20)
  zoomers.append(zoom)
  for n in zoomers:
    cash = 0
    while cash < 100:
      zoom.forward(robux)
      cash = cash + 1
    if zoom.xcor() == 180:
      print("We have a winner!")
      break```

person angelthesaiyan    schedule 14.11.2020    source источник
comment
Вы предполагаете, что они движутся параллельно, например. если две черепахи доберутся до финиша в одной и той же итерации цикла, они обе победители? или он будет идти по порядку, например, побеждает та черепаха, которая первой найдет порог   -  person Ironkey    schedule 14.11.2020
comment
Укажите ожидаемый минимальный воспроизводимый пример. Покажите, где промежуточные результаты отличаются от ожидаемых. Мы должны иметь возможность скопировать и вставить непрерывный блок вашего кода, выполнить этот файл и воспроизвести вашу проблему вместе с отслеживанием выходных данных для проблемных точек. Это позволяет нам проверить наши предложения на ваших тестовых данных и желаемом результате. Это не делает то, что я хочу, в данном случае недостаточно.   -  person Prune    schedule 14.11.2020
comment
Не совсем понятно, как вы ожидаете, что это сработает. Кажется, вы написали около 30 строк кода, прежде чем протестировать его. Пожалуйста, правильно опишите свой подход: кажется, что ваши тройные вложенные циклы (for-for-while) работают против желаемого результата. Ваш цикл while — это просто цикл из 100 итераций; что ты делаешь, и почему ты не использовал for? Я боюсь, что решение описанной вами проблемы потребует написания основной части вашей программы для вас, что выходит за рамки данной статьи.   -  person Prune    schedule 14.11.2020
comment
Я должен использовать оператор while, чтобы заставить их двигаться вперед на случайную величину, а цикл while, равный 100, — это то, что я поставил, что, вероятно, будет изменено на что-то более низкое.   -  person angelthesaiyan    schedule 14.11.2020


Ответы (5)


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

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

import turtle as trtl
import random as rand

zoom1 = trtl.Turtle()
zoom2 = trtl.Turtle()
zoom3 = trtl.Turtle()

zoomers = [zoom1, zoom2, zoom3]

for zoom in zoomers:
  zoom.penup()

zoom1.goto(-150, 150)
zoom2.goto(-120, 150)
zoom3.goto(-90, 150)

for zoom in zoomers:
  zoom.pendown()
  zoom.right(90)

for zoom in zoomers:
  robux = rand.randrange(10,50)
  zoom.forward(robux)

Изменить: вам нужен неблокирующий код, чтобы черепашки двигались одновременно и независимо друг от друга. Вы можете сделать это, используя многопоточность. Попробуйте это .

person Ritwik Tiwari    schedule 14.11.2020
comment
@AnnZen Я думаю, что нужно одновременно перемещать черепах, реализовывать многопоточность и запускать этих черепах? Потому что запуск их всех в цикле блокирует следующую черепаху. Можете ли вы предложить что-то более простое? - person Ritwik Tiwari; 14.11.2020
comment
Да, но обновление экрана на каждой итерации точное. Проблема в том, что все те же черепахи двигаются одна за другой, их движение не является независимым друг от друга. Кстати, нашел это< /а> - person Ritwik Tiwari; 14.11.2020

Прямого способа сделать это нет, но вот следующая лучшая вещь.

Создайте черепаху Screen. Установите для его tracer() значение 0 и обновляйте экран в каждом повторение цикла. Это может быть слишком быстро, поэтому импортируйте sleep из модуля time, чтобы немного замедлить работу.

Минимальный пример:

from turtle import Turtle, Screen
from random import randrange
from time import sleep

wn = Screen()
wn.tracer(0)

t1 = Turtle('turtle')
t2 = Turtle('turtle')

t1.penup()
t2.penup()

t1.goto(-100, 50)
t2.goto(-100, -50)

while True:
    sleep(0.1)
    t1.forward(randrange(0, 20))
    t2.forward(randrange(0, 20))
    wn.update()
person Ann Zen    schedule 14.11.2020

Все остальные решения до сих пор перемещают черепах на случайное расстояние за фиксированный интервал времени. Давайте изменим это и переместим черепах на постоянное расстояние в случайном временном отрезке:

from turtle import Turtle, Screen
from random import randrange

def run(turtle):
    turtle.forward(5)

    if turtle.xcor() < half_width:
        screen.ontimer(lambda: run(turtle), randrange(20, 150))

screen = Screen()

half_width = screen.window_width() / 2
lane_width = 20

for order, color in enumerate(['red', 'green', 'blue']):
    turtle = Turtle('turtle')
    turtle.speed('fastest')
    turtle.color(color)
    turtle.penup()

    turtle.goto(-half_width, (order | 1) * lane_width)
    lane_width *= -1
    run(turtle)

screen.exitonclick()
person cdlane    schedule 16.11.2020

Мы можем смоделировать это, даже не используя библиотеку turtle:

import random

twerbles = list(zip(range(10), [0]*10)) #list of turtles all starting at position 0 (numbered 0-10)
finishline = 10 #the threshold they must pass

while True:
    twerbles = [(twerble, position+random.randint(1,2)) for twerble, position in twerbles] #move each turtle up a random amount.

    print(twerbles) #this can be removed if you dont want to see their positions as they go

    winners = [twerble for twerble, position in twerbles if position >= finishline] #list of turtles that passed the threshold (if any)
    if winners: print(winners); break #if there are winners print them and stop looping
[(0, 1), (1, 2), (2, 1), (3, 2), (4, 1), (5, 2), (6, 1), (7, 1), (8, 1), (9, 2)]
[(0, 2), (1, 3), (2, 2), (3, 3), (4, 2), (5, 4), (6, 3), (7, 3), (8, 3), (9, 3)]
[(0, 4), (1, 5), (2, 4), (3, 4), (4, 4), (5, 6), (6, 5), (7, 5), (8, 4), (9, 5)]
[(0, 5), (1, 7), (2, 6), (3, 5), (4, 6), (5, 8), (6, 6), (7, 7), (8, 5), (9, 6)]
[(0, 6), (1, 8), (2, 8), (3, 6), (4, 7), (5, 9), (6, 7), (7, 9), (8, 7), (9, 7)]
[(0, 8), (1, 9), (2, 10), (3, 7), (4, 9), (5, 11), (6, 8), (7, 11), (8, 8), (9, 9)]

[2, 5, 7] #winning turtles

переезд с черепахами

import turtle as trtl
import random

finishline = 30

twerbles = [(trtl.Turtle("turtle"), 0) for i in range(10)]

for i,(twerble,position) in enumerate(twerbles):
  twerble.penup()
  twerble.goto(-150,150 - i*25)

while True:
    twerbles = [(twerble, position+random.randint(1,2)) for twerble, position in twerbles]

    for twerble, position in twerbles:
        twerble.forward(position)

    winners = [twerble for twerble, position in twerbles if position >= finishline]
    if winners:
        break
person Ironkey    schedule 14.11.2020

Вам нужно создать коллекцию черепах. Циклическое движение (один шаг) для каждой черепахи, пока черепаха не закончит.

Попробуйте этот код:

import turtle as trtl
import random as rand
zoomers = []
zom = [0,1,2,3,4,5,6,7,8,9]
tloc = -130
trtl.penup()
trtl.goto(-150, 150)
trtl.pendown()
trtl.goto(-150,-140)
trtl.penup()
trtl.goto(180,150)
trtl.pendown()
trtl.goto(180,-140)
trtl.hideturtle()

zoomers = [trtl.Turtle("turtle") for z in zom]

for i,t in enumerate(zoomers):
  t.penup()
  t.goto(-150,150 - i*25)


for i,z in enumerate(zom):
  zoom = zoomers[i]   #trtl.Turtle("turtle")
  tloc += 25
#  zoomers.append(zoom)

running = True
while running:
    for zoom in zoomers:
      robux = rand.randrange(0,20)
      zoom.forward(robux)
      if zoom.xcor() >= 180:
        print("We have a winner!")
        running = False
        break

input('Press enter to exit...')
person Mike67    schedule 14.11.2020