【问题标题】:C# Using A Queue to Store multiple 2D ArraysC# 使用队列存储多个二维数组
【发布时间】: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()。
  • 是的,我正在使用控制台,但感谢您的关注。更新了我的帖子以使其更加清晰。

标签: c# arrays queue


【解决方案1】:

“当你将板子加入队列进行重播时,你需要克隆它。问题是当你将一个板子状态加入队列时,你实际上是在加入一个指向代表该板子的数据的指针。” ——萨姆纳·埃文斯

replay.Enqueue(board.Clone);

然后会解决问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-10
    • 1970-01-01
    • 1970-01-01
    • 2016-10-14
    • 1970-01-01
    • 2015-07-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多