使用克隆进行Alpha-beta修剪在Java中不起作用

使用克隆进行Alpha-beta修剪在Java中不起作用,java,algorithm,alpha-beta-pruning,Java,Algorithm,Alpha Beta Pruning,我想在我的奥赛罗游戏中模拟我的AI的下一步,但它不只是返回下一步,而是在原始棋盘上进行所有动作,而不是在克隆人上进行模拟,游戏结束 public class GameState implements Cloneable{ private Node[][] board; // Game board private int scorePlayer, scoreAI; // Player scores ( will start at 0 ) private

我想在我的奥赛罗游戏中模拟我的AI的下一步,但它不只是返回下一步,而是在原始棋盘上进行所有动作,而不是在克隆人上进行模拟,游戏结束

public class GameState implements Cloneable{
private Node[][] board;                 // Game board
private int scorePlayer, scoreAI;       // Player scores ( will start at 0 )
private ArrayList<Node> validNodes;     // List holding all nodes possible to add pieces to 

/**
 * Creates the game state
 */
public GameState(){
    // create size x size board
    this.board = new Node[Setting.BOARD_SIZE][Setting.BOARD_SIZE];
    validNodes = new ArrayList<>();
    scorePlayer = 0;
    scoreAI = 0;

protected GameState clone() {
    return new GameState(this);
}------------------------ CLONE METHOD----------------



public int search(GameState board, Player player, int alpha, int beta, int depth, ScoreEval function) {
    int record = Integer.MIN_VALUE;
    Node maxMove = null;
    int result;

    GameState subBoard = board.clone();
    if (depth <= 0 || board.getValidMoves().size()==0) {
        record = function.evaluate(board, player);
    } else {
    ArrayList<Node> possibleMoves = board.getValidMoves();
        if (!possibleMoves.isEmpty()) {
            for (int i =0; i<possibleMoves.size();i++) {
                Node nod = possibleMoves.get(i);
                subBoard = board.clone();
                subBoard.setPiece(nod.x,nod.y, player.type);
                if(player.type==Setting.TILE_AI){
                    result = -search(subBoard, aiAss1.Controller.pHum, alpha, beta, depth - 1, function);
                }
                else{
                    result = -search(subBoard, aiAss1.Controller.pAI, alpha, beta, depth - 1, function);
                }

            if (result > record) {
                    record = result;
                    maxMove = nod;
                }
            }
        } else {
            record = -search(subBoard, player, alpha, beta, depth - 1, function);
        }
    }
    bestMove = maxMove;
    return record;
}
公共类游戏状态实现可克隆{
专用节点[][]板;//游戏板
private int scorePlayer,scoreAI;//玩家分数(将从0开始)
private ArrayList validNodes;//包含所有可能向其中添加片段的节点的列表
/**
*创建游戏状态
*/
公共游戏状态(){
//创建尺寸为x的板
this.board=新节点[Setting.board_SIZE][Setting.board_SIZE];
validNodes=新的ArrayList();
记分员=0;
得分ai=0;
受保护的游戏状态克隆(){
返回新的游戏状态(此);
}------------------------克隆法----------------
公共整数搜索(游戏状态板、玩家、整数alpha、整数beta、整数深度、计分功能){
int记录=Integer.MIN\u值;
节点maxMove=null;
int结果;
游戏状态子板=board.clone();

如果(depth尝试将您的逻辑分解为多个部分,将每个部分放在一个单独的方法中。然后为每个部分编写一个单元测试,并检查每个部分是否符合您的要求


这是您编写软件的方式。

您确定要复制电路板的内部状态吗?(所有可变对象)您的
克隆()
方法看起来失败了。你很可能正在创建一个浅拷贝。为
GameState
@Kayaman添加你的
clone
实现可能是正确的。但是你真的需要克隆整个棋盘吗?反向移动不是会更有效吗?尝试了----protectedgamestate clone()抛出CloneNotSupportedException{GameState=(GameState)super.clone();return state;}但是dint work eit我只是分享一些与我的问题相关的代码,问题似乎是克隆只返回一个浅拷贝,克隆的语义不清楚,最好避免。如果你想要一个深度克隆,请编写一个deepClone()方法。