Что это?
Перед вами симулятор лабиринтов на базе Excel. Вы можете создавать лабиринты любой сложности и оттачивать на них свои алгоритмы поиска выхода. Я сделал его в качестве развлечения. Получилось довольно забавно.
Правила
Стены легко рисуются при помощи единичек. Остальное сделает условное форматирование.
Точку старта вы определяете сами через активную ячейку.
Кнопка "Старт" запускает ваш алгоритм поиска выхода
Те ячейки, на которых вы побывали в процессе поиска, помечаются зеленым цветом.
Кнопка "Очистка" подготавливает лабиринт к новому забегу.
Если текущая позиция игрока и выход из лабиринта находятся на одной линии, между ними нет преград, а игрок исследует это направление на возможность сделать туда ход, то в этом случае фиксируется нахождение выхода из лабиринта. Вообще же в коде определена константа ExitCondition=100. Если стандартная подпрограмма Can_I_Move(Direction) определяет, что в направлении Direction между текущей позицией игрока и ближайшей преградой (любая константа на листе или его граница) более 100 ячеек, то фиксируется факт выхода за пределы лабиринта, а алгоритм останавливается.
В распоряжении игрока, который хочет написать алгоритм поиска из лабиринта следующие инструменты:
Процедура MyFindExit, которую вы можете использовать в качестве контейнера для своего алгоритма.
Константы направлений движения (direction): dRight = 1, dDown = 2, dLeft = 3 и dUp = 4
Функция Can_I_Move(Direction), которая возвращает ноль, если в направлении Direction находтся стена, либо количество ходов, которое вы можете сделать до ближайшей стены, но не более границы видимости (константа VisibilityLimit = 4)
Функция Was_I_Here(Direction), которая возвращает -1, если вы не ходили раньше на смежную клетку в указанном направлении, 1 - если вы там уже были (сколько раз вы там были узнать возможности нет), 0 - если в этом направлении есть препятствие.
Разрешается создать для нужд алгоритма 2-4 целочисленных переменных и 1-2 логических переменных.
Количество ходов в алгоритме желательно подсчитывать. Алгоритм прекращает работу, если сделано ходов больше, чем в константе IterationsLimit, а выход ещё не найден.
Вы можете прервать работу алгоритма через Ctrl+Break
Пауза между ходами регулируется константой WaitAfterMove, которая по умолчанию равна 50 милисек.
Чего хотелось бы?
Хотелось бы взглянуть на ваши универсальные алгоритмы поиска выхода из лабиринтов. Любых лабиринтов, в которых есть выход. Я написал свой алгоритм, но он получился довольно громоздким. Я оставил его в файле, но рекомендую попытаться написать свой алгоритм. Я знаю, что у вас получится гораздо лучше! Тем более, что наблюдать за процессом поиска выхода довольно занятно. Жду ваших замечательных идей!
Скачать
|