【设计模式】你知道游戏SL大法是什么设计模式吗?

2024-01-21 17:28

本文主要是介绍【设计模式】你知道游戏SL大法是什么设计模式吗?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

什么是备忘录模式?

老规矩,我们先来看看备忘录模式 (Memento) 的定义:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。

它的UML类图如下:

从上图可以发现,备忘录模式其实整体分为三个部分:Originator(发起人)、备忘录(Memento)、CareTaker(管理者)。其中,Originator负责创建一个备忘录Memento,并哟个memento记录当前时刻它的内部状态 (部分或整体) ,同时,也可以使用备忘录Memento恢复到某一个状态;备忘录Memento负责记录、存储发起人Originator的内部状态,并且只有发起人Originator能够访问其内部数据;而管理者Caretaker就负责保存备忘录Memento,注意,它不会查看备忘录里的具体内容。

举一个大家熟知的例子,SL大法知道吧?

在游戏里,当我们保存进度时,玩家角色就是一个发起人,而角色的当前状态(等级、血量、魔法值等)被保存(Save);当我们想重来的时候,读取存档(Load),就能够恢复角色到之前某一个时刻的状态。上述整个过程其实就是备忘录模式的具体体现,接下来我们就以游戏保存、读取来看看备忘录模式的具体应用。

如何使用备忘录模式?

先定义一个英雄类,表示玩家操作的游戏角色,他拥有生命值、魔法值、攻击力、防御力:

  • 英雄类
@Data
public class Hero {private int hp;private int mp;private int atk;private int def;// 初始角色状态public void getInitialState() {this.hp = 100;this.mp = 50;this.atk = 10;this.def = 5;}// 当前状态展示public void displayState() {System.out.println("角色当前状态:");System.out.println("生命值:" + this.hp);System.out.println("魔法值:" + this.hp);System.out.println("攻击力:" + this.atk);System.out.println("防御力: " + this.def);System.out.println("******************");}// 角色经验升级,恢复一定生命、魔法并增加属性public void levelUp() {this.hp += 20;this.mp += 10;this.atk += 5;this.def += 5;}// 大战bosspublic void fight() {this.hp -= 99;this.mp -= 50;}// 保存现在状态public SavaMemento saveState() {return (new SavaMemento(hp, mp, atk, def));}// 恢复之前状态public void loadState(SavaMemento memento) {this.hp = memento.getHp();this.mp = memento.getMp();this.atk = memento.getAtk();this.atk = memento.getDef();}
}

我们注意到,英雄类里除了初始化、战斗等函数,有两个公共方法:SaveMemento和loadState,前者返回了一个存档,后者则根据这个存档恢复到某一个时刻的状态。其实也可以这么理解,保存存档的时候,得到了一个存档id,之后读取存档则需要该存档id。

  • 存档类

存档类的实现很简单,就是根据最初系统的设计目的,来保存对应的英雄类中的某些信息。

public class SavaMemento {private int hp; // 生命力private int mp; // 魔法值private int atk; // 攻击力private int def; // 防御力public SavaMemento(int hp, int mp, int atk, int def) {this.hp = hp;this.mp = hp;this.atk = atk;this.def = def;}
}
  • 存档保管箱

存档保存角色信息,而存档保管箱则是将存档的实现细节收敛,防止客户端知道其具体的实现细节。

public class CareTaker {private SavaMemento savaLoadMemento;public SavaMemento loadGame() {try {if (savaLoadMemento != null)return savaLoadMemento;elsethrow new Exception();} catch (Exception ignored) {System.out.println("The saveFile is missed!");}return new SavaMemento(100, 50, 10, 5);}public void saveGame(SavaMemento memento) {this.savaLoadMemento = memento;}
}
  • 游戏客户端

设计一个游戏客户端,操作一个游戏角色从出生到大战boss、再到读取存档的过程:

