探讨一个关于单机游戏存档的问题

例如我要按顺序执行一堆逻辑:
逻辑1:挖矿,然后存档
逻辑2:收获矿,然后存档
逻辑3:矿挖完了,把矿干掉,然后存档
(每个逻辑都存档是因为玩家随时可能在某一个逻辑中退出游戏下线,我做的单机游戏 存档都在本地)

那么如果出现异常,比如在逻辑2的时候,因为代码不严谨 导致了报错,最终导致代码跑不到逻辑3(我用的ts语言)

然后这个时候因为前两个逻辑已经跑完了,档也存了,玩家的档里面就剩了一个空的矿在地图上

然而我们的逻辑要求是 只要跑了 逻辑1 ,就必须要跑完 逻辑3 才算一个完整的结束,不然就会因为数据错乱会导致玩家挖这个空的矿 永远会报错

类似的这种会导致逻辑中断的代码问题,经常会遇到,一般我们有什么好的方法或者设计可以规避掉这个问题吗

我目前知道的只有一种类似操作数据库的思想:事务回滚机制(目前还处在想象研究阶段,大家轻喷,因为好像从来没人把这种东西用到前端)

就是如果一个完整的逻辑因为各种原因没有跑完,那么就会恢复到最初的状态,放到上面的例子里 就是恢复到逻辑1之前的状态(一个从来没挖过的矿)

不知道有没有什么好办法可以一劳永逸的解决这类问题

因为游戏已经上线了,目前的解决办法就是如果线上的玩家出现问题,就写一些弥补的逻辑,比如把上面的那个出问题的矿手动写代码删掉,然后gm发补偿,就会导致项目里出现大量的这种弥补的代码

但我觉得这个治标不治本~ 当然,第一时间肯定是解决有问题的代码部分,让程序不出错,但因为只要是人写的代码 肯定难以避免出问题

所以我就在想,有没有一种可以在出问题的时候,不写弥补代码的方法

有大佬给过一个方案 :就是用try catch,把关键代码都try起来(不过目前还没有想到好的使用思路)

然后我就想问一下大家一般是怎么处理这种类似的情况的

额 上面字太多了,这里总结一下:
因为 只要是人写的代码 难免会出问题,如果是正在运营的单机游戏出了问题 就会导致玩家数据出错,然后后续的操作就是写一些弥补的代码更新上去来解决问题,我就在想 如何避免写这种弥补的代码,有没有一种通用的设计能一劳永逸的解决这种问题

最简单粗暴的办法是备份旧存档,只有逻辑3完成后才会覆盖旧存档,否则随时可以用旧存档覆盖新存档

但类似这种方式,都是想在线上出问题的时候避免错误产生更大的影响,并不解决问题
好的问题当然还是规范开发流程,进行专业有效的测试,让代码中必现的,低级的错误不会出现在线上

1赞

谢谢回答~
规范开发流程,进行专业有效的测试 这个是肯定的 是基操,但还是那句老话:只要是人写的代码,难免出问题,那么在出问题后如何避免问题扩大,如何少写弥补代码,还是有些不好搞

如果是个人或者小团队,或者项目初期,那都不应该在这个思路上浪费时间,只要不出现游戏流程完全卡死就行。
再期望太高就不现实了

每次进游戏,如果是当前逻辑 是 逻辑2,则检查下 逻辑1 是否跑完了,没有跑完则当前逻辑 是 逻辑1,进行游戏;
如果是当前逻辑 是 逻辑3,则检查下 逻辑1 逻辑2是否跑完了,有没有问题? 存在一点点问题
则当前逻辑 是 逻辑1,进行游戏;

确实,现在大多是小而美,追求敏捷快速,只是突然想到了这样一个问题,所以就想跟大家探讨一下

这个是解决这个例子的具体方案嘛,但我更想知道的是当具体解决方案也不小心出问题的时候,怎么解决后续的问题——如何避免问题扩大,如何少写弥补代码

设置标志位,完成1,记录一个flag1,完成n记录一个flagn.你需要什么完整的流程,在初始化的时候判断一下,你需要的那组标志是否都完成了,没有的话就重置这部分数据。

谢谢回答~
我想的那个回滚的思路 跟你有些相似

需要保证百分百没有问题的话 可以参看下银行系统是怎么做的 每一笔交易假如出了异常 可以使用日志来恢复这个订单的状态

谢谢回答~
感觉银行大概可能就是运用了类似 数据库事务的思想吧~

一个小游戏有必要搞成这么复杂嘛

那就逻辑跑完再存档不就完了,要是没跑完就退出了游戏,或者报错了,重进游戏就从当前档从头来,单机都是这样嘛

谢谢回答~
这么说 确实没错,目前就是在往这个方向思考

谢谢回答~
额 目前还没有引进游戏 只是有这样一个思考,小游戏确实追求短平快,有时候太复杂的设计确实得不偿失,所以到目前为止都是遇见一个坑就堵一个坑

你这个问题不算是问题吧.
毕竟try是可以做到避免存档问题的.

我感觉存档最复杂的问题不是如果是大量数据.
如何做到IO没问题吗…

矿只挖一次的话就没必要整三个不凑,挖完收获销毁存档一起。要挖多次的话就存个矿的进度,还是挖取收获一起,只是最后一次挖矿带上销毁

谢谢回答~
确实数据量太大也是个问题,不过目前项目还没到瓶颈,所以暂时还没来得及考虑这个

谢谢回答~
目前确实是有挖矿进度的设计,所以每次玩家的关键操作都会存储
整3个步骤只是举个例子嘛~
关键是想要找到一个当出现问题的时候,如何不扩大影响和少写弥补代码的方式或者程序设计