어디에서나 실행되도록 구축된 종속성 없는 chess engine 라이브러리입니다.
Rust로 작성되었나요??
무엇보다도 Tom7의 이 비디오는 이 프로젝트에 대한 영감을 주었습니다. 그는 정말 훌륭합니다. 그의 콘텐츠를 시청해 보시기 바랍니다.
나는 체스를 아주 좋아해요. 확실히 제가 가장 좋아하는 게임 중 하나입니다. 그러나 나는 디지털 방식으로(특히 컴파일된 언어로) 체스를 두는 프로그램을 작성하려고 할 때 항상 실망했습니다. 여러 가지 놀라운 엔진이 존재하지만 모든 것에서 실행되는 체스 관련 프로그래밍을 위한 깔끔한 라이브러리를 찾는 것은 거의 불가능합니다.
체스 엔진은 내 문제에 대한 해결책입니다. 임베디드 장치, 터미널, 데스크톱(GUI 포함) 및 웹에서 실행되는 chess engine 원한다면 이것이 아마도 최선의 선택일 것입니다.
이 특정 AI(대부분의 다른 체스 AI와 함께)는 최적화를 위한 알파-베타 가지치기와 함께 Minimax 알고리즘을 사용하여 작동합니다.
이제 압축을 풀어보겠습니다.
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" )
}
}
변형이나 고급 플레이를 추가하려면 get_best_next_move
메서드를 사용하기 전에 더 나은 위치를 구축하는 알려진 오프닝을 재생하는 AI를 작성하는 것이 좋습니다!
또한 사용자는 기본 보드 개체가 아닌 자신만의 사용자 정의 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분 정도 쉬는 시간에 주로 이런 부업을 하고 있습니다. 내 프로젝트가 마음에 드셨다면 커피 한 잔 사서 저를 후원해 주세요!