当2D数组存储的对象从未被寻址时,它如何更改值



我正在对国际象棋进行编码,并创建了一个名为BoardObject的类来存储棋盘状态,因此我可以拥有它们的列表,从而创建游戏历史。BoardObject有一个名为boardValues的字段,它是一个2D数组,用于存储板上每个正方形的值。

在我玩游戏的while循环中,如果用户输入通过了我的有效性检查,他们输入的移动将被传递到一个名为movePieceTrad的方法中。在movePieceTrad过程中,列表板History会以某种方式进行更改,以根据刚才的移动进行更新。问题是:movePieceTrad中没有任何一个是boardHistory或任何boardObject。我已经用ctrl+f看了一遍,每一个对boardHistory的引用都在主方法中。

在下面的代码中,当我调试时,lastInBoardHistory2与movePieceTrad之前的lastInBoard History1不同,但当我通过movePieceTrad时,lastInBoardHistory1也发生了变化,这再次毫无意义。发生了什么事?

lastInBoardHistory1 = boardHistory[boardHistory.Count - 1].getBoardValues();
movePieceTrad(arr[0], arr[1]);
lastInBoardHistory2 = boardHistory[boardHistory.Count - 1].getBoardValues();

这是BoardObject类的代码

namespace chess_v1
{
class BoardObject
{
private int[,] boardValues;
public int[,] possibleEnPassants;
public int[,] castlePiecesMoved;
public int turn = 0;
public BoardObject(int[,] squareValues, int[,] pep, int[,]castleInfo, int inputTurn)
{
boardValues = squareValues;
possibleEnPassants = pep;
castlePiecesMoved = castleInfo;
turn = inputTurn;
}
public int[,] getBoardValues()
{
return boardValues;
}
}
}

好的,我已经解决了。

构造BoardObject时,我传入输入的2D数组,并简单地将它们设置为BoardObject中的字段2D数组。由于2D数组是对内存中位置的引用数组,而不是自包含的数组,这意味着最终我只是将主方法板中的引用传递到每个BoardObject中的字段。因此,当我移动一块(在主方法的板内更改值(时,BoardObject,实际上是每个BoardObject也发生了变化。

修复方法是,我没有在BoardObject的构造函数中传递引用数组,而是传递嵌套for循环的值。我已经测试了在这个问题之前应该工作的功能,现在一切都很好!

这是新的BoardObject代码;除此之外,我不需要更改任何内容:

namespace chess_v1
{
class BoardObject
{
public int[,] boardValues = new int[8,8];
public int[,] possibleEnPassants = new int[8,2];
public int[,] castlePiecesMoved = new int[2,3];
public int turn = 0;
public BoardObject(int[,] squareValues, int[,] pep, int[,]castleInfo, int inputTurn)
{
for (int i = 0; i < 8; i++)
{
for (int k = 0; k < 8; k++)
{
boardValues[i, k] = squareValues[i, k];
}
}
for (int i = 0; i < 8; i++)
{
for (int k = 0; k < 2; k++)
{
possibleEnPassants[i, k] = pep[i, k];
}
}
for (int i = 0; i < 2; i++)
{
for (int k = 0; k < 3; k++)
{
castlePiecesMoved[i, k] = castleInfo[i, k];
}
}
turn = inputTurn;
}
}
}

最新更新