【发布时间】:2014-12-19 18:27:06
【问题描述】:
我已经使用 Angular 和 chess.js 创建了一个国际象棋游戏,并且正在尝试改进它的基本 AI。未改进的代码当前位于:https://gist.github.com/dexygen/8a19eba3c58fa6a9d0ff(或https://gist.githubusercontent.com/dexygen/8a19eba3c58fa6a9d0ff/raw/d8ee960cde7d30850c0f00f511619651396f5215/ng-chess)
人工智能目前的组成是检查计算机(黑色)是否有将棋(使用 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);
}
为了调试/测试,利用一点知识帮助,特别是尝试早期的“Scholar's Mate”,请参阅:http://en.wikipedia.org/wiki/Scholar%27s_mate。如果黑方的随机走法使这种不切实际的重新开始,机会经常出现。 Qxf7# 是在 wikipedia 文章中以及 chess.moves() 返回的学者 mate 的交配移动的符号。所以我尝试修改内部for循环如下:
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 花了几十年的时间来尝试微调一个国际象棋软件的人工智能,世界国际象棋冠军Garry Kasparov 也花费了大量时间来微调一个国际象棋软件的人工智能。我想说的是,这个问题对于单一的 Stack Overflow 答案来说可能过于宽泛,应该针对专门的国际象棋软件开发社区。也许Chess (beta) Stack Exchange?
-
@xmojmr 我不同意这个问题不属于。我正在尝试以非常有限和特定的方式改进 AI,但在实现它时遇到了编程问题。
-
好吧,我不是说要偏离主题或关闭它,我也不是要劝阻你,你有我的 +1,我只是说重定向它,考虑到你的“谁可能想在这个项目上帮助我”脚注(连接到互联网国际象棋服务器,以便它可以对抗其他国际象棋引擎等)
标签: javascript artificial-intelligence chess