}(!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;
}
}
}