繁体   English   中英

C#/ Unity-需要帮助调试我的Chess程序-在同一类的另一个实例中创建类的实例时遇到麻烦

C# / Unity - Need help debugging my Chess program - trouble creating instance of class within another instance of the same class

提示:本站收集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()的预期功能是获取列表数组。 数组中的每个列表都包含玩家棋子之一的合法移动。 但是,这实际上似乎正在更改实际的电路板数据,我不知道为什么。

  1. 当玩家尝试移动一个棋子时,游戏会中断,因为棋子不在应有的位置,软件也无法应对。 被移动的片段不会将其自身移出其旧位置(尽管我已尽力而为),这导致该对象存在两个实例,当一段代码尝试访问第17个元素时,导致indexoutofrange异常具有16个元素的数组。

如果有人能帮助我,我将不胜感激,我觉得我已经在此上浪费了整整一天,而且我确定自己缺少一些简单的东西。

我的代码的链接是https://github.com/FC123321/Chess

1 个回复

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);
1 在另一个类中创建一个类的实例时遇到问题

我有一个叫做 Heap 的类。 我正在尝试将 Heap 实例作为名为 Graph 的类中的私有成员,但这似乎不起作用。 看完这篇文章后, 如何使用构造函数在另一个类中创建对象? ,我仍然无法弄清楚为什么我不允许在类 Graph 中初始化 Heap 。 我的猜测是私有成员不能被初始化,它们只是占 ...

3 从继承的类创建实例的问题,C# unity

我创建了一个 Character 类,其中有一个构造函数,该构造函数设置了一个角色的名称,以及一个在一个文件中包含武器名称和伤害的 Weapon 结构。 然后,我在另一个名为 Paladin 的文件中创建了一个 Character 子类,其中包含一个 Weapon 类型变量和从 Character ...

5 C#在另一个类中创建一个类的实例

我有一个具有多个动态自定义用户控件的应用程序,用于收集datagridviews中的边名称和曲线偏移。 我的目标是使用某些方法将它们输入一个类中,以检索一些常见的数据组以供以后处理。 我有一个类来定义偏移量的格式(因为对于单条边和边的列表,它都是相同的),然后是另一类,将这些边分组为一个 ...

6 Unity无法访问另一个类的实例C#

头等舱 二等 } 我不知道出了什么问题。我将Armyman的脚本附加到了输入文本的同一个检查器中。我不知道出了什么问题,但是值没有改变,而且我无法访问动画师在Armyman的脚本中。它一直在控制台中显示错误是(对象引用未设置为对象实例) ...

7 C#-在另一个具有相同含义的类中创建类实例

我想创建一个名为Enemy的类,该类应在已编程的rpg主题战斗系统中使用。 问题是我想在Enemy类中创建多种怪物类型,但随后我必须为每个敌人类(例如Enemy.Goblin或Enemy.Golem的战斗系统创造一种可能性。 题: 我如何在战役系统功能中仅使用一个参数来实现这一目标? ...

8 C#让多个类共享另一个类的相同实例

有什么办法让多个类共享另一个类的相同实例? 因此,在我的C#程序中,我得到了三个类Gamelogic(A),FPSController(B)和SpawnPlayer(C)。 在我的情况下,类B和C将使用和更改A中的一些变量,以便使用这些变量,我目前在两个不同的类中实例化A,然后使用点表示 ...

9 在类中创建类的实例(C ++)

假设我有两个类:Box,Circle。 但是,让我们说在Circle类中,我想创建一个Box类的实例。 好吧,我试过这个: 我收到一个错误: 错误C2059:语法错误:'常量' ...

2011-06-13 02:53:50 2 4548   c++/ class
10 C#创建类和派生类的实例

我在c#程序中尝试了以下代码。 这仅是为了学习OOP概念。 关于上述代码,我有以下查询。 为什么我在第二行出现错误? 什么是a a1=new b() ; 为什么即使将b构造函数分配给a1也无法访问a1.testb() ? a a1=new a()和a ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM