Python TurtleGraphics - сглаживание случайных прогулок? - PullRequest
2 голосов
/ 20 сентября 2009

Мне нужна помощь по этому вопросу, касающемуся TurtleGraphics в Python:

Небольшая деталь tipsy_turtle () заключается в том, что когда черепаха поворачивается на 90 градусов, она сразу же "прыгает" в новом направлении. Это заставляет его движение казаться неровным. Может показаться лучше, если бы черепаха двигалась плавно при повороте. Итак, для этого вопроса напишите функцию с именем smooth_tipsy_turtle (), которая аналогична tipsy_turtle (), за исключением того, что вместо использования функции turtle.right (d) напишите совершенно новую функцию с именем smooth_right (d), которая работает следующим образом:

 - If d is negative then
      - repeat the following -d times:
            - turn left 1 using the ordinary turtle.left command

  - Otherwise, repeat the following d times:
          - turn right 1 using the ordinary turtle.right command

Вот моя оригинальная функция для получения случайного движения черепахи:

def tipsy_turtle(num_steps):
    turtle.reset()
    for step in range(num_steps):
       rand_num = random.randint(-1, 1)
       turtle.right(rand_num * 90)
       turtle.forward(5 * random.randint(1, 3))

Итак, как мне сделать эту работу? Я попытался добавить:

   if rand_num*90 < 0:
       for step in range(rand_num*90):
           turtle.left(rand_num*90)
   else:
       turtle.right(rand_num*90)

Но на самом деле это не сработало, и я не знаю, что я сделал не так. Спасибо!

Ответы [ 3 ]

2 голосов
/ 20 сентября 2009

Надеюсь, этот пример прояснит, что пошло не так в вашем примере - вы выполнили либо rand_num*90*rand_num*90 левые повороты, либо rand_num*90 правые повороты!

if rand_num < 0: # don't need to multiply by 90 here - it's either +ve or -ve.
    for step in xrange(90): # xrange is preferred over range in situations like this
         turtle.left(rand_num) # net result is 90 left turns in rand_num direction
else:
    for step in xrange(90):
         turtle.right(rand_num)

Или вы можете написать это как:

for step in xrange(90):
    if rand_num < 0:
        turtle.left(rand_num)
    else:
        turtle.right(rand_num)

Для такого кода это действительно вопрос предпочтения.

0 голосов
/ 20 сентября 2009

Я думаю, что рискну ответить, хотя я не совсем уверен, что вы хотите (см. Мой комментарий к вопросу, и не удивляйтесь, если я отредактирую этот ответ соответствующим образом!).

Предполагая, что вы хотите, чтобы черепаха поворачивалась на определенное количество градусов на каждом шаге, не обязательно на 90, но не более, чем на 90, затем просто используйте rand_num = random.randint(-90, 90) и затем turtle.right(rand_num).

0 голосов
/ 20 сентября 2009

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

turtle left randomly generated value 0 to 90
turtle right randomly generated value 0 to 90
turtle forward some amount

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...