Исходник программы, показывающей пример создания, решения и сохранения лабиринтов разных размеров и форм.
В программе есть настройки для управления размерами «комнат» и количеством комнат по горизонтали и вертикали. Кнопка «Создать» создает случайный путь от S (начало) до E (конец) вместе с рядом тупиковых ложных путей. Кнопка «Дизайн» позволяет определять границы комнат; заблокированные области лабиринта и сохраненные лабиринты могут быть объединены вместе. Дополнительные параметры позволяют настроить цвета и ширину пути. Сгенерированные лабиринты могут быть решены прямо на экране или распечатаны с отображением пути решения (или без него).
Особенности исходного кода
Класс TMaze в отдельном модуле U_TMaze содержит логику для большинства операций лабиринта. Процедура MakeImage генерирует случайный путь через лабиринт от начальной до конечной точки, следя за тем, чтобы он не дублировался сам по себе. Затем вызывается MakeFalsePaths для открытия дополнительных стен путем создания путей, начинающихся под прямым углом к ??пути решения. Опять же, каждый путь должен оставаться независимым от других путей, то есть никогда не сносить последнюю стену, соединяющую два пути. При желании MakeOpenRooms можно вызвать для удаления хотя бы одной стены из оставшихся закрытых комнат, чтобы немного затруднить поиск решения. События мыши TMaze (Mmousedown, Mmousemove и Mmouseup) позволяют пользователю щелкать и / или перетаскивать путь решения. Удивительно, но их было труднее всего отлаживать. Сложность состоит в том, чтобы размер окна программы и окна кода не перекрывался. Это позволяет пошагово выполнять код и наблюдать за результатами на экране без вмешательства отладчика.
Режим «Дизайн» позволяет пользователю создавать лабиринты любого размера и формы. При нажатии на комнаты в режиме дизайна происходит переключение между обычными и «пограничными» комнатами. Щелчок правой кнопкой мыши вызывает всплывающее меню, которое предоставляет другие параметры управления. Вы также можете щелкнуть левой кнопкой мыши, удерживая нажатой клавишу «Shift», чтобы инвертировать прямоугольный диапазон комнат из предыдущего, по которому щелкнули мышью, в текущий.
Объекты TFileStream используются для сохранения и перезагрузки сгенерированных лабиринтов. Во время перезагрузки лабиринты могут быть объединены в текущий лабиринт. Доступен для загрузки набор "буквенных" лабиринтов, из которых можно составить лабиринты из слов или имен. Дети их любят.
Maze также служит примером использования класса Printer и процедур TCanvas Copyrect и Strecthdraw для реализации предварительного просмотра и операций печати. Можно установить поля и добавить текст верхнего и нижнего колонтитула в распечатанные лабиринты. Лабиринты можно масштабировать так, чтобы они помещались на одной странице или на нескольких страницах.