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

Improving rudimentary AI of Angular based chess game

本文关键字:AI 游戏 国际象棋 Angular      更新时间:2023-09-26

我用Angular和国际象棋创建了一个国际象棋游戏.js并试图改进其基本的AI。 未改进的代码目前位于:https://gist.github.com/dexygen/8a19eba3c58fa6a9d0ff(或 https://gist.githubusercontent.com/dexygen/8a19eba3c58fa6a9d0ff/raw/d8ee960cde7d30850c0f00f511619651396f5215/ng-chess(

人工智能目前包括检查计算机(黑色(是否有将死的动作(使用国际象棋.js的in_checkmate((方法(,如果是,则与人类(白色(交配,否则进行随机移动。 为了改善这一点,我认为我不应该只是随机移动,而是让人工智能检查白人对黑人反应的计数器。 然后,如果白色有将死,则不包括这些黑色响应以随机选择的移动中。

我想改进makeMove(((目前仅委托给makeRandomMove(((中的AI,但我发现这比预期的要难。 我期望能够做的是,与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());   
    }
}

但是我的回报是错误的,请允许我交付伴侣。 我做错了什么(谁可能想在这个项目上帮助我(?

在我看来,从您发布的代码来看,您并没有撤消所做的动作。当您循环浏览所有可能的移动时,您就会进行该移动,然后检查威胁。然后,您应该撤消移动。这可能就是你上次测试效果不佳的原因。