MazeGame

Материал из Вики ИТ мехмата ЮФУ
Версия от 12:47, 31 августа 2014; Admin (обсуждение | вклад) (Код)

(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к: навигация, поиск

К основной странице курса

Общее описание

MazeGame - программа, строящая лабиринт для компьютерной игры.

Лабиринт - это множество комнат. Любая комната знает о своих соседях. Соседями могут быть другие комнаты, стены и двери.

Классы Room, Door и Wall являются потомками интерфейса MapSite - компонента лабиринта. В нем - только одна операция - Enter() - войти. Кроме того, он реализует интерфейс клонирования, что понадобится нам в одном из примеров.

У каждой комнаты - 4 стороны, задаваемые направлениями

enum Direction { North, South, East, West };

Каждая комната Room имеет номер и ссылки на другие объекты MapSite по всем четыре направлениям.

Каждая стена Wall характеризуется двумя комнатами, находящимися по разные стороны от двери, а также флагом, открыта ли дверь, определяющим. можно ли в нее войти. Входя в дверь, мы входим в соседнюю комнату.

Класс лабиринта Maze может добавлять новые комнаты к внутреннему списку и имеет функцию RoomNo определения комнаты по ее номеру.

Наконец, класс MazeGame создает и возвращает лабиринт вызовом функции CreateMaze().

Функция CreateMaze() различается для четырех рассматриваемых далее паттернов: Абстрактная фабрика, Строитель, Фабричный метод, Прототип.

Пример простого лабиринта

Labyrinth2.png

Диаграмма классов

MazeGame.png

Код

Данный код является отправной точкой для применения паттернов.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace MazeCommon
{
    public enum Direction { North, South, East, West };

    public abstract class MapSite
    {
        public abstract void Enter();
        public object Clone()
        {
            return this.MemberwiseClone();
        }
    }

    public class Room: MapSite 
    {
        private MapSite[] sides = new MapSite[4];
        public Room(int no)
        {
            RoomNumber = no;
        }
	    public MapSite GetSide(Direction d)
        {
            return sides[(int)d];
        }
	    public void SetSide(Direction d, MapSite m)
        {
            sides[(int)d] = m;
        }
        public override void Enter()
        {
            Console.WriteLine("Room.Enter");
        }
	    public int RoomNumber {get; set; }
    }

    public class Wall : MapSite 
    {
        public override void Enter()
        {
            Console.WriteLine("Wall.Enter");
        }
    };

    public class Door : MapSite 
    {
        private Room r1, r2;
        private bool isOpened = true;
        public Door(Room r1 = null, Room r2 = null)
        {
            this.r1 = r1;
            this.r2 = r2;
        }
        public void Initialize(Room r1 = null, Room r2 = null)
        {
            this.r1 = r1;
            this.r2 = r2;
        }
        public override void Enter()
        {
            if (isOpened)
                Console.WriteLine("Door.Enter");
            else Console.WriteLine("Door is Closed");
        }
	public Room OtherSideFrom(Room r)
        {
            if (r == r1)
                return r2;
            else return r1;
        }
    }

    public class Maze 
    {
        private List<Room> rlist = new List<Room>();
	public void AddRoom(Room r)
        {
            rlist.Add(r);
        }
	public Room RoomNo(int n)
        {
            if (n > rlist.Count)
                return null;
            return rlist[n-1];
        }
    }

    public class MazeGame
    {
        public Maze CreateMaze() 
        {
	        Maze aMaze = new Maze();
	        Room r1 = new Room(1);
	        Room r2 = new Room(2);
	        Door d = new Door(r1,r2);

	        aMaze.AddRoom(r1);
	        aMaze.AddRoom(r2);

	        r1.SetSide(Direction.North, new Wall());
	        r1.SetSide(Direction.East,  d);
	        r1.SetSide(Direction.South, new Wall());
	        r1.SetSide(Direction.West,  new Wall());
	        r2.SetSide(Direction.North, new Wall());
	        r2.SetSide(Direction.East,  new Wall());
	        r2.SetSide(Direction.South, new Wall());
	        r2.SetSide(Direction.West,  d);

	        return aMaze;
        }
    }

    class ProgramBase
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Base Program");

            var game = new MazeGame();
            Maze m = game.CreateMaze();
        }
    }
}