Библиотека chess engine без зависимостей, созданная для работы где угодно.
Написано на Rust??
Прежде всего, это видео Tom7 вдохновило меня на этот проект. Он просто великолепен, и я умоляю вас посмотреть его контент.
Я очень люблю шахматы. Это определенно одна из моих любимых игр. Однако я всегда разочаровывался, когда пытался писать программы для игры в шахматы в цифровом виде (особенно на компилируемом языке). Несмотря на то, что существует несколько замечательных движков, практически невозможно найти аккуратную библиотеку для шахматного программирования, которая бы работала на всем.
шахматный движок - решение моей проблемы. Если вам нужен chess engine , который работает на встроенных устройствах, терминале, рабочем столе (с графическим интерфейсом) и в Интернете, это, вероятно, ваш лучший выбор.
Этот конкретный ИИ (наряду с большинством других шахматных ИИ) работает с использованием алгоритма Minimax, а также с сокращением альфа-бета для оптимизации.
Теперь давайте распакуем это.
Алгоритм Minimax, по существу, рекурсивно перебирает все возможные ходы и оценивает все доски после того, как ходы сыграны. Если доска более благоприятна, она будет поощрять выполнение родительского хода, но если доска менее благоприятна, то она выберет против выполнения данного хода.
Кроме того, когда ИИ пытается заглянуть за пределы текущего поля, он предполагает, что человек всегда отвечает лучшими ходами. В результате компьютер почти никогда не ошибается. Это позволяет компьютеру почти всегда делать ходы объективно лучше, чем игрок.
Поскольку у него нет зависимостей, его чрезвычайно просто встроить в веб-браузер с помощью Wasm. Попробуйте сыграть сами!
Средняя настройка AI
Структура Board
имеет несколько различных методов, которые позволяют пользователям генерировать ходы из заданной позиции, включая get_best_next_move
, get_worst_next_move
и get_legal_moves
. Они особенно удобны для написания шахматного ИИ, против которого можно играть.
fn main ( ) {
let board = Board :: default ( ) ;
// Get the best move with 4 moves of lookahead
let best_move = board . get_best_next_move ( 4 ) ;
// Get the worst move with 3 moves of lookahead
let worst_move = board . get_worst_next_move ( 3 ) ;
// Get all of the possible legal moves for the given player
let legal_moves = board . get_legal_moves ( ) ;
// Print the board
println ! ( "{}" , board ) ;
print ! ( "CPU chose to " ) ;
match best_move {
Move :: Piece ( from , to ) => println ! ( "move {} to {}" , from, to ) ,
Move :: KingSideCastle => println ! ( "castle kingside" ) ,
Move :: QueenSideCastle => println ! ( "castle queenside" ) ,
Move :: Resign => println ! ( "resign" )
}
}
Чтобы добавить некоторые вариации или более продвинутую игру, рассмотрите возможность написания ИИ, который разыгрывает известные дебюты, которые создают лучшие позиции, прежде чем использовать метод get_best_next_move
!
Кроме того, пользователи могут создавать свои собственные объекты Board
отличные от объекта по умолчанию. Это делается с помощью структуры BoardBuilder
. Структура BoardBuilder
поддерживает включение и отключение рокировки, размещение рядов и столбцов фигур, а также размещение отдельных фигур.
Имейте в виду, что при использовании BoardBuilder
рокировка отключена по умолчанию!
Играйте в вариант шахмат Орды
fn main ( ) {
// `BoardBuilder::new()` returns an empty board
// with castling disabled.
// Creating a board builder from another board
// structure will preserve
// all settings from the board (such as castling
// and the last en-passant move).
// This BoardBuilder constructs the "Horde" chess variant!
let board = BoardBuilder :: from ( Board :: default ( ) )
. row ( Piece :: Pawn ( WHITE , A1 ) )
. row ( Piece :: Pawn ( WHITE , A2 ) )
. row ( Piece :: Pawn ( WHITE , A3 ) )
. row ( Piece :: Pawn ( WHITE , A4 ) )
. piece ( Piece :: Pawn ( WHITE , F5 ) )
. piece ( Piece :: Pawn ( WHITE , G5 ) )
. piece ( Piece :: Pawn ( WHITE , B5 ) )
. piece ( Piece :: Pawn ( WHITE , C5 ) )
. build ( ) ;
// The CPU can also play variants!
let cpu_move = board . get_best_next_move ( 3 ) ;
match board . play_move ( cpu_move ) {
GameResult :: Continuing ( next_board ) => {
println ! ( "{}" , next_board ) ;
}
GameResult :: Victory ( winner ) => {
// You can use the ! operator on a player's
// color to invert.
println ! ( "{} loses. {} is victorious." ,
!winner, winner
) ;
}
GameResult :: IllegalMove ( x ) => {
eprintln ! ( "{} is an illegal move." , x ) ;
}
GameResult :: Stalemate => {
println ! ( "Drawn game." ) ;
}
}
}
Я новичок в колледже и в основном работаю над подобными второстепенными проектами во время ~30-минутных перерывов между занятиями. Если вам нравятся мои проекты, поддержите меня, купив мне кофе!