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
裝飾器聲明變量?
它不應該做一個深層複製。它應該像所有對象一樣工作,並傳遞參考。 –
我怎樣才能做出深層次的複製?我不想修改原始對象。 – TimCPogue
查看**相關**標題下的某些右側鏈接。 –