如何在编写接龙纸牌游戏中实现恢复游戏功能?

我正在编写一款接龙纸牌游戏,目前一切顺利,基本引擎运行正常,我甚至编写了像点击自动移动、赢得游戏时自动完成、无限撤销/恢复等功能。但是现在我意识到游戏无法完全恢复,也就是保存游戏状态以便于从上次打开游戏时的 exact 位置继续进行游戏。

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

现在的游戏方式是,在新游戏中创建所有游戏对象,如卡牌、基础和牌面等,然后随机洗牌并发牌。从我的角度来看,游戏需要记住这个随机发牌的操作,以便在恢复游戏时再次进行相同的发牌操作。然后,需要按照之前执行的所有移动,一一进行相同的移动。因此,游戏看起来像上次玩的状态一样,但实际上所有移动都已经再次从头开始执行。我不确定这是否是最佳方法,如果还有其他方法,我很感兴趣。

我想知道有经验的程序员如何处理这个问题,并可能提供一些提示/建议等。

点赞
用户107090
用户107090

Your idea of replaying the game up to a point is good. Just save the undo info and redo it at load time.

你重新玩游戏直到某一个点的想法很好。只要保存撤销信息并在加载时重新执行即可。

2018-04-02 17:38:59
用户9812678
用户9812678

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

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

[DECK_TURNED]
...
[DECK_TURNED_END]

等等

我会为每个位置卡牌可以堆叠的地方(我相信您称它们为基础),未揭示的牌组,揭示的牌组,七个主槽位和四个获胜槽位做同样的事情。不管你如何读入和输出,它们都要按照相同的顺序排列。

当您打开文件进行读取时,一个简单的方法是将整个文件读入字符串向量。然后,遍历该向量,直到找到其中一个块。

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

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

while (vector[iter] != "[DECK_UNTURNED_END]")
    读取卡片...
    ++iter

这是我通常做所有保存文件的方法。创建 [DATA] 块,并在达到结束块之前读入。它并不是非常复杂,但它是有效的。

2018-05-18 23:00:10