Эта статья о том, как я "учил" Алису (голосовой помощник Яндекса) играть в Шахматы.
Сидишь в кресле, закрыв глаза, и одновременно играешь в Шахматы...
Без доски, без монитора, ничего не трогая руками, все только в голове - такая была первоначальная идея, и Алиса подошла как раз наилучшим образом.
Движок
А никакого движка )
С просторов интернета был скачан код 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)
vics001
00.00.0000 00:00+1А буквально вчера видел видео ChatGPT против Lichess - https://www.youtube.com/watch?v=DC4B-LWpt88. Мне кажется очень интересное направление, потому что создается общий ИИ, который и пофилософствует и в шахматы сыграет и попрограммирует левой рукой.
Очевидно, что такой ИИ может давать новые идеи для специализированных ИИ, которые будут лучше в чем-то одном.
IT-GOMETUR
Хмм, интересная идея для проекта. Проси чтобы её добавили как обычную команду или мини-игру)