Разработка программы «хождение по лабиринту», курсовая работа по системному по, страница 6

Для определения, можно ли пройти в соседнюю локацию, используется как информация о стенах, так и о номерах «соединенности» (если они у обеих локациях равны, то известно, что путь в другую локацию уже имеется).

Если с какой либо из сторон мы прошли все соединенные локации и при этом не дошли до другой заданной локации, то это значит, что заданные локации не соединены.

На каждом шаге проверяется, не пришли ли мы в локацию, до которой мы уже дошли из конечной локации (используется два списка локаций, которые мы посетили, выходя их начальной и конечной локаций), или до локации,  для которой мы знаем, что из нее можно прийти в конечную (если у этой локации и у конечной номера «соединенности» равны). В этом случае между локациями есть путь.

В конце поиска пути мы изменяем локации, пройденные из конечной локации, присваивая всем им номер «соединенности» начальной локации.

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

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);