ไลบรารี่ chess engine ที่ไม่ต้องพึ่งพาซึ่งสร้างขึ้นเพื่อให้ทำงานได้ทุกที่
เขียนใน รัส??
เหนือสิ่งอื่นใด วิดีโอนี้โดย Tom7 ถือเป็นแรงบันดาลใจของฉันสำหรับโปรเจ็กต์นี้ เขายอดเยี่ยมมากและฉันขอให้คุณดูเนื้อหาของเขา
ฉันรักหมากรุก มาก มันเป็นหนึ่งในเกมโปรดของฉันอย่างแน่นอน อย่างไรก็ตาม ฉันรู้สึกผิดหวังมาโดยตลอดเมื่อพยายามเขียนโปรแกรมที่เล่นหมากรุกแบบดิจิทัล (โดยเฉพาะในภาษาที่คอมไพล์) แม้ว่าจะมีเอ็นจิ้นที่น่าทึ่งอยู่หลายตัว แต่ก็แทบจะเป็นไปไม่ได้เลยที่จะหาไลบรารี่เรียบร้อยสำหรับการเขียนโปรแกรมที่เกี่ยวข้องกับหมากรุกที่ทำงานบนทุกสิ่ง
chess-engine เป็นวิธีแก้ไขปัญหาของฉัน หากคุณต้องการ chess engine ที่ทำงานบนอุปกรณ์ฝังตัว เทอร์มินัล เดสก์ท็อป (พร้อม GUI) และ เว็บ นี่อาจเป็นทางออกที่ดีที่สุดของคุณ
AI เฉพาะนี้ (พร้อมกับ AI หมากรุกอื่นๆ ส่วนใหญ่) ทำงานโดยใช้อัลกอริธึม Minimax ควบคู่ไปกับการตัด Alpha-Beta เพื่อการปรับให้เหมาะสม
ตอนนี้เรามาแกะกล่องกันดีกว่า
อัลกอริธึม Minimax จะวนซ้ำการเคลื่อนไหวที่เป็นไปได้ทั้งหมดแบบวนซ้ำ และประเมินกระดานทั้งหมดหลังจากเล่นการเคลื่อนไหวแล้ว หากบอร์ดเป็นที่นิยม มากกว่า มันจะ กระตุ้นให้ เล่นท่าหลัก แต่ถ้าบอร์ดเป็นที่นิยม น้อยกว่า มันก็จะเลือก ไม่ เล่นท่านั้น
นอกจากนี้ เมื่อ AI พยายามมองอดีตเพียงกระดานปัจจุบัน ระบบจะถือว่ามนุษย์ตอบสนองด้วยการเคลื่อนไหวที่ดีที่สุด เสมอ เป็นผลให้คอมพิวเตอร์แทบ ไม่เคย ผิดพลาดเลย สิ่งนี้ทำให้คอมพิวเตอร์สามารถเล่นการเคลื่อนไหวที่ดีกว่าผู้เล่นได้เกือบตลอดเวลา
เนื่องจากไม่มีการพึ่งพาอาศัยกัน จึงเป็นเรื่องง่ายมากที่จะฝังลงในเว็บเบราว์เซอร์โดยใช้ wasm ลองเล่นด้วยตัวเอง!
การตั้งค่า AI โดยเฉลี่ย
โครงสร้าง Board
มีวิธีการที่แตกต่างกันสองสามวิธีที่ช่วยให้ผู้ใช้สามารถสร้างการเคลื่อนไหวจากตำแหน่งที่กำหนด รวมถึง get_best_next_move
, get_worst_next_move
และ get_legal_moves
สิ่งเหล่านี้มีประโยชน์อย่างยิ่งสำหรับการเขียน AI หมากรุกเพื่อเล่นด้วย
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" )
}
}
หากต้องการเพิ่มรูปแบบหรือการเล่นขั้นสูง ให้ลองเขียน AI ที่เล่นช่องเปิดที่รู้จักซึ่งสร้างตำแหน่งที่ดีกว่า ก่อนที่จะใช้วิธี get_best_next_move
!
นอกจากนี้ ผู้ใช้สามารถสร้างออบเจ็กต์ Board
แบบกำหนดเองของตนเองนอกเหนือจากออบเจ็กต์เริ่มต้นได้ ทำได้โดยใช้โครงสร้าง BoardBuilder
โครงสร้าง BoardBuilder
รองรับการเปิดและปิดการหล่อ การวางแถวและคอลัมน์ของชิ้นส่วน และการวางชิ้นส่วนแต่ละชิ้น
โปรดทราบเมื่อใช้ BoardBuilder
ซึ่งการแคสต์จะถูกปิดใช้งานตามค่าเริ่มต้น!
เล่น Horde Chess Variant
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 นาทีระหว่างคาบเรียน หากคุณชอบโปรเจ็กต์ของฉัน ลองสนับสนุนฉันด้วยการซื้อกาแฟให้ฉันด้วย!