Курсовая работа (т): Автоматизированная система построения лабиринта и поиска выхода из него

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

}(!found) // не найден выход - никакая воолна не накрыла ячейку с выходом

{

// выводим сообщение и выходим.Show("В лабиринте НЕ существует пути от входа до выхода!");;

}

/// pictureBox1.Refresh(); // обновить изображение pictureBox1 на форме

// путь имеется!

// найдем кратчайшее расстояния, перемещаясь от выхода к входу

// текущая ячейка при обратном поиске= xstop - 1;

ty = ystop - 1;= 0;[countpath,0]=tx;[countpath,1]=ty;++;= lab[tx, ty, 1];

while (lastwave > 0) // пока не дошли до входа (у него номер волны =0)

{

/// pictureBox1.Refresh(); // обновить изображение pictureBox1 на форме

/// Thread.Sleep(70); // сделаем паузу на указанное количество миллисекунд

// красным шрифтом нана ячейке напишем номер волны

/// gfr.DrawString(Convert.ToString(lastwave), new Font("Tahoma", 8), Brushes.Red, new Point((int)tx * sizecell + sizecell / 3, (int)ty * sizecell + sizecell / 3));

// далее идет проверка соседних ячеек и поиск ячейки у которой длина волны на 1 меньше текущего значения волны

// проверяем ячейку сверху((ty > 0) && (lab[tx, ty - 1, 1] == lastwave - 1))

{

// нарисуем красную линию (путь) от текущей ячейки до соседней

/// gfr.DrawLine(Pens.Red, (int)tx * sizecell + sizecell / 2, (int)ty * sizecell + sizecell / 2, (int)tx * sizecell + sizecell / 2, (int)(ty - 1) * sizecell + sizecell / 2);[countpath, 0] = tx;[countpath, 1] = ty-1;++;-; // изменяем текущую ячейку-; // уменьшаем длину волны

continue; // переходим к следующей итерации цикла

}

// проверяем ячейку снизу((ty < ycells - 1) && (lab[tx, ty + 1, 1] == lastwave - 1))

{

// нарисуем красную линию (путь) от текущей ячейки до соседней

/// gfr.DrawLine(Pens.Red, (int)tx * sizecell + sizecell / 2, (int)ty * sizecell + sizecell / 2, (int)tx * sizecell + sizecell / 2, (int)(ty + 1) * sizecell + sizecell / 2);[countpath, 0] = tx;[countpath, 1] = ty + 1;++;++; // изменяем текущую ячейку-; // уменьшаем длину волны

continue; // переходим к следующей итерации цикла

}

// проверяем ячейку слева((tx > 0) && (lab[tx - 1, ty, 1] == lastwave - 1))

{

// нарисуем красную линию (путь) от текущей ячейки до соседней

/// gfr.DrawLine(Pens.Red, (int)tx * sizecell + sizecell / 2, (int)ty * sizecell + sizecell / 2, (int)(tx - 1) * sizecell + sizecell / 2, (int)ty * sizecell + sizecell / 2);[countpath, 0] = tx - 1;[countpath, 1] = ty;++;-; // изменяем текущую ячейку-; // уменьшаем длину волны

continue; // переходим к следующей итерации цикла

}

// проверяем ячейку справа((tx < xcells - 1) && (lab[tx + 1, ty, 1] == lastwave - 1))

{

// нарисуем красную линию (путь) от текущей ячейки до соседней

/// gfr.DrawLine(Pens.Red, (int)tx * sizecell + sizecell / 2, (int)ty * sizecell + sizecell / 2, (int)(tx + 1) * sizecell + sizecell / 2, (int)ty * sizecell + sizecell / 2);[countpath, 0] = tx + 1;[countpath, 1] = ty;++;++; // изменяем текущую ячейку-; // уменьшаем длину волны

continue; // переходим к следующей итерации цикла

}

}

/// pictureBox1.Refresh(); // обновить изображение pictureBox1 на форме

}

// Алгоритм одной руки. Отвечает на вопрос: можно ли переместиться в указанную ячейку?

public bool can(int tox, int toy)

{((tox < 0) || (tox > xcells - 1) || (toy < 0) || (toy > ycells - 1)) return false;(lab[tox, toy, 0] == 1) return false;

return true;

}

// Сделать следующий шаг

// Используется в Алгоритме одной руки. bool NextStep()

