如何实现基于密码的复古风格“ savegame”系统?


20

我如何为单人游戏(如较旧的主机游戏中使用的系统)建立密码系统?

例如,Mega Man X通过为您提供一系列数字来保存工作,您可以在以后输入这些数字以加载您的保存文件。


3
不要做大金刚(NES)的事情-这会让您保存到墨盒中,但不保留生命计数-因此,您将拥有第一层的生命(例如24岁),保存,睡觉,起床上升到3- 我讨厌
Alec Teal

10
书呆子注意:密码系统不会保存游戏状态,它会加载预定义的状态
Lilienthal

5
@Lilienthal不一定。也许这只是某些状态变量的“转储”,并带有确定性的双向算法。
o0'。

2
@Lohoris是的,如果您的密码中有足够的熵,则可以认为它是一种已保存状态,足够接近于当前的存档游戏。毕竟,两者都需要导出和导入游戏状态的方法。但是,类似于真实保存(精确的位置/检查点,生命,敌人被杀,弹药计数……)之类的事物所需的熵将需要非常长的密码和非常复杂的算法。对于在保存游戏上使用密码的决定是合理的(如果有的话),准则应该成立。
Lilienthal

3
@AlecTeal究竟谁是“愚蠢的”?我正在根据现代游戏中存储的数据量评估密码,因为这些数据显然不适用于绝大多数游戏。
Lilienthal 2015年

Answers:


32

首先,分解游戏状态(或更确切地说,是要保存的状态的各个方面)。在《洛克人》风格的游戏中,您可能会跟踪您杀死了哪些终端老板,是否拥有类似能量罐的道具数量,等等。

将所有数据打包到一个位字段中,即为每个值分配适当数量的位:

  • 杀死老板1(一位)
  • 杀死老板2(一位)
  • 杀死BOSS 3(一位)
  • 杀死boss 4(一位)
  • 储能箱(共5个x)(3位)
  • 解锁一些成就(一点点)

我们的示例总共有8位,这意味着一个字符可以代表一个密码。实际上,您的游戏可能具有更多状态,因此需要更多的总位数,从而需要更多的角色。如此处和该问题其他地方的注释中所指出的,此方法适用于“复古”游戏或捕获的游戏状态大小合理的其他游戏。超过某个点,您可能会发现对状态进行编码所需的密码复杂度太大。

为了减少偶然观察发现破解密码的可能性,您可以变换位的布局,以便引入虚拟位(对游戏状态没有影响,但是当您将所有位解释为字符时会使密码看起来不同)或运行它通过一些可逆的类似于哈希的操作来对位进行加扰,以使所有“ killed X框”位都不紧挨着,使相应的顺序状态密码看起来非常不同,或引入校验和值。

如果您四处浏览,那里有一些流行的带有密码的游戏所使用的系统上的信息很多:

您可以阅读这些内容以获取更多启发。


4
请记住,要确保“保存状态”密码都易于键入并且最好是明确的(例如,使用“ 0”或“ O”,但不能同时使用两者)。
minnmass

4
@minnmass奖励积分,如果您隐式将相似字符转换为标准字符,则键入“ O”而不是“ 0”仍会转换为“ 0”。

8
@ NPSF3000因为在这种情况下,“密码”不是身份验证措施;“密码”是存储介质本身。
Schilcote

6
@ NPSF3000如果您对问题不清楚,那么您需要重新阅读问题或学习背景材料。
hobbs 2015年

2
@ NPSF3000 OP明确表示“复古风格”,并引用Megaman进行确认,这并不含糊。了解主题,了解这与安全性无关,请停止尝试捍卫诚实和可宽恕的无知。
MickLH 2015年

3

这些游戏确实只能保存我相信的状态。密码仅引用要加载的级别。只需使用字典即可​​。

如果它有点复杂,例如拥有某种武器或助推器,则可以将状态加密为较短(但足够长)的哈希码。

但我强烈建议您不要使用此功能。密码会在Internet上迅速传播,很快每个人都会赢得您的比赛。


9
在互联网上传播的密码可能很好。作弊可能很有趣,在单人游戏中,玩家只能作弊。
Anko

@Anko是的,我不喜欢作弊并且几乎没有这样做,所以我有偏见。但是根据我自己的经验,当我欺骗自己的低谷时,我的游戏会越来越快地积尘。
Madmenyo,2015年

“ ...只是引用要加载的级别。” 到目前为止,并非所有情况都如此。有些密码还引用老板,被杀死,获得加电等信息。其次,建议密码可以传播是一回事-在我们高度连接的世界中这是一个问题。说应该删除作弊选项,因为您不喜欢作弊是另一回事。您所喜欢的并不完全是其他人所喜欢的。它不是您想要的东西,而是消费者。作弊/快捷键是一个重要的选择-特别是对于单人游戏。
WernerCD 2015年

