📄 c18-生成器例.txt
字号:
//使用生成器模式
class MazeBuilder
{
public:
virtual void BuildMaze() {}
virtual void BuildRoom(int n) {}
virtual void BuildDoor(int roomFrom,int roomTo) {}
virtual Maze * GetMaze() {return 0;}
protected:
MazeBuilder();
};
Maze * Game::CreateMaze(MazeBuilder & builder)
{
builder.BuildMaze();
builder.BuildRoom(1);
builder.BuildRoom(2);
builder.BuildDoor(1,2);
builder.BuildRoom(3);
builder.BuildRoom(4);
builder.BuildDoor(3,4);
//...
return builder.GetMaze();
}
//-------------------------------------------------------------------------------------------
//具体的生成器
class StandardMazeBuilder:public MazeBuilder
{
public:
StandardMazeBuilder() {curMaze=0;}
void BuildMaze() {curMaze=new Maze;}
void BuildRoom(int n)
{
if (!curMaze->RoomNo(n) {
Room * room=new Room(n);
curMaze->AddRoom(room);
room->SetSide(1,new Wall);
room->SetSide(2,new Wall);
room->SetSide(3,new Wall);
room->SetSide(4,new Wall);
}
}
void BuildDoor(int n1,int n2)
{
Room * r1=curMaze->RoomNo(n1);
Room * r2=curMaze->RoomNo(n2);
Door * d=new Door(r1,r2);
r1->SetSide(CommonWall(r1,r2),d);
r2->SetSide(CommonWall(r2,r1),d);
}
Maze * GetMaze() {return curMaze;}
private:
int CommonWall(Room * r1,Room * r2); //r1和r2之间的墙相对于r1的方向
Maze * curMaze;
};
// 实际使用
Game mygame;
StandardMazeBuilder builder;
mygame.CreateMaze(builder);
Maze * maze=Builder->GetMaze();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -