我已經創建了一個國際象棋遊戲,Angular和chess.js,並且試圖改進它的基本AI。未改進的代碼目前生活在:https://gist.github.com/dexygen/8a19eba3c58fa6a9d0ff(或https://gist.githubusercontent.com/dexygen/8a19eba3c58fa6a9d0ff/raw/d8ee960cde7d30850c0f00f511619651396f5215/ng-chess)改進基於角度的國際象棋遊戲的基本AI
目前AI的組成部分是檢查計算機(黑色)是否有移動checkmates(使用chess.js的in_checkmate()方法),以及如果是這樣,交配人類(白色),否則隨機移動。爲了改善這一點,我認爲,不僅僅是隨機移動,我會讓AI檢查白色的計數器,以黑色的響應。然後,如果懷特有將軍,不包括那些黑色反應在隨機選擇的動作中。
我想改進makeMove()中的AI(目前僅僅代表makeRandomMove()),但我發現這比預期的更難。我期望能夠做的是,與mateNextMove()(參見要點的第155-168行)不同,檢查循環中的in_checkmate(),除了循環將嵌套以解釋黑色響應和這些迴應的白色計數器。
這是我第一次嘗試做我期望的工作,但是在可能的情況下不會避免將死。
function makeMove(responses) {
var evaluator = new Chess();
var response;
var allowsMate;
var counters = [];
var candidates = [];
for (var i=0, n=responses.length; i<n; i++) {
response = responses[i];
allowsMate = false;
evaluator.load(chess.fen());
evaluator.move(response);
counters = evaluator.moves();
//console.log(evaluator.ascii());
//console.log(counters);
for (var j=0, k=counters.length; j<k; j++) {
evaluator.move(counters[j]);
if (evaluator.in_checkmate()) {
//console.log('in_checkmate');
allowsMate = true;
break;
}
}
if (!allowsMate) {
candidates.push(response);
}
}
return makeRandomMove(candidates);
}
爲了調試/測試採取的小知識優勢幫助,特別是在嘗試早期的「學者的伴侶」,請參閱:http://en.wikipedia.org/wiki/Scholar%27s_mate。如果布萊克的隨機行動使得這種不切實際的行爲剛剛開始,那麼機會就會經常出現。 Qxf7#是維基百科文章中的學者隊友的交配符號,也是由chess.moves()返回的符號。所以我試圖修改內循環如下:
for (var j=0, k=counters.length; j<k; j++) {
evaluator.move(counters[j]);
if (counters[j] == 'Qxf7#') {
console.log(evaluator.in_checkmate());
}
}
但我已經有了這個返回false,並允許我交付隊友。我做錯了什麼(以及誰可能想幫助我完成此項目)?
儘管這是一個有趣的問題,爲什麼要用「angularjs」標記問題?它與Angular沒有任何關係。 (我正在刪除標籤) –
世界國際象棋冠軍[Mikhail Botvinnik](http://en.wikipedia.org/wiki/Mikhail_Botvinnik#Computer_chess)花了幾十年時間,試圖微調國際象棋軟件和世界象棋Champion [Garry Kasparov](http://en.wikipedia.org/wiki/Kasparov_Chessmate)花費大量時間通過微調一個象棋軟件的AI。我想說的是,這個問題對於單個堆棧溢出的答案可能太寬泛了,應該直接指向專門的象棋軟件開發社區。也許[國際象棋(測試版堆棧交換)](http://chess.stackexchange.com)? – xmojmr
@xmojmr我不同意這個問題不屬於。我試圖以非常有限和特定的方式改進AI,並且在實現它時遇到了一個編程問題。 –