diff options
author | eug-vs <eugene@eug-vs.xyz> | 2023-02-27 03:41:26 +0300 |
---|---|---|
committer | eug-vs <eugene@eug-vs.xyz> | 2023-02-27 03:41:26 +0300 |
commit | 5e2238ce4ae4ad7bc2d57ee45af866976211e6d3 (patch) | |
tree | 6766d57de41fd52fcc319150dc5e2ea8f2da21c1 /src/grossmeister | |
parent | a333e9285d55dad06b6507340f1c0416c9c7b6f9 (diff) | |
download | chessnost-5e2238ce4ae4ad7bc2d57ee45af866976211e6d3.tar.gz |
feat: add 3-fold repetition
Diffstat (limited to 'src/grossmeister')
-rw-r--r-- | src/grossmeister/UCI.rs | 2 | ||||
-rw-r--r-- | src/grossmeister/search.rs | 11 |
2 files changed, 9 insertions, 4 deletions
diff --git a/src/grossmeister/UCI.rs b/src/grossmeister/UCI.rs index 034b73b..3132e72 100644 --- a/src/grossmeister/UCI.rs +++ b/src/grossmeister/UCI.rs @@ -59,7 +59,7 @@ impl Grossmeister { .find(|m| { let promo_matches = match input_move.kind { MoveKind::Promotion(piece) => match m.kind { - MoveKind::Promotion(another_piece) => piece == another_piece, + MoveKind::Promotion(another_piece) => piece.without_color() == another_piece.without_color(), _ => false }, _ => true, diff --git a/src/grossmeister/search.rs b/src/grossmeister/search.rs index 5c03887..43423e4 100644 --- a/src/grossmeister/search.rs +++ b/src/grossmeister/search.rs @@ -45,6 +45,11 @@ impl Grossmeister { } } + if self.board.positions.iter().filter(|p| **p == self.board.hash).count() >= 3 { + // Draw by repetition + return (0.0, principal_variation); + } + if depth_left == 0 { return (self.quiscence(alpha, beta), principal_variation); } @@ -447,7 +452,7 @@ mod tests { let fen = String::from("2kr1b1r/pp1npppp/2p1bn2/7q/5B2/2NB1Q1P/PPP1N1P1/2KR3R w - - 0 1"); let board = Board::from_FEN(fen); let mut gm = Grossmeister::new(board); - let (score, pv) = gm.iterative_deepening(8, Duration::from_secs(15), true); + let (score, pv) = gm.iterative_deepening(8); assert_eq!(score, VALUE_WIN); assert_eq!(pv, vec![ @@ -464,7 +469,7 @@ mod tests { board.ply += 1; // TODO: remove me when FEN parsing includes side to move let mut gm = Grossmeister::new(board); - let (_, pv) = gm.iterative_deepening(6, Duration::from_secs(60), true); + let (_, pv) = gm.iterative_deepening(6); assert_eq!( pv[0], Move { source: Square::F5, target: Square::H4, kind: MoveKind::Quiet }, @@ -478,7 +483,7 @@ mod tests { let board = Board::from_FEN(fen); let mut gm = Grossmeister::new(board); - let (_, pv) = gm.iterative_deepening(5, Duration::from_secs(60), true); + let (_, pv) = gm.iterative_deepening(5); assert_eq!( pv[0], Move { source: Square::C2, target: Square::C3, kind: MoveKind::Quiet }, |