MazeGame — различия между версиями

Материал из Вики ИТ мехмата ЮФУ
Перейти к: навигация, поиск
(Общее описание)
Строка 21: Строка 21:
  
 
Функция CreateMaze() различается для четырех рассматриваемых далее паттернов:
 
Функция CreateMaze() различается для четырех рассматриваемых далее паттернов:
 +
 +
===Код===
 +
 +
<source lang="Csharp">
 +
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
 +
    {
 +
        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 int RoomNumber {get; set; }
 +
        public virtual object Clone()
 +
        {
 +
            return new Room(RoomNumber);
 +
        }
 +
        private MapSite[] sides = new MapSite[4];
 +
    };
 +
 +
    public class Wall : MapSite
 +
    {
 +
    public void Enter()
 +
        {
 +
            Console.WriteLine("Wall.Enter");
 +
        }
 +
        public virtual object Clone()
 +
        {
 +
            return new Wall();
 +
        }
 +
    };
 +
 +
    public class Door : MapSite
 +
    {
 +
        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;
 +
        }
 +
        private Room r1, r2;
 +
    private bool isOpened = true;
 +
        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();
 +
        }
 +
    }
 +
}
 +
</source>

Версия 22:36, 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 
    {
        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 int RoomNumber {get; set; }
        public virtual object Clone()
        {
            return new Room(RoomNumber);
        }
        private MapSite[] sides = new MapSite[4];
    };

    public class Wall : MapSite 
    {
	    public void Enter()
        {
            Console.WriteLine("Wall.Enter");
        }
        public virtual object Clone()
        {
            return new Wall();
        }
    };

    public class Door : MapSite 
    {
        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;
        }
        private Room r1, r2;
	    private bool isOpened = true;
        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();
        }
    }
}