Для определения, можно ли пройти в соседнюю локацию, используется как информация о стенах, так и о номерах «соединенности» (если они у обеих локациях равны, то известно, что путь в другую локацию уже имеется).
Если с какой либо из сторон мы прошли все соединенные локации и при этом не дошли до другой заданной локации, то это значит, что заданные локации не соединены.
На каждом шаге проверяется, не пришли ли мы в локацию, до которой мы уже дошли из конечной локации (используется два списка локаций, которые мы посетили, выходя их начальной и конечной локаций), или до локации, для которой мы знаем, что из нее можно прийти в конечную (если у этой локации и у конечной номера «соединенности» равны). В этом случае между локациями есть путь.
В конце поиска пути мы изменяем локации, пройденные из конечной локации, присваивая всем им номер «соединенности» начальной локации.
В процессе построения лабиринта мы только разрушаем
существующие стены, поэтому если между какими-то двумя локациями существует
путь, он уже никуда не денется. Таким образом, нет никакого резона выбирать
одну и ту же стену. Если некоторая стена была выбрана генератором случайных
чисел однажды и осталась не разрушенной после текущей итерации алгоритма, путь
между соответствующими локациями есть, и он останется в будущем. Для этого
используем список, в который в самом начале заносим все стены, а после
обработки каждой из них, производим удаление ее из списка. Таким образом, когда
список станет пустым, лабиринт будет готов.
3 РАЗРАБОТКА ПРОГРАММЫ
Взаимодействие с пользователем чуть менее чем полностью происходит в главном окне. Рассмотрим основные моменты этого взаимодействия.
При выборе пункта меню “File->New…” вызывается соответственный обработчик в котором мы создаем окно с выбором размера лабиринта, а после выбора мы создаем экземпляр класса CMaze и передаем его в метод Generate класса CGenerator для создания его геометрии:
private void newToolStripMenuItem_Click(object sender, EventArgs e)
{
NewProperties NewForm = new NewProperties();
if (NewForm.ShowDialog() == DialogResult.OK)
{
if (Maze!=null) Maze.Dispose();
int Seed = Convert.ToInt32(DateTime.Now.Ticks % 0xFFFFFF);
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.