Pustaka chess engine bebas ketergantungan yang dibuat untuk dijalankan di mana saja.
Ditulis dalam Karat??
Yang terpenting, video dari Tom7 ini adalah inspirasi saya untuk proyek ini. Dia benar-benar brilian dan saya mohon Anda untuk menonton kontennya.
Saya sangat menyukai catur. Ini jelas merupakan salah satu permainan favorit saya. Namun, saya selalu kecewa ketika mencoba menulis program yang memainkan catur secara digital (khususnya dalam bahasa yang dikompilasi). Meskipun ada beberapa mesin luar biasa, hampir tidak mungkin menemukan perpustakaan rapi untuk pemrograman yang berhubungan dengan catur yang dapat dijalankan pada segala hal.
mesin catur adalah solusi untuk masalah saya. Jika Anda menginginkan chess engine yang berjalan pada perangkat tertanam, terminal, desktop (dengan gui), dan web, ini mungkin pilihan terbaik Anda.
AI khusus ini (bersama dengan sebagian besar AI catur lainnya) bekerja menggunakan algoritma Minimax, bersama dengan pemangkasan Alfa-Beta untuk pengoptimalan.
Sekarang, mari kita buka kemasannya.
Algoritme Minimax pada dasarnya mengulangi semua kemungkinan gerakan secara rekursif, dan mengevaluasi semua papan setelah gerakan tersebut dimainkan. Jika dewan lebih menyukai, maka dewan akan mendorong memainkan langkah induknya, tetapi jika dewan kurang mendukung, maka dewan akan memilih untuk tidak memainkan langkah tertentu.
Selain itu, ketika AI mencoba melihat melewati papan saat ini, AI akan berasumsi bahwa manusia selalu merespons dengan gerakan terbaik. Alhasil komputer hampir tidak pernah error. Hal ini memungkinkan komputer untuk hampir selalu memainkan gerakan yang secara objektif lebih baik daripada pemainnya.
Karena tidak memiliki ketergantungan, sangat mudah untuk menyematkannya di browser web menggunakan wasm. Coba mainkan sendiri!
Pengaturan AI rata-rata
Struktur Board
memiliki beberapa metode berbeda yang memungkinkan pengguna menghasilkan pergerakan dari posisi tertentu, termasuk get_best_next_move
, get_worst_next_move
, dan get_legal_moves
. Ini sangat berguna untuk menulis AI catur untuk dimainkan.
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" )
}
}
Untuk menambahkan beberapa variasi atau permainan yang lebih maju, pertimbangkan untuk menulis AI yang memainkan bukaan yang dikenal yang membangun posisi lebih baik sebelum menggunakan metode get_best_next_move
!
Selain itu, pengguna dapat membuat objek Board
kustom mereka sendiri selain yang default. Ini dilakukan dengan menggunakan struktur BoardBuilder
. Struktur BoardBuilder
mendukung pengaktifan dan penonaktifan rokade, penempatan baris dan kolom kepingan, dan penempatan kepingan individual.
Ingatlah saat menggunakan BoardBuilder
bahwa rokade dinonaktifkan secara default!
Mainkan Varian Catur Horde
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." ) ;
}
}
}
Saya mahasiswa baru di perguruan tinggi, terutama mengerjakan proyek sampingan seperti ini di waktu istirahat ~30 menit antar kelas. Jika Anda menikmati proyek saya, pertimbangkan untuk mendukung saya dengan membelikan saya kopi!