改进基于角度的国际象棋游戏的基本AI

时间:2014-12-19 18:27:06

标签: javascript artificial-intelligence chess

我用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());   
    }
}

但是我已经把这个回复假,并允许我交付配偶。我做错了什么(谁可能想帮助我完成这个项目)?

1 个答案:

答案 0 :(得分:0)

在我发布的代码中,我觉得你并没有撤消你所做的动作。当您遍历所有可能的移动时,您进行移动,然后检查威胁。然后你应该取消移动。这可能就是为什么你的最后一次测试也没有起作用的原因。