2014-12-19 60 views
2

我已經創建了一個國際象棋遊戲,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,並允許我交付隊友。我做錯了什麼(以及誰可能想幫助我完成此項目)?

+1

儘管這是一個有趣的問題,爲什麼要用「angularjs」標記問題?它與Angular沒有任何關係。 (我正在刪除標籤) –

+0

世界國際象棋冠軍[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

+0

@xmojmr我不同意這個問題不屬於。我試圖以非常有限和特定的方式改進AI,並且在實現它時遇到了一個編程問題。 –

回答

0

從您發佈的代碼看來,我並沒有撤銷您所做的動作。當你循環所有可能的動作時,你做出這個動作,然後檢查威脅。你應該取消這一舉措。這可能就是爲什麼你最後一次測試不起作用。