Gobang ai: идея и реализация алгоритма минимаксного поиска и отсечения α-β (qt и c ++) (4) Простая реализация модуля kill kill

1. Что считается убийством? Почему это считается убийством?

Считать на убийство - значит убивать шахматы .

Я некоторое время использовал Gobang ai, чтобы поиграть с другими, и обнаружил, что взглянуть на 6-уровневую глубину с помощью дерева игры (имитация AI, чтобы сделать 4 шага, и имитация человека, чтобы сделать 3 шага) на самом деле недостаточно, потому что настоящий мастер можно увидеть гораздо больше, чем с 6 этажа. После того, как мастер составляет план, вначале он занимает позицию, которая кажется « не такой важной », а затем он может сформировать игру с двойным живым 3 или 4 убийством, чтобы победить ai. ИИ, который я понял, на самом деле очень недальновиден, то есть я вижу преимущества только на 6-м этаже, но не вижу более крупных общих преимуществ.

Здесь я ссылаюсь на статью этого большого человека, которая очень хороша, но я не очень хорошо ее понимаю, и я могу написать ее только на основе моего собственного понимания: пятая статья Gobang AI Algorithm-Counting Kill .

Как сделать так, чтобы компьютер «планировал»? Идея простая - убить. Легко подумать, что подсчет убийств - это просто игра с убийствами. Легко подумать, что подсчет убийств - это еще и минимаксный поиск . Просто вам не нужно учитывать 10 узлов (ранее реализовано). Вам нужно только рассмотрите убивающий узел белого (ai) (чтобы сформировать новый). Если черный равен 5, live 4, punch 4, live 3), черные рассматривают только лучший узел, тогда количество ветвей b значительно уменьшается , а глубина поиска может достигать более 16 слоев (многие из них не могут быть найдены для 16 слоев, потому что нет таких узлов More kill), до достижения глубины поиска, пока один узел белый побеждает, он будет успешным даже если его убьют. Это просто реализованный мной модуль count kill.

Реализованная мною функция вычисления убийств относительно проста, но она еще больше улучшила шахматную мощь.

Во-вторых, конкретная реализация

Сначала вычислите уничтожение. Если уничтожение прошло успешно, используйте точку уничтожения. Если оно не удалось, используйте точку, найденную в исходном 6-уровневом минимаксном поиске .

Первый - найти точку убийства белых.

QList<QPoint> chessAi::seek_kill_points(int (*board)[15]){
    
    //找白棋的连5,活4,冲4,活3的杀棋位置
    QList<QPoint> pointList;

    POINTS P=seekPoints(board);//一般来说,能冲4或者活3的必在评分前20的点内

    int sameBoard[15][15];
    copyBoard(board,sameBoard);

    for(int i=0;i<20;++i){
    
    
        sameBoard[P.pos[i].x()][P.pos[i].y()]=C_WHITE;//模拟落子
        if(evaluate(sameBoard).STAT[WIN]>0){
    
    //产生连5
            pointList.append(P.pos[i]);
        }else if(evaluate(sameBoard).STAT[FLEX4]>evaluate(board).STAT[FLEX4]){
    
    //产生新活4
            pointList.append(P.pos[i]);
        }else if(evaluate(sameBoard).STAT[BLOCK4]>evaluate(board).STAT[BLOCK4]){
    
    //产生新冲4
            pointList.append(P.pos[i]);
        }else if(evaluate(sameBoard).STAT[FLEX3]>evaluate(board).STAT[FLEX3]){
    
    //产生新活3
            pointList.append(P.pos[i]);
        }
        sameBoard[P.pos[i].x()][P.pos[i].y()]=C_NONE;//还原落子
    }
    return pointList;
}

Простой расчет убить модуль :

struct EVALUATION{
    
    
    int score;
    gameResult result;
    int STAT[8];//储存部分棋形的个数,下标WIN=1为白连5,LOSE=2为黑连5,FLEX4=3为白活4,BLOCK4=5为白冲4,FLEX3=7为白活3
};
struct POINTS{
    
    //最佳落子位置,[0]分数最高,[19]分数最低
    QPoint pos[20];
    int score[20];//此处落子的局势分数
};
struct DECISION{
    
    
    QPoint pos;//位置
    int eval;//对分数的评估
};

DECISION decision;

bool chessAi::analyse_kill(int (*board)[15], int depth){
    
    
    EVALUATION EVAL=evaluate(board);
    if(depth==0||EVAL.result!=R_DRAW){
    
    
        if(depth==0){
    
    //若抵达最深层,走一步对白棋的最好位置,若白棋还没赢则返回false
            POINTS P;
            P=seekPoints(board);            
            board[P.pos[0].x()][P.pos[0].y()]=C_WHITE;

            gameResult result=evaluate(board).result;
            if(result==R_WHITE)return true;
            else return false;
        }else if(EVAL.result==R_WHITE)return true;//找到白棋杀棋
        else return false;//白棋输
    }else if(depth%2==0){
    
    //max层,我方(白)决策
        QList<QPoint> pointList=seek_kill_points(board);//产生杀棋点

        if(pointList.length()==0)return false;//没有杀棋点
        for(auto i:pointList){
    
     
            int sameBoard[15][15];
            copyBoard(board,sameBoard);

            sameBoard[i.x()][i.y()]=C_WHITE;//模拟己方落子
            if(analyse_kill(sameBoard,depth-1)){
    
    
                if(depth==16){
    
    //开始层,需决定落子,结果存于decision中
                    decision.pos.setX(i.x());
                    decision.pos.setY(i.y());
                    decision.eval=INT_MAX;//杀棋评分没有作用
                }
                return true;
            }
        }
        return false;
    }else{
    
    //min层,敌方(黑)决策,只下对自己最好的棋
        int rBoard[15][15];
        reverseBoard(board,rBoard);
        POINTS P=seekPoints(rBoard);//找对于黑子的最佳位置,需要将棋盘不同颜色反转,因为seekPoint是求白色方的最佳位置

        int sameBoard[15][15];
        copyBoard(board,sameBoard);

        sameBoard[P.pos[0].x()][P.pos[0].y()]=C_BLACK;//模拟敌方落子:只走最好的一步
        //无需剪枝
        return analyse_kill(sameBoard,depth-1);
    }
}

//调用
if(!ai.analyse_kill(ai.chesses,16)){
    
    
     qDebug()<<"没找到杀棋";
     ai.analyse(ai.chesses,6,-INT_MAX,INT_MAX);
}else{
    
    
     qDebug()<<"找到了杀棋";
}

конец

Простое написание модуля, убивающего счет, по-прежнему улучшает некоторые шахматные навыки.

Знание игры в шахматы все еще стоит изучать. Когда я искал информацию на Zhiwang.com, я обнаружил, что могу использовать Гомоку ай в качестве магистерской диссертации. Прочитав ее, я почувствовал это. . Обзор отечественной газеты действительно более водянистый. Настоящие мастера на GitHub!

рекомендация

отblog.csdn.net/livingsu/article/details/104655537