MazeGame
Общее описание
MazeGame - программа, строящая лабиринт для компьютерной игры.
Лабиринт - это множество комнат. Любая комната знает о своих соседях. Соседями могут быть другие комнаты, стены и двери.
Классы Room, Door и Wall являются потомками интерфейса MapSite - компонента лабиринта. В нем - только одна операция - Enter() - войти. Кроме того, он реализует интерфейс клонирования, что понадобится нам в одном из примеров.
У каждой комнаты - 4 стороны, задаваемые направлениями
enum Direction { North, South, East, West };
Каждая комната Room имеет номер и ссылки на другие объекты MapSite по всем четыре направлениям.
Каждая стена Wall характеризуется двумя комнатами, находящимися по разные стороны от двери, а также флагом, открыта ли дверь, определяющим. можно ли в нее войти. Входя в дверь, мы входим в соседнюю комнату.
Класс лабиринта Maze может добавлять новые комнаты к внутреннему списку и имеет функцию RoomNo определения комнаты по ее номеру.
Наконец, класс MazeGame создает и возвращает лабиринт вызовом функции CreateMaze().
Функция CreateMaze() различается для четырех рассматриваемых далее паттернов: Абстрактная фабрика, Строитель, Фабричный метод, Прототип.
Пример простого лабиринта
Диаграмма классов
Код
Данный код является отправной точкой для применения паттернов.
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();
}
}
}