游戏开发求助:Move方法执行后Previous GameBoard对象意外变更
解决GameBoard Move方法修改原棋盘的问题
嘿,这问题我太熟了!你碰到的是引用类型的经典陷阱——数组属于引用类型,当你把Previous棋盘传入方法时,你拿到的其实是它的内存地址引用。如果直接在这个引用上修改值,原对象肯定会跟着变,完全不是你想要的“返回新棋盘、原棋盘不动”的效果。
要解决这个问题,核心思路就是:先创建旧棋盘的完整副本,然后在副本上执行落子操作,最后返回这个副本,绝对不碰原棋盘一下。
给你写个具体的实现示例,假设你的棋盘是二维数组int[,](毕竟三连棋是3x3的,你说的int[2]应该是笔误啦):
public int[,] Move(int player, int row, int col, int[,] previousBoard) { // 第一步:先复制旧棋盘的所有元素到新数组里 int boardRows = previousBoard.GetLength(0); int boardCols = previousBoard.GetLength(1); int[,] nextBoard = new int[boardRows, boardCols]; // 逐个元素复制,确保新数组和旧数组完全独立 for (int i = 0; i < boardRows; i++) { for (int j = 0; j < boardCols; j++) { nextBoard[i, j] = previousBoard[i, j]; } } // 第二步:在新棋盘上执行落子(记得先检查位置是否为空,避免覆盖) if (nextBoard[row, col] == 0) // 假设0代表空位置 { nextBoard[row, col] = player; } // 第三步:返回全新的棋盘 return nextBoard; }
如果你的棋盘是一维数组(比如把3x3展开成9个元素的int[]),可以用更简洁的Array.Copy来复制:
public int[] Move(int player, int position, int[] previousBoard) { int[] nextBoard = new int[previousBoard.Length]; Array.Copy(previousBoard, nextBoard, previousBoard.Length); if (nextBoard[position] == 0) { nextBoard[position] = player; } return nextBoard; }
为什么这样就行?因为我们新建了一个完全独立的数组对象,所有操作都在这个新对象上进行,原previousBoard的内存里的数据完全没被碰过,自然不会发生意外变更。
另外补充一句:如果以后你的棋盘变成更复杂的对象(比如包含自定义类的数组),那可能需要深拷贝,但现在是int数组(值类型元素),这种浅拷贝(复制每个元素)就完全够用啦。
内容的提问来源于stack exchange,提问作者Ewout Desmet
相关产品推荐
相关产品推荐

