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

от автора

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

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

Движок

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

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


Фраза запуска навыка:
Алиса, давай сыграем в Шахматы с Интеллектом


ссылка на оригинал статьи https://habr.com/ru/post/718880/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *