В классе лабиринта рассмотрим конструктор, при вызове которого производится загрузка из файла:
public CMaze(System.IO.Stream FileStream)
{
mSize.Width = ReadWord(FileStream);
mSize.Height = ReadWord(FileStream);
mWalls = new SRoomWalls[mSize.Width, mSize.Height];
Point EnterPoint = new Point(ReadWord(FileStream), ReadWord(FileStream));
Point ExitPoint = new Point(ReadWord(FileStream), ReadWord(FileStream));
Point CurrentPosition =
new Point(ReadWord(FileStream), ReadWord(FileStream));
mPlayer = new CPlayer(EnterPoint, ExitPoint, CurrentPosition, mSize);
for (int x = 0; x < mSize.Width; x++)
for (int y = 0; y < mSize.Height; y++)
{
int wallDesc = FileStream.ReadByte();
mWalls[x, y].Noth = (wallDesc == 1) || (wallDesc == 3);
mWalls[x, y].West = (wallDesc == 2) || (wallDesc == 3);
}
}
Из данного кода виден формат файла сохранения: первые два слова (слово равно двум байтам) указывают размер лабиринта, затем идут координаты начальной локации, конечной локации и текущего положения героя. После чего каждый байт характеризует стены одной локации, поэтому их количество равно общему количеству локаций в лабиринте. Для чтения и сохранения слов были написаны специальные методы ReadWord и WriteWord.
Сохранение лабиринта происходит в такой же последовательности, и очень похоже на загрузку. Для проверки возможности пройти из одной локации в другую используется метод CanGo, в котором в зависимости от направления проверяется наличие или отсутствие стены, а также выход за границу лабиринта.
Рассмотрим теперь класс игрока. В нем не содержится какой-либо сложной логики, однако приведем реализацию метода Move:
public bool Move(EDirection Direction)
{
switch (Direction)
{
case EDirection.Noth:
if (mCurrentPosition.Y > 0) mCurrentPosition.Y--;
break;
case EDirection.West:
if (mCurrentPosition.X > 0) mCurrentPosition.X--;
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.