@WernerCD首先,我谈论更复杂的系统,我只是从一个简单的密码系统开始。我什么都没要求。其次,我没有在作答中说任何关于作弊的事情。我只是在评论中对BIASED进行回复,甚至说我有偏见,并且意识到您的观点不是我想要的。但是,如果没有人说他喜欢或不喜欢的东西,你怎么知道别人喜欢的东西呢?我仍然认为像这样的系统应运而生,实现21世纪作弊的方式有所不同。下次您应该更仔细地阅读,然后再写类似恕我直言的评论。
Madmenyo

如果您有保存游戏,人们也会共享保存游戏。
德维·摩根

1

好吧,您基本上可以这样:

老板被杀= 7

硬币数量= 36

拥有剑= 0(否)

自己的心= 1(是)

当前水平= 6

当前世界= 9

生命= 100

代码= 7V36R0A1T6O9A100

基本上每个字母都是分开的


-3

尽管像乔什·佩特里(Josh Petrie)的角色到状态系统这样的解决方案具有好处(较小的存储空间,可在游戏的所有副本上使用),但它们将游戏的设计和状态系统与密码系统本质上结合在一起。对密码,状态或设计的任何更改都会破坏整个系统。

一个简单得多的解决方案是按常规构建您的保存系统,并在顶部简单地添加一个密码系统。这可以像在保存中保存密码(可能是文件名加倍)并在加载时对其进行验证一样简单,也可以像使用周围的许多加密库之一一样复杂(这很简单)。


这个答案似乎有些混乱。

1)操作员只是要求输入密码,让他们加载保存...不需要密码作为保存。

2)当今许多游戏都有大量的保存存储需求,我们刚刚在内部构建了一个快速保存/加载系统,该系统可以生成10MB文件...用于问答游戏! 乔什·佩特里(Josh Petrie)的保存系统(虽然有效)非常有限-一旦存储系统变得不平凡,那么密码就必须具有巨大的长度才能保存所有相关数据。

例如,如果有30个老板,会发生什么?20项成就?我们是成就的一半吗?他在什么级别?我们会为健康,生命,硬币,xp留出几位数?如果快照不是处于级别之间的状态...而是处于级别的一半时该怎么办-玩家,敌人,弹丸,破坏/改变的地形的位置突然加起来需要存储很多状态。

从角度来看,假设一个30个字符的字母和一个10个字母的密码,我们大约可以存储50位信息。看到游戏/引擎最多使用320位来存储单个对象的位置,旋转和缩放的情况并不少见。当然,您可以做各种各样的优化技巧,用更少的钱做更多的事情……但是最终,您会浪费时间使游戏变得有趣,这是您可以做出的最糟糕的优化之一。


3
我认为这里的问题以及上面的评论是,加密安全并不是将游戏状态保存为密码中的位的目标。以这种方式组成的密码很容易逆转,但很难猜出哈希,仅此而已。出于同样的原因,它不会引起您想象中的过度耦合;如果游戏状态变得或多或少变得复杂,则哈希值(确实会使先前的哈希值无效)也一样,但是系统在此之前和之后都同样有效。
塞斯·巴丁

@Seth Battin“这不会引起您想象中的过度耦合”哦,太酷了!因此,我现在正在开发的游戏具有一个以兆字节为单位的保存文件...我要做的就是做一些基本的混淆处理,然后将其显示在屏幕上,瞧!我们现在有一个完美的密码系统?
NPSF3000

3
听起来您的游戏不适合这种方法。
塞斯·巴丁

@ NPSF3000在这种情况下密码的意义是什么?如果要防止其他使用同一台计算机的人未经允许使用其保存游戏,为什么不使用用户名/密码每次游戏登录一次呢?如果要指定他们想要的保存,那是一个“ savegame id”,而不是密码,因此应该变得更友好。照原样,如果我没看错,您每次加载新的保存文件时都需要一个非用户指定的不同密码吗?为什么?这对任何人都有什么有益的好处?
Dewi Morgan

1
@DewiMorgan我什么都不需要,我只是回答了op的问题:“我如何为单人游戏创建密码系统?例如,Mega Man X通过给您一系列数字来节省工作您可以稍后输入以加载您的保存。” 我的解决方案可以做到这一点,而无需将保存系统和密码系统耦合在一起。投票最多的答案与我的缺点相同,此外,它要求整个游戏的设计都适合该方法。
NPSF3000
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.