我用Angular和chess.js创建了一个国际象棋游戏,并且正在尝试改进它的基本人工智能。目前尚未改进的代码位于:https://gist.github.com/dexygen/8a19eba3c58fa6a9d0ff(或https://gist.githubusercontent.com/dexygen/8a19eba3c58fa6a9d0ff/raw/d8ee960cde7d30850c0f00f511619651396f5215/ng-chess)
AI目前包含的是检查计算机(黑色)是否有移动的检查员(使用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循环:
for (var j=0, k=counters.length; j<k; j++) {
evaluator.move(counters[j]);
if (counters[j] == 'Qxf7#') {
console.log(evaluator.in_checkmate());
}
}
但是我已经把这个回复假,并允许我交付配偶。我做错了什么(谁可能想帮助我完成这个项目)?
答案 0 :(得分:0)
在我发布的代码中,我觉得你并没有撤消你所做的动作。当您遍历所有可能的移动时,您进行移动,然后检查威胁。然后你应该取消移动。这可能就是为什么你的最后一次测试也没有起作用的原因。