随笔-91  评论-137  文章-0  trackbacks-0

备忘录模式

前序

相信玩游戏每个人都会,今天就来讲讲关于游戏进度的保存机制,也就是备忘录模式。

备忘录模式

在不破坏封装性的前提下,捕获一个对象的内部状态,兵在该对象之外保存这个状态。这样以后就可以将该对象恢复到原先保存的状态。

实现方式(UML类图)


实现代码

#include <stdio.h>

 

// 角色状态存信息

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; // 第一关损失了20点血

                   pass++;

                  

                   vit -= 40; // 第二关损失了40点血

                   level++; // 升级了

                   atk++;

                   def++;

                   pass++;

                  

                   vit = 0; // 第三关直接被Boss干掉了

         }

        

         void StateDisplay()

         {

                   printf("当前血量: %d\n", vit);

                   printf("当前攻击力: %d\n", atk);

                   printf("当前防御力: %d\n", def);

                   printf("当前等级: %d\n", level);

                   printf("当前关卡: %d\n\n", pass);

         }

};

 

// 角色状态管理者

class RoleStateCaretaker

{

public:

         RoleStateMemento* pMemento;

};

 

int main()

{

         // 大战Boss

         GameRole* lixiaoyao = new GameRole();

        

         // 保存进度

         RoleStateCaretaker* stateAdmin = new RoleStateCaretaker();

         stateAdmin->pMemento = lixiaoyao->SaveState();

        

         // 大战Boss时,直接被干掉了

         lixiaoyao->Fight();

         lixiaoyao->StateDisplay();

        

         // 恢复之前的进度

         if(lixiaoyao->vit == 0)

         {

                   lixiaoyao->RecoveryState(stateAdmin->pMemento);

                   lixiaoyao->StateDisplay();

         }

        

         delete stateAdmin->pMemento;

         delete stateAdmin;

         delete lixiaoyao;

         return 0;

}

运行结果



所有文件打包下载

posted on 2011-11-13 23:48 lwch 阅读(2687) 评论(1)  编辑 收藏 引用 所属分类: 设计模式

评论:
# re: 备忘录模式[未登录] 2011-11-25 10:19 | fox
挺好的,请问博文你这个UML是用啥画的?  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理