Эта статья о том, как я «учил» Алису (голосовой помощник Яндекса) играть в Шахматы.
Сидишь в кресле, закрыв глаза, и одновременно играешь в Шахматы…
Без доски, без монитора, ничего не трогая руками, все только в голове — такая была первоначальная идея, и Алиса подошла как раз наилучшим образом.
Движок
А никакого движка )
С просторов интернета был скачан код 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/
Добавить комментарий