2014-03-07 80 views
0

我有一個Javascript類,我需要克隆來創建與alpha beta beta修剪在javascript中的極小算法。但是,當我將電路板對象傳遞給極小極小函數時,它應該深度複製電路板對象然後進行更改,但它會更改原始電路板。它爲什麼這樣做?對象沒有得到克隆 - Javascript

var Buddha = function() { 

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

    this.clone = function(board) { 
    return $.extend(true, {}, board) 
    } 

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

     var possible_moves = board.moves() 
     for (index = 0; index < possible_moves.length; ++index) { 
      var new_board = this.clone(board) 
      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() === "b") { 
     var bestmove = null 

     var possible_moves = board.moves() 
     for (index = 0; index < possible_moves.length; ++index) { 
      var new_board = this.clone(board) 
      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) { 
    console.log(board.fen()); 
    var bestmove = this.minimax(this.clone(board), 8, Number.POSITIVE_INFINITY, Number.NEGATIVE_INFINITY) 

    console.log(board.fen()); 
    } 

} 

控制檯日誌的輸出是:

rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1 
R2r1b2/2q1k1p1/2n4n/2P2Q2/8/8/4K2P/1NBQ1BNR b - - 30 55 

我模塊使用chess.js API來自:https://github.com/jhlywa/chess.js


編輯:我已經縮小到克隆功能克隆棋功能正確。是否因爲國際象棋函數沒有用this裝飾器聲明變量?

+0

它不應該做一個深層複製。它應該像所有對象一樣工作,並傳遞參考。 –

+0

我怎樣才能做出深層次的複製?我不想修改原始對象。 – TimCPogue

+1

查看**相關**標題下的某些右側鏈接。 –

回答

0

chess.js庫靜態地創建它的變量。難以克隆對象。幸運的是,國際象棋對象允許FEN變量被傳遞。允許我像這樣克隆板子:

var clonedBoard = new Chess(oldBoard.fen()); 

這可以防止修改原板。