2016-09-29 1 views
-1

Willst du den nächsten Zug für meine KI in meinem Othello-Spiel simulieren, aber anstatt nur den nächsten Zug zurückzugeben, macht es alle Züge auf dem Originalbrett, anstatt nur auf einem Klon zu simulieren und das Spiel endet.Alpha-Beta-Beschneidung mit Klon funktioniert nicht 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

Sind Sie sicher, dass Sie den internen Status des Boards kopieren? (alle veränderbaren Objekte) –

+1

Ihre 'clone()' Methode sieht kaputt aus. Sie erstellen höchstwahrscheinlich eine oberflächliche Kopie. – Kayaman

+0

Fügen Sie Ihre Implementierung von 'Clone' für' GameState' hinzu. – QBrute

Antwort

0

Versuchen Sie, Ihre Logik in Teile zu zerlegen, indem Sie sie in eine separate Methode einfügen. Schreiben Sie dann einen Komponententest für jedes Teil und überprüfen Sie, ob jedes Teil das Richtige für Sie ist.

So schreiben Sie Software.

+0

Ich bin nur Teilen von Code, der für meine Frage relevant ist, das Problem scheint zu sein, dass der Klon nur eine oberflächliche Kopie zurückgibt, – NosQ

+0

Die Semantik des Klons sind nicht klar, und es wird am besten vermieden. Wenn Sie einen tiefen Klon wollen, schreiben Sie eine deepClone() -Methode. –