Axwts
В прикрепленном файле изображено два пути по которым двигаются стрелочки.Они состоят из прямых ( | ) и (-), кривых ( /и \)
Лучше, конечно, реализовать не именно эту “трассу” (и только её), а “любую трассу, нарисованную таким образом”.
Но тогда возникает вопрос. На рисунке “/” соединяет направления вниз и вправо в одном случае и вверх и влево в другом. А если нарисовать подходы со всех сторон – будет так же направлять?
Axwts
Стрелочки движутся с одинаковой скоростью. они по очереди двигаются по одному шагу за раз. Они делают это в зависимости от своего текущего местоположения : сначала перемещаются стрелочки в верхнем ряду …
А какая разница, в каком порядке они ходят, если результат вы видите уже после того, как передвинуты все стрелки? Надо будет держать информацию о стрелках не в виде “'>' в строке, описывающей трассу”, хотя бы для поворотов в нужную сторону. Т.е. это требование выглядит странно.
Axwts
Если стрелочки сталкиваются, то ничего не происходит и они дальше продолжают движение.
А если две стрелки пойдут по одному пути? Встретятся на пересечении и обе повернут на одну ветку. Скорее всего тоже “ничего не происходит”, но мало ли.
Решение:
Будем кодировать направление движения строками ‘N’,' S', ‘E’, ‘W’ - north, south, east, west (на север, на юг, на восток, на запад). Это чтоб не путать с лево/право при поворотах.
Направление поворота на пересечении: ‘L’, ‘F’, ‘R’ - left, forward, right (влево, прямо, вправо).
Далее создаём класс/словарь (смотря что уже проходили) стрелки с определёнными полями. Лучше класс, чуть чище код будет.
Стрелка:
direction - направление движения. строка: N|S|E|W
y, x - координаты.
turn - направление следующего поворота. строка: ‘L’ | ‘F’ | ‘R’
Функция “повернуть”. Аргумент: стрелка
Из turn и direction получает новое direction
Кладёт в turn “следующее” значение.
Карта: массив со строками, как на рисунке.
Изображения стрелок с карты надо убрать и заменить соответствующей “дорогой”.
#
map = '''
/---⌝
| | /----⌝'''
map = map.replace('⌝', '\\').split('\n')[1:]
Тут первые две строки карты (надо доделать).
\ в строке кодируется как “\\”. Это неудобно при таком вот “рисовании” (картинка расползётся), поэтому для начала закодируем \ как ‘⌝’. А потом заменим.
Далее режем map на строчки, это чтобы было удобно обращаться к клеткам:
И отбрасываем первую пустую строку.
Правила: словарь с характеристиками возможных клеток.
ключи: ‘-’, ‘|’, ‘\\’, ‘/’, ‘+’
значение: словарь, содержащий информацию о клетке:
ключи: четыре направления движения из клетки: ‘N’, ‘S’, ‘E’, ‘W’.
значение:
Если движение из клетки в этом направлении возможно, то True.
Далее вспоминаем, что \ и / меняют направление движения. Если в клетку / заходят с направлением движения N, то уйдут в направлении E. Закодируем это новым направлением движения.
Ну а если движение в таком направлении невозможно, то False.
Пример:
rule['-'] = {'N':False, 'S':False, 'E': True, 'W': True}
Функция “шагнуть”. Аргумент: стрелка.
Проверяем, не на пересечении ли стоим:
#
cell = map[arrow.y][arrow.x]
if cell == '+'
Если пересечение: поворот, перемещение.
Если нет и
rule[cell][arrow.direction] == True
то перемещение в направлении arrow.direction. Иначе перемещение в направлении
rule[cell][arrow.direction]
Функция “перемещение”. Аргументы: стрелка, направление.
поменять координаты у стрелки.
Функция “вывод на экран” Аргументы: карта, массив стрелок.
Рисует текущую позицию. Стрелку, видимо, выводит как одно из ∧∨<>.
Вот и весь алгоритм. Остаётся создать “карту” и “стрелки”.