Pull to refresh

Алиса (голосовой помощник Яндекса) играет в Шахматы

Reading time2 min
Views3.3K

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

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

Движок

А никакого движка )
С просторов интернета был скачан код 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, то есть даже с оценкой одного хода игра идет.

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


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

Tags:
Hubs:
If this publication inspired you and you want to support the author, do not hesitate to click on the button
Total votes 8: ↑7 and ↓1+6
Comments3

Articles