{w0 = way; // направление, в сторону которого смотрим 1-вверх 2-вправо 3-вниз 4-влевоpx = 0; // смещение по горизонталиpy = 0; // смещение по вертикали// просмотрим все вокруг

{(w0 == 1) { px = 0; py = -1; } // если направление вверх, корректируем смещения(w0 == 2) { px = 1; py = 0; } // если направление вправо, корректируем смещения(w0 == 3) { px = 0; py = 1; } // если направление вниз, корректируем смещения(w0 == 4) { px = -1; py = 0; } // если направление влево, корректируем смещения(can(tx + px, ty + py)) break; // если в ячейку со смещением возможен переход, то покидаем циклw0--; // иначе поворачиваемся против часовой стрелки(w0 < 1) w0 = 4; // если направление ушло из диапазона 1-4 - возвращаем его в этот диапазон

} while (w0 != way); // пока все вокруг не просмотрели(can(tx + px, ty + py)) // если в ячейку со смещением возможен переход

{(lab[tx + px, ty + py, 1] > 0)

{(lab[tx, ty, 1] > lab[tx + px, ty + py, 1])

{[tx, ty, 1] = 0;= lab[tx + px, ty + py, 1];

}

}

{++;[tx + px, ty + py, 1] = len;

}

// корректируем текущее положение персонажа= tx + px;= ty + py;

// lab[tx, ty, 1] = 1; // пометим след от персонажа

// корректируем текущее направление движения персонажа= w0 + 1;(way > 4) way = 1; // если направление ушло из диапазона 1-4 - возвращаем его в этот диапазон

for (int i = 1; i < xcells - 1; i++)

{(int j = 1; j < ycells - 1; j++)

{(lab[i, j, 1] > len) lab[i, j, 1] = 0;

}

}true; // да, следующий шаг сделан успешно

}return false; // нет, следующий шаг сделать не удалось

}

// Сохранение лабиринта в файлvoid Save()

{ts = 0;saveFileDialog1 = new SaveFileDialog(); // создаем системный диалог сохранения файла

// задаем ему необходимые параметры (свойства)

saveFileDialog1.Filter = "Labyrint files (*.lab)|*.lab";.FilterIndex = 2;.RestoreDirectory = true;(saveFileDialog1.ShowDialog() == DialogResult.OK) // если файл для записи выбран успешно

{sw = File.CreateText(saveFileDialog1.FileName); // создаем файл для записи

// записываем основную информацию о лабиринте.WriteLine(Convert.ToString(xcells)); // ячеек по горизонтали

sw.WriteLine(Convert.ToString(ycells)); // ячеек по вертикали.WriteLine(Convert.ToString(xstart)); // координаты стартовой позиции.WriteLine(Convert.ToString(ystart)); // координаты стартовой позиции.WriteLine(Convert.ToString(xstop)); // координаты конечной позиции.WriteLine(Convert.ToString(ystop)); // координаты конечной позиции

// записываем состояние каждой ячейки(int i = 0; i < xcells; i++)

{(int j = 0; j < ycells; j++)

{.WriteLine(Convert.ToString(lab[i, j, 0]));+= lab[i, j, 0];

}

}.WriteLine(Convert.ToString((xcells + ycells + xstart + ystart + xstop + ystop) + ts)); // контрольная сумма

sw.Close(); // закрываем файл

}

}

// Чтение лабиринта из файлаBoolean Open()

{openFileDialog1 = new OpenFileDialog(); // создаем системный диалог выбора файла

// задаем ему необходимые параметры (свойства)

openFileDialog1.Filter = "Labyrint files (*.lab)|*.lab";.FilterIndex = 2;.RestoreDirectory = true;(openFileDialog1.ShowDialog() == DialogResult.OK) // если файл выбран успешно

{cs = 0;ts = 0;

{sr = File.OpenText(openFileDialog1.FileName); // открываем файл для чтения

// читаем основную информацию о лабиринте= Convert.ToInt32(sr.ReadLine());

ycells = Convert.ToInt32(sr.ReadLine());= Convert.ToInt32(sr.ReadLine());= Convert.ToInt32(sr.ReadLine());= Convert.ToInt32(sr.ReadLine());= Convert.ToInt32(sr.ReadLine());

// читаем состояние каждой ячейки(int i = 0; i < xcells; i++)

{(int j = 0; j < ycells; j++)

{[i, j, 0] = Convert.ToInt32(sr.ReadLine());+= lab[i, j, 0];

}

}= Convert.ToInt32(sr.ReadLine());.Close(); // закрываем файл

}(Exception e)

{.Show("Ошибка чтения лабиринта. Выберите другой файл.");false;

}

// контроль целостности((xcells == 0) || (ycells == 0) || (xstart == 0) || (ystart == 0) || (xstop == 0) || (ystop == 0))

{.Show("Ошибка контроля целостности лабиринта. Выберите другой файл.");false;

}= cs - (xcells + ycells + xstart + ystart + xstop + ystop)-ts;

if(cs!=0)

{.Show("Ошибка контроля целостности лабиринта. Выберите другой файл.");false;

}

}true;

}

}

}

Источник: https://www.bibliofond.ru/detail.aspx?id=791993