十八、备忘录模式——SL大法,读档的实现

C++ 关于存档与读档 c++可以用来制作游戏。可是,如果制作的游戏不能存档,那就特别让人心疼了。这种的游戏通常都是辛辛苦苦玩了半天,好不容易打出的记录,程序重启后,一夜回到解放前。 看着宝贵的血汗数据就这样变为0,小凤我决定,一定要找到一个存读档的方法给大家! 使用freopen 打开文件 freopen是使用重定向的方法读取文件,需要<cstdio>库。听不懂不要紧,反正是个方法就对了。 先来看看打开文件的格式: freopen(const char *Filename,const char *Mod 阅读详情


设计模式是面向问题、场景而总结产生的设计思路。是解决问题的套路。23 种经典的设计模式。它们又可以分为三大类:创建型、结构型、行为型。

行为型 包含了 观察者模式、模板模式、策略模式、职责链模式、状态模式、迭代器模式、 访问者模式、备忘录模式、命令模式、解释器模式、中介模式 总共11种模式。

备忘录模式

很多时候我们总是需要记录一个对象的内部状态,这样做的目的就是为了允许用户取消不确定或者错误的操作,能够恢复到他原先的状态,使得他有"后悔药"可吃。为了在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样可以在以后将对象恢复到原先保存的状态。解决办法是,通过一个备忘录类专门存储对象状态。Windows 里的 ctrl + z 、 数据库的事务管理、数据库备份与还原、编辑器撤销与重做、虚拟机生成快照与恢复、Git版本管理、棋牌游戏悔棋都是备忘录模式的应用。

以游戏存档为例,可以多次存档,并挑选存档读档。存档时记录血量、魔法值已经所属地图。

1. Snapshot 存档

Snapshot 记录当时游戏状态。

public class Snapshot {
    private int health;
    private int magic;
    private String town;

    public Snapshot(int health, int magic, String town) {
        this.health = health;
        this.magic = magic;
        this.town = town;
    }

    public int getHealth() {
        return health;
    }

    public void setHealth(int health) {
        this.health = health;
    }

    public int getMagic() {
        return magic;
    }

    public void setMagic(int magic) {
        this.magic = magic;
    }

    public String getTown() {
        return town;
    }

    public void setTown(String town) {
        this.town = town;
    }
}

2. SnapshotHolder 存档列表

内部持有存档列表snapshotList ,对存档进行管理。

public class SnapshotHolder {
    private List<Snapshot> snapshotList = new ArrayList<>();

    public boolean addSnapShot(Snapshot snapshot) {
        return snapshotList.add(snapshot);
    }

    public Snapshot getSnapShot(int index) {
        return snapshotList.get(index);
    }
}

3. Game 游戏

Game提供存档和读档功能。其主要功能是存档和读档。

public class Game {

    private int health;
    private int magic;
    private String town;

    public Game(int health, int magic, String town) {
        this.health = health;
        this.magic = magic;
        this.town = town;
    }

    public Snapshot save(){
        return new Snapshot(health,magic,town);
    }

    public void restore(Snapshot snapshot) {
        this.health = snapshot.getHealth();
        this.magic = snapshot.getMagic();
        this.town = snapshot.getTown();
    }

    public void setHealth(int health) {
        this.health = health;
    }

    public void setMagic(int magic) {
        this.magic = magic;
    }

    public void setTown(String town) {
        this.town = town;
    }

    @Override
    public String toString() {
        return "Game{" +
                "health=" + health +
                ", magic=" + magic +
                ", town='" + town + '\'' +
                '}';
    }
}

4. Main 组合运行

多次存档 并选择回到第一次状态。

public class Main {

    public static void main(String[] args) {
        SnapshotHolder snapshotHolder = new SnapshotHolder();
        Game game = new Game(100,210,"五蛇殿");
        snapshotHolder.addSnapShot(game.save());
        System.out.println("当前game state:"+game);

        game.setHealth(80);
        game.setMagic(20);
        game.setTown("土城");
        snapshotHolder.addSnapShot(game.save());
        System.out.println("当前game state:"+game);

        game.setHealth(100);
        game.setMagic(50);
        game.setTown("机关洞");
        snapshotHolder.addSnapShot(game.save());
        System.out.println("当前game state:"+game);

        game.restore(snapshotHolder.getSnapShot(0));
        System.out.println("读档后:game state:"+game);
    }
}

运行结果:

当前game state:Game{health=100, magic=210, town='五蛇殿'}
当前game state:Game{health=80, magic=20, town='土城'}
当前game state:Game{health=100, magic=50, town='机关洞'}
读档后:game state:Game{health=100, magic=210, town='五蛇殿'}

总结

备忘录模式也叫快照模式,就是在不违背封装原则的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便之后恢复对象为先前的状态
其应用场景也比较明确和有限,主要是用来防丢失、撤销、恢复等。它跟平时我们常说的“备份”很相似。

设计模式系列在github上有一个开源项目,主要是本系列博客的demo代码。https://github.com/forestnlp/designpattern
如果您对软件开发、机器学习、深度学习有兴趣请关注本博客,将持续推出Java、软件架构、深度学习相关专栏。
您的支持是对我最大的鼓励。

有背景图片, 带读档存档功能的五子棋 有背景图片, 带读档存档功能的五子棋。我自己自学java时写的。代码没有很好的优化,但功能很全面的 立即下载

相关推荐

Java实现简单棋盘存档和读取功能

主要为大家详细介绍了Java实现简单棋盘存档和读取功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

关于JAVA开发小游戏如何做读档和存档功能的这件事

本人初次接触JAVA学习了一学期,课设做了一个贪吃蛇。秉持着把这个游戏开发完整的想法,目前还缺少游戏存档和读档、速度可控增减的功能。(面板.java囊括了本程序设计绝大部分功能),因为是小白所以代码方面比较杂乱,所以想求一个思路和方法。 程序大概框架如下: 本人思路:开始界面.java(启动界面,如封面所示;开始新游戏、查看游戏存档、退出游戏三个按钮)→开始新游戏(点击后弹出框,输入角色名后进入游戏)→面板(基于窗口.java来绘制游戏面板,比如蛇、积分等) 下面是程序运行的过...

qq_35383049的博客 2178

NA400与昆仑通态MODBUS/TCP通讯调试说明

点击增加设备通道,弹出窗口进行设置,通道类型选择“0区输出继电器”,通道地址为1,通道个数为1,读写方式为读写。点击增加设备通道,弹出窗口进行设置,通道类型选择“4区输出寄存器”,数据类型选择“16位 无符号二进制”,通道地址为21001,通道个数为1,读写方式为读写。5.添加设备通道:双击莫迪康MODBUSTCP子设备,点击添加设备通道,根据Modbus规约地址表进行参数的设置,表格可在NAPro软件帮助中查看,如下图所示。然后可以在设备通道调试数据中观察到Q1的值为1,NW1的值678,表示通讯成功。

weixin_44281509的博客 2490

java存档_Java实现简单棋盘存档和读取功能

最近实现研究了下五子棋的存档,主要实现是将残局的五子棋棋盘保存到本地文件中,需要读取棋局时能够从本地文件获取,并展示出原有的残局局面。主要思路如上图所示,第一个表格是11*11的棋局,可以转换成11行11列的二维数组,1代表黑子,2代表蓝子,转换成第二个表格所示的二维数组。在保存时,考虑到二维数组中0大部分是没有被占用的空间,所以我将二维数组转换成了一个n行3列的稀疏数组,将所占用的空间压缩,保存...

weixin_31133141的博客 1176

NLM去噪算法:原理、优化与医学图像处理实战

本文深入解析NLM去噪算法的核心原理及其在医学图像处理中的优化应用。通过全局自相似性计算,NLM算法有效抑制噪声并保留细节,特别适用于超声图像斑点噪声处理。文章还介绍了积分图像和傅里叶变换等优化技巧,显著提升计算效率,并分享医学影像项目中的实用调参经验。

weixin_29051149的博客 348

UE5实战技巧:TextRender高效集成中文字体与材质优化

本文针对UE5中TextRender组件显示中文的常见问题,提供了一套完整的实战解决方案。详细讲解了如何通过手动创建字体资产、精准控制字符集来优化性能,并重点介绍了通过调整材质中的Lerp节点参数(如设为-85, 92)来解决中文字体显示残缺和边缘模糊等核心难题,帮助开发者实现高效且美观的中文文本渲染。

weixin_28040125的博客 380

游戏开发核心技术之-存档与读档(1)

游戏开发这个领域相对比较神秘一些,会用一些技巧性的编程技术,当然也不难。 今天我们就来实现游戏开发领域中的读档与存档功能,并剖析其中的技术点: 1、首先我们要知道结构体0数组元素的用途。建议看这篇博客: https://blog.youkuaiyun.com/Think88666/article/details/89302555 2、new和malloc的本质区别,博客: https://bl...

Think88666的博客 1万+

WeDetect:基于视觉-语言检索的目标检测新范式

目标检测正从传统回归与分类耦合范式,向开放、灵活、可扩展的多模态检索范式演进。检索式检测(Retrieval-based Detection)将检测任务重构为视觉特征与文本语义的联合匹配过程,依托候选框索引库与双塔架构,天然支持开放词汇、零样本识别与小目标定位。其技术价值在于解耦空间感知与语义理解,消除NMS与anchor匹配等冗余计算,显著提升推理效率与跨场景泛化能力。典型应用场景包括工业质检中的缺陷新增识别、遥感图像小目标检测、低光照鲁棒视觉系统等。WeDetect正是这一范式的代表性实现,深度融合视觉

weixin_30878501的博客 361

3种存档与读档方式

ArchDream0202的博客 3646

1、机器学习在环境科学中的应用与经典数据分析基础

本文介绍了机器学习在环境科学中的广泛应用,包括卫星遥感、气候预测、空气质量预报等领域,并系统回顾了经典数据分析的基本概念,如期望、方差、协方差和相关性及其显著性检验。同时,文章阐述了贝叶斯定理、判别函数与分类、聚类分析等方法的原理与应用,强调了经典统计方法与机器学习技术的互补关系。最后展望了未来环境科学中数据分析的发展方向,强调多学科融合与方法创新的重要性。

stone的博客 144

【异常】Cursor 模型服务地域访问限制报错的完整排查与解决方案This model provider doesn‘t serve your region

其本质是:Cursor客户端依赖的上游大语言模型服务提供商,基于自身服务的合规运营范围,对客户端发起的请求进行了来源地域权限校验;当系统检测到请求的网络来源地域,不在该模型服务商官方授权提供服务的地域范围内时,会触发服务访问拦截策略,拒绝响应本次模型调用请求,最终在客户端抛出该报错。合规声明:本文所提供的所有方案,均仅用于技术问题排查与解决,请您在使用过程中严格遵守当地法律法规,以及对应软件与模型服务提供商的用户协议与合规要求。更多关于AI+教育领域的干货,可以关注我的微信公众号一时间获取哦~

奶爸的编程之路,也就一周冷个三天 1134

kvm环境快照(snapshot)的使用方法

实例一  使用qemu-img命令使用快照 kvm环境下qcow2的镜像支持快照 1 确认镜像的格式   [root@nc1 boss]# qemu-img info test.qcow2    image: test.qcow2   file format: qcow2   virtual size: 10G (10737418240 bytes)   disk size: 1

gg296231363的专栏 3万+

Silly Tavern酒馆ai角色卡与世界书导入超详细教程!

前几天,我在设置 Silly Tavern 的时候,想导入一个喜欢的角色卡,结果发现不少朋友其实已经下载好了角色资源,但却不知道怎么正确导入使用。这篇文章就作为一份完整的新手向教程,一步步教你如何在 Silly Tavern 中导入角色卡、世界书,并实现与 AI 角色的真实互动。如果你是第一次接触这个功能,建议先收藏慢慢看~点击菜单栏上的 图标,打开角色界面。初始状态下,你应该只看到默认角色 Seraphina。你可以先点击她的头像尝试聊天,也可以导入自己喜欢的角色。点击导入按钮,选择你下载好的角色卡(通

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 2万+

备忘录模式

备忘录模式:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可以将该对象恢复到原先保存的状态。 比较适用于功能比较复杂的,但需要维护或者记录属性历史的类,或者需要保存的属性只是众多属性的一小部分时,originator可以根据保存的memento信息还愿到前一状态。 class Program { static void

xfei.zhang 286

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

存档——让我们继续游戏

存档——让我们继续游戏作者:leexuany历史1958年物理学家威利·希金博特姆(Willy Higinbotham)发明了第一个“视频”形式游戏。他为了提高参观纽约Brookhaven国家实验室游客的兴趣,在一台示波器上展示着一款"Tennis for Two"双人网球交互式游戏。在展览结束后,这个装置就被拆除了,它没有存档功能。后来的街机十分流行,但是由于商业运作的需求,在街

leexuany的专栏 3664

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Java实现简单的棋盘存档和读取功能

最近实现研究了下五子棋的存档,主要实现是将残局的五子棋棋盘保存到本地文件中,需要读取棋局时能够从本地文件获取,并展示出原有的残局局面。 主要思路 如上图所示,第一个表格是11*11的棋局,可以转换成11行11列的二维数组,1代表黑子,2代表蓝子,转换成第二个表格所示的二维数组。在保存时,考虑到二维数组中0大部分是没有被占用的空间,所以我将二维数组转换成了一个n行3列的稀疏...

u013571044的博客 4342

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

C语言实现贪吃蛇(四)----游戏存档读档(文件操作)

前言:对于C语言的初学者来说,可能会觉得文件操作是一个比较陌生的领域,但实际上无论编写怎样的程序文件操作都是必需的。在操作系统中,所有的外围设备(包括键盘和显示器)都被看作是文件系统中的文件,因此所有的输入/输出都要通过读文件/写文件完成。启动一个C语言程序时,操作环境负责打开标准输入,标准输出,标准错误3个文件,并将这3个文件的指针提供给该程序。而我们熟知的 getchar 函数 putchar

LSGOZJ的博客 2万+

游戏存档读档

https://www.cnblogs.com/zhh19981104/p/9141070.html

guangyinghu的博客 775

06、游戏的存档和读档

1、保存的数据类: 1 using System.Collections; 2 using System.Collections.Generic; 3 using UnityEngine; 4 5 [System.Serializable] 6 public class Save 7 { 8 public List<int> livingT...

weixin_34143774的博客 579

实现游戏的存档以及读档

实现游戏的存读档有三个方式 二进制方法 XML JSON 对比 二进制方法:简单,但可读性差。 XML:可读性强,但是文件庞大,冗余信息多。 JSON:数据格式比较简单,易于读写,但是不直观,可读性比XML差。 二进制方法(Binary Formatter) 序列化:新建或打开一个二进制文件,通过二进制格式器将对象写入该二进制文件。 反序列化:打开待反序列化的二进制文件,通过二进制格式器将文件...

a1728351227的博客 5893

【Unity基础】之后可能会用到的【SL功能(存档&读档)】

存档 思路: 玩家的位置信息和角度信息全都用stringbao保存,x,y,z之间用"_"分开,等到先要读数据时使用Split()切割字符串获取数据。 怪物数据在保存时每个Key后面加上自己的ID值(这里图方便就用for循环里的"i"代替了)。 等到取数据时就可以找到各自的值。 public void save() { //1、保存玩家信息 PlayerController controller = GameObject.FindGameObjectWithTag("

qq_42404497的博客 361

存档存档.....

 http://www.ymer.org/amir/2007/06/04/getting-the-number-of-frames-of-an-avi-video-file-for-opencv/http://www.cnblogs.com/cxun/archive/2007/04/28/731486.html

twilightgod的专栏 1564
上一篇: 十七、访问者模式——accpet后你就可以visit(this)了
下一篇: 十九、命令模式——将数据封装为对象,对象封装为命令
悟空学编程
博客等级 码龄12年 32粉丝 123原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

悟空学编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值