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

В классе лабиринта рассмотрим конструктор, при вызове которого производится загрузка из файла:

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