public class GameClient {public static void main(String[] args) {// 显示初始状态System.out.println("初始状态--");Hero hero = new Hero();hero.getInitialState();hero.displayState();// 保存游戏System.out.println("保存游戏--");CareTaker caretaker = new CareTaker();caretaker.saveGame(hero.saveState());// 打死大bossSystem.out.println("三拳打死Boss--");hero.fight();hero.displayState();// 升级啦System.out.println("经验升级--");hero.levelUp();hero.displayState();// 恢复游戏System.out.println("读取存档--");hero.loadState(caretaker.loadGame());hero.displayState();}
}
  • 来看看输出

总结

应用场景

备忘录模式主要应用在这样的场景:需要记录某一个对象的内部状态,并且能够将对象恢复到某一个时刻状态,例如用户操作redo、或者游戏进度保存等等。

优点

提供了一种可以恢复状态的机制,进行回溯甚至将对象恢复到任意时刻的状态。

缺点

会额外消耗资源,因为需要将对象的状态信息进行保存,不过这个缺点在实际业务场景下都是可以接受的。

参考资料

《大话设计模式》

这篇关于【设计模式】你知道游戏SL大法是什么设计模式吗?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/630274

相关文章

在JS中的设计模式的单例模式、策略模式、代理模式、原型模式浅讲

1. 单例模式(Singleton Pattern) 确保一个类只有一个实例,并提供一个全局访问点。 示例代码: class Singleton {constructor() {if (Singleton.instance) {return Singleton.instance;}Singleton.instance = this;this.data = [];}addData(value)

国产游戏崛起:技术革新与文化自信的双重推动

近年来,国产游戏行业发展迅猛,技术水平和作品质量均得到了显著提升。特别是以《黑神话:悟空》为代表的一系列优秀作品,成功打破了过去中国游戏市场以手游和网游为主的局限,向全球玩家展示了中国在单机游戏领域的实力与潜力。随着中国开发者在画面渲染、物理引擎、AI 技术和服务器架构等方面取得了显著进展,国产游戏正逐步赢得国际市场的认可。然而,面对全球游戏行业的激烈竞争,国产游戏技术依然面临诸多挑战,未来的

火柴游戏java版

代码 /*** 火柴游戏* <p>* <li>有24根火柴</li>* <li>组成 A + B = C 等式</li>* <li>总共有多少种适合方式?</li>* <br>* <h>分析:</h>* <li>除去"+"、"="四根,最多可用火柴根数20根。</li>* <li>全部用两根组合成"1",最大数值为1111。使用枚举法,A和B范围在0~1111,C为A+B。判断</li>** @

国产游戏行业的崛起与挑战:技术创新引领未来

国产游戏行业的崛起与挑战:技术创新引领未来 近年来,国产游戏行业蓬勃发展,技术水平不断提升,许多优秀作品在国际市场上崭露头角。从画面渲染到物理引擎,从AI技术到服务器架构,国产游戏已实现质的飞跃。然而,面对全球游戏市场的激烈竞争,国产游戏技术仍然面临诸多挑战。本文将探讨这些挑战,并展望未来的机遇,深入分析IT技术的创新将如何推动行业发展。 国产游戏技术现状 国产游戏在画面渲染、物理引擎、AI

设计模式之工厂模式(通俗易懂--代码辅助理解【Java版】)

文章目录 1、工厂模式概述1)特点:2)主要角色:3)工作流程:4)优点5)缺点6)适用场景 2、简单工厂模式(静态工厂模式)1) 在简单工厂模式中,有三个主要角色:2) 简单工厂模式的优点包括:3) 简单工厂模式也有一些限制和考虑因素:4) 简单工厂模式适用场景:5) 简单工厂UML类图:6) 代码示例: 3、工厂方法模式1) 在工厂方法模式中,有4个主要角色:2) 工厂方法模式的工作流程

第四次北漂----挣个独立游戏的素材钱

第四次北漂,在智联招聘上,有个小公司主动和我联系。面试了下,决定入职了,osg/osgearth的。月薪两万一。 大跌眼镜的是,我入职后,第一天的工作内容就是接手他的工作,三天后他就离职了。 我之所以考虑入职,是因为 1,该公司有恒歌科技的freex平台源码,可以学学,对以前不懂的解解惑。 2,挣点素材钱,看看张亮002的视频,他用了6000多,在虚幻商城买的吸血鬼游戏相关的素材,可以玩两年。我

C#设计模式(1)——单例模式(讲解非常清楚)

一、引言 最近在学设计模式的一些内容,主要的参考书籍是《Head First 设计模式》,同时在学习过程中也查看了很多博客园中关于设计模式的一些文章的,在这里记录下我的一些学习笔记,一是为了帮助我更深入地理解设计模式,二同时可以给一些初学设计模式的朋友一些参考。首先我介绍的是设计模式中比较简单的一个模式——单例模式(因为这里只牵涉到一个类) 二、单例模式的介绍 说到单例模式,大家第一

漫谈设计模式 [12]:模板方法模式

引导性开场 菜鸟:老大,我最近在做一个项目,遇到了点麻烦。我们有很多相似的操作流程,但每个流程的细节又有些不同。我写了很多重复的代码,感觉很乱。你有啥好办法吗? 老鸟:嗯,听起来你遇到了典型的代码复用和维护问题。你有没有听说过“模板方法模式”? 菜鸟:模板方法模式?没听过。这是什么? 老鸟:简单来说,模板方法模式让你在一个方法中定义一个算法的骨架,而将一些步骤的实现延迟到子类中。这样,你可

漫谈设计模式 [9]:外观模式

引导性开场 菜鸟:老鸟,我最近在做一个项目,感觉代码越来越复杂,我都快看不懂了。尤其是有好几个子系统,它们之间的调用关系让我头疼。 老鸟:复杂的代码确实让人头疼。你有没有考虑过使用设计模式来简化你的代码结构? 菜鸟:设计模式?我听说过一些,但不太了解。你觉得我应该用哪个模式呢? 老鸟:听起来你的问题可能适合用**外观模式(Facade Pattern)**来解决。我们可以一起探讨一下。

nyoj 1038 纸牌游戏

poj 的一道改编题,说是翻译题更恰当,因为只是小幅度改动。 一道模拟题,代码掌控能力比较好,思维逻辑清晰的话就能AC。 代码如下: #include<stdio.h>#include<string.h>#include<algorithm>using namespace std;struct node{char c[5];int rk;char da[5];int nu