我一直在编写单人纸牌游戏,到目前为止一切进展顺利,基本引擎工作正常,我甚至编写了一些功能,如自动移动点击和自动完成获胜,无限撤消/重做等。但是现在我已经意识到游戏无法完全恢复,即保存以便从上次游戏开放时的确切位置继续。
我想知道一位经验丰富的程序员会如何处理这个问题,因为它看起来并不像其他游戏一样简单,只需保存各种数字,比如等级数等就足以恢复游戏。
现在的方式是,所有游戏对象都是在新游戏,卡片,基础插槽,桌面等创建的,然后将这些卡片洗牌并分发。这是随机的,但就我看来,游戏需要记住这个随机交易以恢复游戏并在游戏恢复时再次处理它。然后,所有已执行的动作都必须按原样执行。因此看起来游戏就像上次播放一样,但实际上所有动作都是从头开始执行的。不确定这是否是最佳方式,但如果有任何其他方式,我会感兴趣。
我想知道是否有经验丰富的程序员可以告诉我他们将如何处理这个问题并提供一些提示/建议等。
答案 0 :(得分: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]" )
现在你进入另一个循环,使用相同的向量和iter,并继续读取这些卡,直到你到达相关的结束块。
while( vector[ iter ] != "[DECK_UNTURNED_END]" )
read cards...
++iter
这就是我通常所有保存文件的方式。创建[DATA]块,然后读入,直到到达结束块。它不是很精细,但它确实有效。
答案 1 :(得分:0)
你想要重播游戏的想法很好。只需保存撤消信息并在加载时重做它。