Solitaire 纸牌游戏 - 如何编程恢复游戏功能?

Posted

技术标签:

【中文标题】Solitaire 纸牌游戏 - 如何编程恢复游戏功能?【英文标题】:Solitiare card game - how to program resume game function? 【发布时间】:2018-09-11 22:02:56 【问题描述】:

我一直在编写单人纸牌游戏,到目前为止一切顺利,基本引擎运行良好,我什至编写了点击自动移动和获胜时自动完成、无限撤消/重做等功能。但现在我意识到游戏无法完全恢复,即保存,以便从上次游戏打开时的确切位置继续。

我想知道一个有经验的程序员会如何处理这个问题,因为它不像其他游戏那样简单,只需保存各种数字,比如关卡编号等就足以恢复游戏。

现在的方式是,所有游戏对象都是在新游戏中创建的,卡片、基础插槽、画面等,然后将卡片洗牌并分发出去。这是随机的,但在我看来,游戏需要记住这个随机发牌才能恢复游戏,并在游戏恢复时再次发牌。然后所有已执行的动作也必须照原样执行。所以看起来游戏和上次一样,但实际上所有的动作都是从头开始执行的。不确定这是否是最好的方法,但如果有的话,我对其他方法感兴趣。

我想知道是否有经验丰富的程序员可以告诉我他们将如何处理这个问题并可能提供一些提示/建议等。

【问题讨论】:

这个问题与Lua无关。 它是在使用 lua 的 Corona SDK 中编写的。实际上它与 cocos2d 无关,这是列表中奇怪的一个,但实际上它只是一般的编程,所以我想输入几个类别。 【参考方案1】:

(我假设这是标准的,克朗代克纸牌)

我建议设计一个存档结构。每张牌都应该有一套花色和一个价值变量,所以我会写出来:

[DECK_UNTURNED]
H 1
H 10
S 7
C 2
...
[DECK_UNTURNED_END]

[DECK_TURNED]
...
[DECK_TURNED_END]

etc

我会为每个可以堆叠的位置卡(我相信你称它们为基础)、未公开的套牌、已显示的套牌、七个主要插槽中的每一个和四个获胜插槽。当然,请确保无论您如何读入和读出它们,它们最终都以相同的顺序结束。

当你去读取文件时,一个简单的方法是把整个文件读成一个字符串向量。然后你遍历向量直到你找到你的块之一。

if( vector[ iter ] == "[DECK_UNTURNED]" )

现在您进入另一个循环,使用相同的向量和迭代器,并继续读取这些卡片,直到您到达相关的结束块。

while( vector[ iter ] != "[DECK_UNTURNED_END]" )
    read cards...
    ++iter

这就是我通常如何保存所有文件的方式。创建 [DATA] 块,并读入直到到达结束块。它不是很复杂,但很有效。

【讨论】:

感谢您的回答。因此,您要遍历所有最后保存的位置(当前位置)或直到此时所做的所有移动? 它将遍历所有保存的位置,这样您就不必跟踪所做的移动。根本没有额外的程序相关容器。写入文件并忘记它们。 好的,我明白了,谢谢。这和我建议的一样吗?如果不是,有什么不同? 我觉得你建议的方式在加载时需要一些处理时间。这现在可能看起来并不大,但在更大的项目中可能会超过数千步。这种方法会跳过所有步骤并存储原始数据,读取它只是将所有成员设置为所需的数据,而不是先初始化它们,然后让它们完成所有保存的步骤。 好的,但我不明白它有什么不同。你怎么能不保存每一个动作呢?肯定需要每一步,尤其是因为玩家可能想要撤消所做的移动。【参考方案2】:

您在一定程度上重播游戏的想法很好。只需保存撤消信息并在加载时重做即可。

【讨论】:

也许可以。事实证明这是一场噩梦。我不得不重写代码,以免破坏对象,而是隐藏它们或将它们移出屏幕,因为在尝试重做所有事情时破坏它们会导致很多问题。只是真的不确定通常的方法是什么,因为每个移动单人纸牌游戏似乎都有这个功能。

以上是关于Solitaire 纸牌游戏 - 如何编程恢复游戏功能?的主要内容,如果未能解决你的问题,请参考以下文章

#游戏编程模式# --- 框架性能游戏

微信授权取消了怎么恢复

如何防止应用程序/游戏在一段时间后恢复时崩溃

以编程方式从 google play 游戏中删除保存的游戏

如何制作小游戏

如何在用户在 jQuery 浏览器中输赢游戏时安排音频播放