MazeGame — различия между версиями
Admin (обсуждение | вклад) (→Код) |
Admin (обсуждение | вклад) (→Код) |
||
Строка 121: | Строка 121: | ||
} | } | ||
− | public class Maze { | + | public class Maze |
+ | { | ||
private List<Room> rlist = new List<Room>(); | private List<Room> rlist = new List<Room>(); | ||
− | + | ||
+ | public void AddRoom(Room r) | ||
{ | { | ||
rlist.Add(r); | rlist.Add(r); | ||
} | } | ||
− | + | ||
+ | public Room RoomNo(int n) | ||
{ | { | ||
if (n > rlist.Count) | if (n > rlist.Count) | ||
Строка 139: | Строка 142: | ||
public Maze CreateMaze() | 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; | |
} | } | ||
} | } |
Версия 22:40, 26 августа 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();
}
}
}