Эта статья о том, как я "учил" Алису (голосовой помощник Яндекса) играть в Шахматы.

Сидишь в кресле, закрыв глаза, и одновременно играешь в Шахматы...
Без доски, без монитора, ничего не трогая руками, все только в голове - такая была первоначальная идея, и Алиса подошла как раз наилучшим образом.

Движок

А никакого движка )
С просторов интернета был скачан код chess.js - по сути, библиотека доступных ходов и статусов партии.

Соответствующая команда дает список доступных ходов:

moves = chess.moves();

и дальше вокруг этого можно накрутить все что угодно.

Уровень 1

Самое простое - ходить случайным образом, просто по правилам, то есть выбрать случайный ход из списка доступных.

move = moves[Math.floor(Math.random() * moves.length)];
chess.move(move);

Уровень 2

Добавлена оценка позиции по общей ценности фигур.

function evaluateBoard (fen) {
    fen = fen.replace(/ .+$/, '');
    fen = fen.replace(/([1-8])/g, '');    
    var totalEvaluation = 0;
    for (var i = 0; i < fen.length; i++) {
        var field = fen.substr(i,1);
        if ( field != '/') {
            totalEvaluation = totalEvaluation + getPieceValue(field);
        }
    }
    return totalEvaluation;    
}    

function getPieceValue (field) {
    if (field == null) {return 0;  }    
    if (field == 'p') { return -10; }
    if (field == 'r') { return -50; }
    if (field == 'n') { return -30; }
    if (field == 'b') { return -30; }
    if (field == 'q') { return -90; }
    if (field == 'k') { return -900; }

    if (field == 'P') { return 10; }
    if (field == 'R') { return 50; }
    if (field == 'N') { return 30; }
    if (field == 'B') { return 30; }
    if (field == 'Q') { return 90; }
    if (field == 'K') { return 900; }               
}

И теперь определяется максимальная оценка по всем доступным ходам:

fen = $session.fen; 

var bestMove = null;
var bestValue = -9999;  
var bestMoves = new Array (); // Массив лучших ходов с одинаковой оценкой

var chess = new Chess(fen);
var newGameMoves = chess.moves(); // Легальные ходы

for(var i = 0; i < newGameMoves.length; i++) { // Идет перебор легальных ходоа
    var newGameMove = newGameMoves[i];
    chess.move(newGameMove);
    if ( chess.turn() == 'b' ) { var boardValue = evaluateBoard(chess.fen()); }
        else { var boardValue = -evaluateBoard(chess.fen()); }
    
    // Если значение равно лучшему, то добавляем в массив
    if ( boardValue == bestValue) {
        bestMoves.push(newGameMove);
    } 
    
    // Если значение лучше лучшего, то обнуляем массив и создаем заново
    if(boardValue > bestValue) {
        bestValue = boardValue;
        bestMoves = [];
        bestMoves.push(newGameMove);
        bestMove = newGameMove;
    }   
    chess.undo();
}

# Выбираем ход, случайный из списка лучших   
move = bestMoves[Math.floor(Math.random() * bestMoves.length)];    

# делаем ход
chess.move(move);

В результате для игры без доски, а также для тренировки памяти и мозга оказалось вполне удобно )

Что дальше

Навык находится в публичном доступе, на него заходят и даже играют )

Лично я начинаю "теряться" где-то вокруг 10-го хода, а в логах навыка встречаются партии и по 20+ ходов, и по 30+, есть даже за 57 и за 65, то есть даже с оценкой одного хода игра идет.

Похоже, пора ставить минимакс и считать еще на несколько ходов )


Активационная фраза:
Алиса, давай сыграем в Шахматы с Интеллектом

Комментарии (3)


  1. IT-GOMETUR
    00.00.0000 00:00
    +1

    Хмм, интересная идея для проекта. Проси чтобы её добавили как обычную команду или мини-игру)


  1. vics001
    00.00.0000 00:00
    +1

    А буквально вчера видел видео ChatGPT против Lichess - https://www.youtube.com/watch?v=DC4B-LWpt88. Мне кажется очень интересное направление, потому что создается общий ИИ, который и пофилософствует и в шахматы сыграет и попрограммирует левой рукой.
    Очевидно, что такой ИИ может давать новые идеи для специализированных ИИ, которые будут лучше в чем-то одном.


    1. IT-GOMETUR
      00.00.0000 00:00
      +1

      Полностью с вами согласен! ИИ будет учить другуу ИИ