当前位置: 首页 > 知识库问答 >
问题:

Java国际象棋:不确定如何正确克隆

仉洲
2023-03-14
  1. 克隆当前板
  2. 采取行动
  3. 查看移动玩家是否处于检查中
  4. 如有,则不允许移动;否则,允许移动

我从这里获得关于如何克隆的提示:http://www.jusfortechies.com/java/core-java/cloning.php

现在,board对象由一个2D方形对象数组组成。每个方形对象都有一个piece字段,该字段要么为null(上面没有piece),要么引用一个piece对象(上面有一个piece)。board对象还有一个whiteKingSquare和一个blackKingSquare(都是方形对象),以便更快/更容易地定位白王或黑王。

public Object clone() throws CloneNotSupportedException {
    Board clonedBoard = (Board) super.clone();
    for (int i = 0; i < HEIGHT; i++) {
        for (int j = 0; j < WIDTH; j++) {
            clonedBoard.myBoard[i][j] = new Square(this, i, j); 
            clonedBoard.whiteKingSquare = myBoard[7][4];
            clonedBoard.blackKingSquare = myBoard[0][4];
        }
    }
    return clonedBoard; 
}
public Object clone() throws CloneNotSupportedException {
    return (Square) super.clone();
}
public Object clone() throws CloneNotSupportedException {
    return (Piece) super.clone();
}

关于问题:

  1. 这看起来大致正确吗?
  2. 我的方形对象也有一个Board字段,它基本上让我引用它们所属的Board。这会不会影响我的克隆尝试,让我的64个方块中的每一个分别克隆木板?

共有1个答案

华凯捷
2023-03-14

我有一个替代的解决方案,看看你喜不喜欢这个。

不需要使用克隆!我前阵子写了一个中国象棋程序。让我解释一下我做了什么:(这只是一个大纲,你得自己做细节)

我有一个pieces的2D数组和另一个按钮的2D数组。当用户单击某个片段时,Piece类中的抽象方法getValidLocations将被调用,该方法返回一组坐标,以指示Piece的位置。当用户单击按钮时,片断被移动到按钮的位置。

 类似资料:
  • 上面的代码显示了一个可以上下移动的部分的示例。这不是一个有效的棋步。所以,如果我要移动一个皇后,我该怎么做呢?我们只是假设我们已经有了一个矩阵(x,y)8×8的板。

  • DreamChess 是一款开放源码、跨平台(可在 Windows、Mac OS X 及 Linux 上运行)的 3D 国际象棋游戏。该游戏包含自身的引擎 Dreamer,提供各种国际象棋棋盘,并具有背景音乐及声效等其他附属功能。

  • 问题内容: 我有一个物体。我想将其复制为对象,这样更改就不会修改。我意识到,复制从内置JavaScript对象派生的对象将导致额外的不需要的属性。这不是问题,因为我正在复制自己的文字构造对象之一。 如何正确克隆JavaScript对象? 问题答案: 在JavaScript中对任何对象执行此操作都不是简单或直接的。您将遇到错误地从对象的原型中获取应该留在原型中而不应复制到新实例的属性的问题。例如,如

  • 我已经有一个Board对象,包含一个碎片列表。Piece是一个抽象类,有一个位置(x,y)和一个颜色(黑色或白色)。然后是King、Queen、Knight这三个类,实现了Piece类。 谢谢

  • 我正在下国际象棋,除了一件事,我几乎得到了所有的东西:我需要使棋手不可能将棋子移动到棋盘上。我很难解决这个问题。 我现在用伪代码生成的有效移动是:类getMoveLocations(我定义了一个位置为国际象棋中的一个方块):如果这个位置在边界内,这个位置的棋子是敌人的棋子,并且模拟的移动不会导致棋盘被检查,然后将该位置添加到工件可以移动到的可能位置。 问题是我如何检查棋盘是否“在检查中”。在我的代

  • 我正在使用在固定深度工作的alpha-beta修剪算法对Chess AI进行编程。我相当惊讶地看到,通过将AI设置为更高的深度,它玩得更糟。但我认为我想通了为什么会这样。 它目前是这样工作的:所有的职位都被列出来了,对于每个职位,其他的职位都会被列出来,以此类推。。。直到达到固定深度:通过检查存在哪些工件,并为每种工件类型设置一个值来评估电路板。然后,使用带有alpha-beta的minimax算