2016-09-29 63 views
-1

想要在我的othello游戏中模拟我的AI的下一步行动,但不是仅仅返回下一步,而是在原板上进行所有动作,而不是模拟克隆游戏结束。Alpha-beta修剪与克隆不工作Java

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; 
} 
+2

你确定你正在复制电路板的内部状态吗? (所有可变对象) –

+1

你的'clone()'方法看起来很糟糕。你最有可能创建一个浅拷贝。 – Kayaman

+0

为'GameState'添加'clone'的实现# – QBrute

回答

0

试着把你的逻辑分解成部分,把每个部分放在一个单独的方法中。然后为每个部分编写一个单元测试,并检查每个部分是否做你想要的。

这就是你应该如何编写软件。

+0

我只是分享与我的问题相关的代码位,问题似乎是克隆只返回浅拷贝, – NosQ

+0

克隆的语义不清晰,最好避免。如果您想要深度克隆,请编写deepClone()方法。 –