MazeGame — различия между версиями
Admin (обсуждение | вклад) (→Диаграмма классов) |
Admin (обсуждение | вклад) (→Код) |
||
Строка 26: | Строка 26: | ||
===Код=== | ===Код=== | ||
− | + | Данный код является отправной точкой для применения паттернов. | |
<source lang="Csharp"> | <source lang="Csharp"> | ||
using System; | using System; |
Версия 11:22, 27 августа 2014
Общее описание
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 interface MapSite: ICloneable
{
void Enter();
}
public class Room: MapSite
{
private MapSite[] sides = new MapSite[4];
public int RoomNumber {get; set; }
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 void Enter()
{
Console.WriteLine("Room.Enter");
}
public virtual object Clone()
{
return new Room(RoomNumber);
}
}
public class Wall : MapSite
{
public void Enter()
{
Console.WriteLine("Wall.Enter");
}
public virtual object Clone()
{
return new Wall();
}
}
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 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 virtual object Clone()
{
return new Door(r1,r2);
}
}
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();
}
}
}