مكتبة chess engine خالية من التبعية مصممة للتشغيل في أي مكان.
مكتوب بالصدأ؟؟
قبل كل شيء، هذا الفيديو من Tom7 هو مصدر إلهامي لهذا المشروع. إنه رائع للغاية وأطلب منك مشاهدة محتواه.
أنا أحب الشطرنج كثيرا . إنها بالتأكيد إحدى ألعابي المفضلة على الإطلاق. ومع ذلك، كنت دائمًا أشعر بخيبة الأمل عند محاولتي كتابة برامج تلعب الشطرنج رقميًا (خاصة بلغة مجمعة). على الرغم من وجود العديد من المحركات المذهلة، فمن شبه المستحيل العثور على مكتبة أنيقة للبرمجة المتعلقة بالشطرنج والتي تعمل على كل شيء.
محرك الشطرنج هو الحل لمشكلتي. إذا كنت تريد chess engine يعمل على الأجهزة المدمجة، والمحطة الطرفية، وسطح المكتب (مع واجهة المستخدم الرسومية)، والويب ، فمن المحتمل أن يكون هذا هو أفضل رهان لك.
يعمل هذا الذكاء الاصطناعي الخاص (إلى جانب معظم الذكاء الاصطناعي الآخر في لعبة الشطرنج) باستخدام خوارزمية Minimax، إلى جانب تقليم Alpha-Beta من أجل التحسين.
الآن، دعونا فك ذلك.
تقوم خوارزمية Minimax بشكل أساسي بالتكرار خلال جميع الحركات الممكنة بشكل متكرر، وتقوم بتقييم جميع اللوحات بعد لعب الحركات. إذا كانت اللوحة أكثر تفضيلاً، فسوف تشجع على لعب النقلة الأصلية، ولكن إذا كانت اللوحة أقل تفضيلاً، فسوف تختار عدم لعب حركة معينة.
بالإضافة إلى ذلك، عندما يحاول الذكاء الاصطناعي رؤية ما وراء اللوحة الحالية فقط، فإنه سيفترض أن الإنسان يستجيب دائمًا بأفضل التحركات. ونتيجة لذلك، لا يرتكب الكمبيوتر أي أخطاء فادحة تقريبًا. يتيح ذلك للكمبيوتر أن يلعب دائمًا حركات أفضل بشكل موضوعي من اللاعب.
نظرًا لأنه لا يحتوي على أي تبعيات، فمن السهل جدًا تضمينه في متصفح الويب باستخدام Wasm. حاول اللعب بنفسك!
متوسط إعداد الذكاء الاصطناعي
تحتوي بنية 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 دقيقة تقريبًا بين الفصول الدراسية. إذا كنت تستمتع بمشاريعي، فكر في دعمي بشراء قهوة لي!