我有一个叫做 Heap 的类。 我正在尝试将 Heap 实例作为名为 Graph 的类中的私有成员,但这似乎不起作用。 看完这篇文章后, 如何使用构造函数在另一个类中创建对象? ,我仍然无法弄清楚为什么我不允许在类 Graph 中初始化 Heap 。 我的猜测是私有成员不能被初始化,它们只是占 ...
提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供 中文繁体 英文版本 中英对照 版本,有任何建议请联系yoyou2525@163.com。
我正在创建一个国际象棋程序。 我决定这样做,以便在选择一块时显示所有可能的合法动作。 为了使它起作用,我必须有一种机制来预测举动的结果(例如,因为您不能采取法律行动来阻止自己的国王)。 当我开始与计算机对手打交道时,这也将非常有用,因为AI必须预先能够看到多个转弯才能做出明智的决定。
为此,我做到了这一点,以便在每个回合开始时,为玩家的棋子计算所有可能的动作,然后模拟这些可能的动作中的每一个,以查看是否使国王处于控制状态。 如果是这样,该选项将被删除。 我有一个名为BoardManager的主类,它控制视觉效果并包含实际的棋盘布局(在ChessBoardSim中),还有ChessBoardSim类,其对象每个都包含一个可能的棋盘状态。 ChessBoardSim可以创建ChessBoardSim的其他实例,从而可以预先模拟板的状态任意数量的匝数。
我有一个已经苦苦挣扎超过5个小时的错误,该错误是在我尝试重组许多代码之后出现的。 我已经快要死了,我只需要一双新鲜的眼睛。 问题在于,移动时不会将其从原来的位置上移开,并且板上某些部件的位置似乎向上方移动了两个磁贴。 我相信,基于调试,问题出在ChessBoardSim类的CalculateAllMovementOptions()中,由于某种原因,当ChessBoardSim具有ChessBoardSim子级,而CalculateAllMovementOptions()函数在子级中被调用时,它将更改父母。 我在下面提供了完整的代码,我将尽力描述特定的问题。
问题的流程是:
1:在BoardManager中调用private void Start()。
2:程序正确绘制并填充了电路板。 创建一个ChessBoardSim(称为ChessPieces)以包含当前板状态的数据。
3:在BoardManager中调用StartTurn()以开始游戏。
4:StartTurn()调用ChessPieces.CalculateAllMovementOptions()。 CalculateAllMovementOptions()的预期功能是获取列表数组。 数组中的每个列表都包含玩家棋子之一的合法移动。 但是,这实际上似乎正在更改实际的电路板数据,我不知道为什么。
如果有人能帮助我,我将不胜感激,我觉得我已经在此上浪费了整整一天,而且我确定自己缺少一些简单的东西。
Array.Clone
不创建一个数组的深层副本,所以当你调用boardLayout.Clone()
在SimulateBoard
(在又一次ChessBoardSim
构造函数),您要复制的引用boardLayout
到新阵列。 这意味着新数组中的片段与旧数组中的对象相同。
这意味着,当您在SimulateBoard
中的MovePiece
中并调用piece.SetPosition
等该复制数组的成员时, piece.SetPosition
在复制源中设置这些块的位置。
而不是使用boardLayout.Clone()
,您需要遍历整个源数组,并执行newBoardLayout[x,y] = new ChessPiece();
然后将值复制到新的ChessPiece
。 或者,您可以创建一个新的ChessPiece
构造函数,该构造函数将使用另一块棋子并将其值复制到其中:
// ChessPiece copy constructor
public ChessPiece(ChessPiece other) {
this.Position = new int[2] { other.Position[0], other.Position[1]};
this.isWhite = other.isWhite;
this.movementType = other.movementType;
this.hasMoved = other.hasMoved;
this.turnDoubleMoved = other.turnDobleMoved;
}
// instead of boardLayout.Clone() in the ChessBoardSim constructor:
for (int x=0 ; x<8;x++){
for(int y=0; y<8;y++){
if (boardLayout[x,y] != null)
this.boardLayout[x,y] = new ChessPiece(boardLayout[x,y]);
}
}
// In SimulateBoard, take out the redundant Clone call
ChessBoardSim simBoard = new ChessBoardSim(boardLayout, turnNumber);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.