2014-03-07 90 views
0

我想用chess.js庫創建國際象棋AI。我正在使用Alpha-Beta修剪的minimax解決方案,但由於某種原因,當程序運行時,即使深度達到0後它仍會繼續。有誰能告訴我爲什麼嗎?無限遞歸 - Javascript minimax

var Buddha = function() { 

    this.movehistory = 0; 
    this.color = "b"; 
    this.opp = "w"; 


    this.minimax = function(board, depth, alpha, beta) { 
    console.log(depth); 
    if(depth === 0 || board.game_over() === true) { 
     console.log("Depth == 0"); 
     return [this.eval_board(board), null] 
    } else { 
     if(board.turn() === this.color) { 
     var bestmove = null 

     var possible_moves = board.moves() 
     for (index = 0; index < possible_moves.length; ++index) { 
      var new_board = new Chess(board.fen()); 
      new_board.move(possible_moves[index]) 

      var mini = this.minimax(new_board, --depth, alpha, beta) 
      var score = mini[0]; 
      var move = mini[1]; 

      if(score > alpha) { 
      alpha = score; 
      bestmove = possible_moves[index]; 
      if(alpha >= beta) { 
       break; 
      } 
      } 
     } 
     return [alpha, bestmove] 
     } else if(board.turn() === this.opp) { 
     var bestmove = null 

     var possible_moves = board.moves() 
     for (index = 0; index < possible_moves.length; ++index) { 
      var new_board = new Chess(board.fen()); 
      new_board.move(possible_moves[index]) 

      var mini = this.minimax(new_board, --depth, alpha, beta) 
      var score = mini[0]; 
      var move = mini[1]; 

      if(score < beta) { 
      beta = score; 
      bestmove = possible_moves[index]; 
      if(alpha >= beta) { 
       break; 
      } 
      } 
     } 
     return [beta, bestmove] 
     } 
    } 
    } 

    this.eval_board = function(board) { 
    if(board.in_check()) { 
     if(board.turn() == this.opp) { 
     return Number.POSITIVE_INFINITY; 
     } else { 
     return Number.NEGATIVE_INFINITY; 
     } 
    } else if(board.in_checkmate()) { 
     if(board.turn() == this.opp) { 
     return Number.POSITIVE_INFINITY; 
     } else { 
     return Number.NEGATIVE_INFINITY; 
     } 
    } else if(board.in_stalemate()) { 
     if(board.turn() == this.opp) { 
     return Number.POSITIVE_INFINITY; 
     } else { 
     return Number.NEGATIVE_INFINITY; 
     } 
    } 
    } 

    this.move = function(board) { 
    var bestmove = this.minimax(board, 1, Number.NEGATIVE_INFINITY, Number.POSITIVE_INFINITY) 
    } 

} 

回答

2
function minimax(board, depth, alpha, beta) { 
    if(depth === 0 …) { … 
    return … 
    } else { 
    … 
    for (index = 0; index < possible_moves.length; ++index) { 
     … minimax(new_board, --depth, alpha, beta) 
//       ^^ 
    … 
    } 
    } 
} 

在這裏,我們遞減,在循環中depth。對於基本情況使用depth <= 0,和/或通過depth - 1作爲參數或在循環之前放置遞減語句。

+0

爲什麼-depth和depth-1有所作爲?他們不是在創造同樣的東西嗎? – TimCPogue

+0

編號'--depth'是[前綴遞減運算符](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Arithmetic_Operators#--_.28Decrement.29) - 與「depth - = 1」或「depth = depth - 1」相同。不要使用它,如果你不知道它是什麼:-) – Bergi

+0

對不起,我不是很擅長Javascript。我更像一個蟒蛇人。我認爲他們都做了同樣的事情。謝謝! – TimCPogue