【发布时间】:2017-11-04 16:51:51
【问题描述】:
我目前正在 Visual Studio 控制台中制作棋盘游戏,我想在最后使用队列重播整个游戏。为此,我确保每次绘制我的板时都要排队,以便将该板的实例添加到队列中。
我如何实例化队列:
Queue replay = new Queue();
我每次更新板子时使用的代码:
draw.UpdateBoard(board);
replay.Enqueue(board);
最后用于显示所有板子实例的代码:
foreach (int[,] q in replay)
{
draw.UpdateBoard(q);
System.Threading.Thread.Sleep(1000);
}
遇到的问题是队列仅包含处于最终状态的板子实例,我认为这是因为队列只能包含唯一值,因此在尝试添加到队列时它会覆盖所有先前的值。通过阅读其他示例,可以建议创建对象的新实例或将原始数据添加到队列中。由于这些与 2D 数组无关,我很难与之相关,有没有办法在不大幅改变我的代码流动方式的情况下解决这个问题?
【问题讨论】:
-
好吧,我回答了我自己的问题:编写 replay.Enqueue(board.clone) 解决了这个问题。我应该删除它还是更新它并留给其他人?
-
数组是可变引用类型。您一次又一次地将指向同一个实例的同一个引用加入队列。
-
当你将它排入
replay时,你需要克隆它。问题在于,当您将板状态排入队列时,实际上是在将一个指向表示该板的数据的指针排入队列。 -
只是一个旁注。目前尚不清楚这是控制台还是 GUI 应用程序。对于 GUI,切换到 Timer 而不是使用 Sleep()。
-
是的,我正在使用控制台,但感谢您的关注。更新了我的帖子以使其更加清晰。