{
Progress ProgressForm = new Progress();
ProgressForm.Show();
if (!CGenerator.Generate(Maze.Size, Maze,
Convert.ToInt32(DateTime.Now.Ticks % 0xFFFFFF), ProgressForm.progressBar))
Maze.Dispose();
ProgressForm.Dispose();
}
Field.Refresh();
}
}
}
При этом также запоминается предыдущее положение игрока, которое используется при перерисовке буфера, а также обрабатывается завершение игры. Если игрок дошел до конечной точки, ему показывается поздравление, и предложение сгенерировать новый лабиринт, и если он соглашается, то мы вызываем метод Generate класса CGenerate для генерации нового лабиринта.
Рассмотрим класс генерации лабиринта. Для реализации алгоритма Краскала были написаны следующие основные методы:
1. Для определения являются ли локации соединенными или нет (используется информация о номерах «соединенности»):
private static bool IsConnected(Point From, Point To, int AnotherConnIndex)
private static bool TryGo(CMaze Maze, Point From, EDirection Direction, int
AnotherConnIndex, List<Point> Path)
3. Метод, в котором мы добавляем к пути локации таким образом, чтобы сначала передвигаться в те локации, которые геометрически ближе к конечной локации:
private static void AddToPath(CMaze Maze, Point From, Point To, int ConnIndex,
List<Point> Path)
4. Метод, реализующий поиск пути между двумя локациями, разделенными указанной стеной:
private static bool FindPath(Point From, EWall Wall, CMaze Maze)
5. Единственный public метод, который и расставляет стены в переданном ему лабиринте по методу Краскала:
public static bool Generate(Size MazeSize, CMaze Maze, int Seed,
System.Windows.Forms.ProgressBar Bar)
Алгоритмы, реализованные в данных методах, были рассмотрены в предыдущей главе.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.