⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 maze.c

📁 Design Pattern C Source Code
💻 C
字号:
#include "Geom.H"#include <iostream.h>#include "C++/MazeParts.H"Door::Door (const Door& other) {    _room1 = other._room1;    _room2 = other._room2;}void Door::Initialize (Room* r1, Room* r2) {    _room1 = r1;    _room2 = r2;}Door* Door::Clone () const {    return new Door(*this);}//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%BombedWall::BombedWall (const BombedWall& other) : Wall(other) {    _bomb = other._bomb;}Wall* BombedWall::Clone () const {    return new BombedWall(*this);}//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%// Factories#include "C++/MazeFactories.H"Maze* MazeFactory::MakeMaze() const        { return new Maze; }Wall* MazeFactory::MakeWall() const        { return new Wall; }Room* MazeFactory::MakeRoom(int n) const        { return new Room(n); }Door* MazeFactory::MakeDoor(Room* r1, Room* r2) const        { return new Door(r1, r2); }MazeFactory* MazeFactory::_instance = 0;#ifdef SingletonMazeFactory* MazeFactory::Instance () {    if (_instance == 0) {        _instance = new MazeFactory;    }    return _instance;}#elseint strcmp(const char*, const char*);const char* getenv(const char*);MazeFactory* MazeFactory::Instance () {    if (_instance == 0) {        const char* mazeStyle = getenv("MAZESTYLE");        if (strcmp(mazeStyle, "bombed") == 0) {            _instance = new BombedMazeFactory;        } else if (strcmp(mazeStyle, "enchanted") == 0) {            _instance = new EnchantedMazeFactory;        // ... other possible subclasses        } else {        // default            _instance = new MazeFactory;        }    }    return _instance;}#endifWall* BombedMazeFactory::MakeWall () const {    return new BombedWall;}Room* BombedMazeFactory::MakeRoom (int n) const {    return new RoomWithABomb(n);}Room* EnchantedMazeFactory::MakeRoom(int n)  const        { return new EnchantedRoom(n, CastSpell()); }Door* EnchantedMazeFactory::MakeDoor(Room* r1, Room* r2)  const        { return new DoorNeedingSpell(r1, r2); }//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%class MazePrototypeFactory : public MazeFactory {public:    MazePrototypeFactory(Maze*, Wall*, Room*, Door*);    virtual Maze* MakeMaze() const;    virtual Room* MakeRoom(int) const;    virtual Wall* MakeWall() const;    virtual Door* MakeDoor(Room* r1, Room *r2) const;private:    Maze* _prototypeMaze;    Room* _prototypeRoom;    Wall* _prototypeWall;    Door* _prototypeDoor;};MazePrototypeFactory::MazePrototypeFactory (Maze* m,                                            Wall* w,                                            Room* r,                                            Door* d) {   _prototypeMaze = m;   _prototypeWall = w;   _prototypeRoom = r;   _prototypeDoor = d;}Room* MazePrototypeFactory::MakeRoom(int n) const {    Room* room = _prototypeRoom->Clone();    room->InitializeRoomNo(n);    return room;}Maze* MazePrototypeFactory::MakeMaze() const {    return _prototypeMaze->Clone();}Wall* MazePrototypeFactory::MakeWall() const {    return _prototypeWall->Clone();}Door* MazePrototypeFactory::MakeDoor(Room* r1, Room *r2) const {    Door* door = _prototypeDoor->Clone();    door->Initialize(r1, r2);    return door;}//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%class MazeBuilder {public:    virtual void BuildMaze() {};    virtual void BuildRoom(int) {};    virtual void BuildDoor(int, int) {};    virtual Maze* GetMaze() { return 0; }//    virtual Maze* OrphanMaze() { return 0;}protected:    MazeBuilder();};//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%class StandardMazeBuilder  : public MazeBuilder {public:    StandardMazeBuilder();    virtual void BuildMaze();    virtual void BuildRoom(int);    virtual void BuildDoor(int, int);    virtual Maze* OrphanMaze();private:    Direction CommonWall(Room*, Room*);    Maze* _currentMaze;};StandardMazeBuilder::StandardMazeBuilder () {    _currentMaze = 0;}void StandardMazeBuilder::BuildMaze () {    _currentMaze = new Maze;}Maze* StandardMazeBuilder::OrphanMaze () {    Maze* maze =  _currentMaze;    _currentMaze = 0;    return maze;}void StandardMazeBuilder::BuildRoom (int n) {    if (!_currentMaze->RoomNo(n)) {        Room* room = new Room(n);        _currentMaze->AddRoom(room);        room->SetSide(North, new Wall);        room->SetSide(South, new Wall);        room->SetSide(East, new Wall);        room->SetSide(West, new Wall);    }}void StandardMazeBuilder::BuildDoor (int n1, int n2) {    Room* r1 = _currentMaze->RoomNo(n1);    Room* r2 = _currentMaze->RoomNo(n2);    Door* d = new Door(r1, r2);    r1->SetSide(CommonWall(r1,r2), d);    r2->SetSide(CommonWall(r2,r1), d);}//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%class EnchantedMazeBuilder : public MazeBuilder {public:    EnchantedMazeBuilder();    virtual void BuildMaze();    virtual void BuildRoom(int);    virtual void BuildDoor(int, int);    virtual Maze* OrphanMaze();private:    Maze* _enchantedMaze;    Direction CommonWall(Room*, Room*);};class TwistyTurnyPassage : public Room {public:    TwistyTurnyPassage();    virtual void Enter();};void EnchantedMazeBuilder::BuildDoor (int n1, int n2) {    Room* r1 = _enchantedMaze->RoomNo(n1);    Room* r2 = _enchantedMaze->RoomNo(n2);    TwistyTurnyPassage* p = new TwistyTurnyPassage;    Door* d1 = new Door(r1, p);    Door* d2 = new Door(p, r2);    r1->SetSide(CommonWall(r1,r2), d1);    r2->SetSide(CommonWall(r2,r1), d2);}//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%class CountingMazeBuilder : public MazeBuilder {public:    CountingMazeBuilder();    virtual void BuildMaze();    virtual void BuildRoom(int);    virtual void BuildDoor(int, int);    virtual void AddWall(int, Direction);    void GetCounts(int&, int&) const;private:    int _doors;    int _rooms;};CountingMazeBuilder::CountingMazeBuilder () {    _rooms = _doors = 0;}void CountingMazeBuilder::BuildRoom (int) {    _rooms++;}void CountingMazeBuilder::BuildDoor (int, int) {    _doors++;}void CountingMazeBuilder::GetCounts (int& rooms, int& doors) const {    rooms = _rooms;    doors = _doors;}//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#include "C++/MazeGame.H"class BombedMazeGame : public MazeGame {public:    BombedMazeGame();    virtual Wall* MakeWall()  const        { return new BombedWall; }    virtual Room* MakeRoom(int n)  const        { return new RoomWithABomb(n); }};class EnchantedMazeGame : public MazeGame {public:    EnchantedMazeGame();    virtual Room* MakeRoom(int n)  const        { return new EnchantedRoom(n, WeaveSpell()); }    virtual Door* MakeDoor(Room* r1, Room* r2) const         { return new DoorNeedingSpell(r1, r2); }protected:    Spell* WeaveSpell() const;};//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%Maze* MazeGame::CreateMaze() {    Maze* aMaze = new Maze;    Room* r1 = new Room(1);    Room* r2 = new Room(2);    Door *theDoor = new Door(r1, r2);    aMaze->AddRoom(r1);    aMaze->AddRoom(r2);    r1->SetSide(North, new Wall);    r1->SetSide(East, theDoor);    r1->SetSide(South, new Wall);    r1->SetSide(West, new Wall);    r2->SetSide(North, new Wall);    r2->SetSide(East, new Wall);    r2->SetSide(South, new Wall);    r2->SetSide(West, theDoor);    return aMaze;}//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%Maze* MazeGame::CreateMaze (MazeBuilder& builder) {    builder.BuildMaze();    builder.BuildRoom(1);    builder.BuildRoom(2);    builder.BuildDoor(1, 2);    return builder.GetMaze();}Maze* MazeGame::CreateComplexMaze (MazeBuilder& builder) {    builder.BuildRoom(1);    // ...    builder.BuildRoom(1001);    return builder.GetMaze();}//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%Maze* MazeGame::CreateMaze (MazeFactory& factory) {    Maze* aMaze = factory.MakeMaze();    Room* r1 = factory.MakeRoom(1);    Room* r2 = factory.MakeRoom(2);    Door* aDoor = factory.MakeDoor(r1, r2);    aMaze->AddRoom(r1);    aMaze->AddRoom(r2);    r1->SetSide(North, factory.MakeWall());    r1->SetSide(East, aDoor);    r1->SetSide(South, factory.MakeWall());    r1->SetSide(West, factory.MakeWall());     r2->SetSide(North, factory.MakeWall());    r2->SetSide(East, factory.MakeWall());    r2->SetSide(South, factory.MakeWall());    r2->SetSide(West, aDoor);    return aMaze;}Maze* MazeGame::CreateSimpleMaze() {    Maze* aMaze = MakeMaze();    Room* r1 = MakeRoom(1);    Room* r2 = MakeRoom(2);    Door *theDoor = MakeDoor(r1, r2);    aMaze->AddRoom(r1);    aMaze->AddRoom(r2);    r1->SetSide(North, MakeWall());    r1->SetSide(East, theDoor);    r1->SetSide(South, MakeWall());    r1->SetSide(West, MakeWall());    r2->SetSide(North, MakeWall());    r2->SetSide(East, MakeWall());    r2->SetSide(South, MakeWall());    r2->SetSide(West, theDoor);    return aMaze;}Maze* MazeGame::MakeMaze ()  const {    return new Maze;}Room* MazeGame::MakeRoom (int n) const {    return new Room(n);}Wall* MazeGame::MakeWall ()  const {    return new Wall;}Door* MazeGame::MakeDoor (Room* r1, Room* r2) const {    return new Door(r1, r2);}//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%// The offsets below are bad, but it makes code appear ok in text// Simply cut and pastemain() {MazeGame game;Maze* maze;maze = game.CreateMaze();// PrototypeMazePrototypeFactory prototypeFactory1( new Maze,                                       new Wall,                                        new Room,                                        new Door );maze = game.CreateMaze(prototypeFactory1);MazePrototypeFactory prototypeFactory2(new Maze,                                      new BombedWall,                                      new RoomWithABomb,                                      new Door);maze = game.CreateMaze(prototypeFactory2);// BuilderStandardMazeBuilder  sbuilder;game.CreateMaze(sbuilder);maze = sbuilder.GetMaze();int rooms, doors;CountingMazeBuilder cbuilder;game.CreateMaze(cbuilder);cbuilder.GetCounts(rooms, doors);cout << "The maze has "     << rooms << " rooms and "     << doors << " doors rooms\n";}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -