gpt4 book ai didi

c# - 撤消不使用一堆二维数组

转载 作者:行者123 更新时间:2023-11-30 21:37:34 25 4
gpt4 key购买 nike

所以我有一个有效的跳棋游戏(如果您愿意,也可以是草稿),并且我正在尝试实现一个简单的撤消功能。我将我的棋盘存储在一个二维数组中,我试图在玩家移动之前使用堆栈来存储棋盘,如果选择了撤消,则棋盘只会从堆栈中弹出并重新绘制。

这是我的撤销类

class Undo
{
Stack<string[,]> prevMoves = new Stack<string[,]>();

public Stack<string[,]> PrevMoves
{
get
{
return prevMoves;
}
set
{
prevMoves = value;
}
}

public void AddCurrentBoardState(string[,] boardArray)
{
PrevMoves.Push(boardArray);
}

public string UndoMessage()
{
string choice;
Console.WriteLine(" Press Enter to End your Turn or Press U to Undo");
return choice = Console.ReadLine().ToUpper();
}

public string[,] UndoMove()
{
return PrevMoves.Pop();
}

在我为玩家做任何事情之前,我将当前数组压入堆栈

Undo.AddCurrentBoardState(BoardArray);

然后我移动玩家并绘制更新的棋盘

playerOne.Move(BoardArray, piece, move, playerOne);
PlayerOneMoveCount.countmoves();
Board.DrawBoard(BoardArray, PlayerOneMoveCount, PlayerTwoMoveCount);

我现在尝试实现我的撤销

string choice = Undo.UndoMessage();

if (choice == "U")
{
BoardArray= Undo.UndoMove();
Board.DrawBoard(BoardArray, PlayerOneMoveCount, PlayerTwoMoveCount);
}

当上面的位运行时,它会在玩家移动后打印更新的棋盘,而不是在玩家移动之前被插入堆栈的原始棋盘。

我已经尝试将原始板拉入一个新的二维阵列,但它仍然拉动了新的更新板

if (choice == "U")
{
string[,] originalBoard= new string[8, 10];
originalBoard = Undo.UndoMove();
Board.DrawBoard(originalBoard, PlayerOneMoveCount, PlayerTwoMoveCount);
}

为什么新更新的板不断打印?

PS 我不是在找人编写解决方案,这是类(class)作业,我只是想了解为什么相同的原始电路板不断打印而不是我插入堆栈的电路板的逻辑,它开始提供我头疼

最佳答案

这一行很可能是您的问题:Undo.AddCurrentBoardState(BoardArray);

考虑一下您在这里作为参数传递的内容。您是真的通过了董事会状态...还是您实际上只是将引用传递给您的董事会状态?

了解 reference types here .基本上,您目前是在说,将我的状态数组的地址“x”压入堆栈。所以除非你 copy your array在调用此函数之前,您将一遍又一遍地插入“x”,因此 Undo.UndoMove() 将返回 x。

当您尝试减少此处的代码时,您正在做一些额外的奇怪任务。我有点明白你想做什么,但我的评论显示了实际发生的事情

// Create new array on adress y, store adress y in originalBoard
string[,] originalBoard= new string[8, 10];
// replace y inoriginalBoard with x from my stack, y is now lost forever
originalBoard = Undo.UndoMove();

要保存你的状态,做这样的事情(未经测试)

// Create array on adress y
var currentState = new string[8, 10];
// Copy all contents of array on adress x to array on adress y
Array.Copy(BoardArray, currentState, 8 * 10)
// Save adress y on your undo stack
Undo.AddCurrentBoardState(currentState);

关于c# - 撤消不使用一堆二维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47110738/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com