備忘錄模式
前序
相信玩游戲每個(gè)人都會(huì),今天就來講講關(guān)于游戲進(jìn)度的保存機(jī)制,也就是備忘錄模式。
備忘錄模式
在不破壞封裝性的前提下,捕獲一個(gè)對(duì)象的內(nèi)部狀態(tài),兵在該對(duì)象之外保存這個(gè)狀態(tài)。這樣以后就可以將該對(duì)象恢復(fù)到原先保存的狀態(tài)。
實(shí)現(xiàn)方式(UML類圖)

實(shí)現(xiàn)代碼
#include <stdio.h>
// 角色狀態(tài)存信息
class RoleStateMemento
{
public:
int vit;
int atk;
int def;
int level;
int pass;
RoleStateMemento(int _vit, int _atk, int _def, int _level, int _pass) : vit(_vit), atk(_atk), def(_def), level(_level), pass(_pass){}
};
// 游戲角色
class GameRole : public RoleStateMemento
{
public:
GameRole() : RoleStateMemento(100, 100, 100, 1, 1) {}
RoleStateMemento* SaveState()
{
return new RoleStateMemento(vit, atk, def, level, pass);
}
void RecoveryState(RoleStateMemento* pMemento)
{
vit = pMemento->vit;
atk = pMemento->atk;
def = pMemento->def;
level = pMemento->level;
pass = pMemento->pass;
}
void Fight()
{
vit -= 20; // 第一關(guān)損失了20點(diǎn)血
pass++;
vit -= 40; // 第二關(guān)損失了40點(diǎn)血
level++; // 升級(jí)了
atk++;
def++;
pass++;
vit = 0; // 第三關(guān)直接被Boss干掉了
}
void StateDisplay()
{
printf("當(dāng)前血量: %d\n", vit);
printf("當(dāng)前攻擊力: %d\n", atk);
printf("當(dāng)前防御力: %d\n", def);
printf("當(dāng)前等級(jí): %d\n", level);
printf("當(dāng)前關(guān)卡: %d\n\n", pass);
}
};
// 角色狀態(tài)管理者
class RoleStateCaretaker
{
public:
RoleStateMemento* pMemento;
};
int main()
{
// 大戰(zhàn)Boss前
GameRole* lixiaoyao = new GameRole();
// 保存進(jìn)度
RoleStateCaretaker* stateAdmin = new RoleStateCaretaker();
stateAdmin->pMemento = lixiaoyao->SaveState();
// 大戰(zhàn)Boss時(shí),直接被干掉了
lixiaoyao->Fight();
lixiaoyao->StateDisplay();
// 恢復(fù)之前的進(jìn)度
if(lixiaoyao->vit == 0)
{
lixiaoyao->RecoveryState(stateAdmin->pMemento);
lixiaoyao->StateDisplay();
}
delete stateAdmin->pMemento;
delete stateAdmin;
delete lixiaoyao;
return 0;
}
運(yùn)行結(jié)果

所有文件打包下載
posted on 2011-11-13 23:48
lwch 閱讀(2711)
評(píng)論(1) 編輯 收藏 引用 所屬分類:
設(shè)計(jì)模式