2016-09-29 6 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()メソッドを記述します。 –

関連する問題