diff --git a/engine/src/lib.rs b/engine/src/lib.rs index d603e16..77189aa 100644 --- a/engine/src/lib.rs +++ b/engine/src/lib.rs @@ -1,215 +1,538 @@ mod bitboard; -pub mod chessmove; -pub mod piecetype; pub mod boardsquare; -pub mod movetype; +pub mod chessmove; pub mod gameend; +pub mod movetype; +pub mod piecetype; -use chessmove::ChessMove; -use gameend::GameEnd; use bitboard::board::Board; use bitboard::movebuffer::MoveBuffer; +use chessmove::ChessMove; +use gameend::GameEnd; pub fn get_available_moves(fen: &str) -> Vec { - let mut board = Board::build(fen); - let mut buffer = MoveBuffer::new(); - let mut temp_buffer = MoveBuffer::new(); - let mut generated_moves: Vec = vec![]; + let mut board = Board::build(fen); + let mut buffer = MoveBuffer::new(); + let mut temp_buffer = MoveBuffer::new(); + let mut generated_moves: Vec = vec![]; - board.collect_moves(&mut buffer, &mut temp_buffer); + board.collect_moves(&mut buffer, &mut temp_buffer); - for idx in 0..buffer.count() { - generated_moves.push(ChessMove::from_bitmove(buffer.get(idx), &board)); - } + for idx in 0..buffer.count() { + generated_moves.push(ChessMove::from_bitmove(buffer.get(idx), &board)); + } - println!("get_available_moves resulted in {} moves", generated_moves.len()); - return generated_moves; + println!( + "get_available_moves resulted in {} moves", + generated_moves.len() + ); + return generated_moves; } pub fn is_game_over(fen: &str) -> Option { - let mut board = Board::build(fen); - let mut buffer = MoveBuffer::new(); - let mut temp_buffer = MoveBuffer::new(); - let in_check = board.collect_moves(&mut buffer, &mut temp_buffer); + let mut board = Board::build(fen); + let mut buffer = MoveBuffer::new(); + let mut temp_buffer = MoveBuffer::new(); + let in_check = board.collect_moves(&mut buffer, &mut temp_buffer); - println!("is_game_over answered"); - if buffer.count() > 0 { - return None; - } - if !in_check { - return Some(GameEnd::Draw("".to_string())); - } - return if board.side_to_move() == 0 { Some(GameEnd::BlackWon("".to_string())) } else { Some(GameEnd::WhiteWon("".to_string())) }; + println!("is_game_over answered"); + if buffer.count() > 0 { + return None; + } + if !in_check { + return Some(GameEnd::Draw("".to_string())); + } + return if board.side_to_move() == 0 { + Some(GameEnd::BlackWon("".to_string())) + } else { + Some(GameEnd::WhiteWon("".to_string())) + }; } pub fn get_board_after_move(fen: &str, chess_move: &ChessMove) -> String { - let mut board = Board::build(fen); - let played_move = chess_move.to_bitmove(); + let mut board = Board::build(fen); + let played_move = chess_move.to_bitmove(); - println!("get_board_after_move answered"); - board.make_move(&played_move); + println!("get_board_after_move answered"); + board.make_move(&played_move); - return board.fen(); + return board.fen(); } #[cfg(test)] mod tests { - use crate::boardsquare::BoardSquare; - use crate::piecetype::PieceType::*; - use crate::gameend::GameEnd; + use crate::boardsquare::BoardSquare; + use crate::gameend::GameEnd; + use crate::piecetype::PieceType::*; - use super::*; + use super::*; - impl PartialEq for ChessMove { - fn eq(&self, other: &Self) -> bool { - canonical(self) == canonical(other) + impl PartialEq for ChessMove { + fn eq(&self, other: &Self) -> bool { + canonical(self) == canonical(other) + } + } + impl Eq for ChessMove {} + impl Ord for ChessMove { + fn cmp(&self, other: &Self) -> std::cmp::Ordering { + let lhs = canonical(self); + let rhs = canonical(other); + lhs.cmp(&rhs) + } + } + impl PartialOrd for ChessMove { + fn partial_cmp(&self, other: &Self) -> Option { + Some(self.cmp(other)) + } } - } - impl Eq for ChessMove { - } - impl Ord for ChessMove { - fn cmp(&self, other: &Self) -> std::cmp::Ordering { - let lhs = canonical(self); - let rhs = canonical(other); - lhs.cmp(&rhs) + fn canonical(m: &ChessMove) -> (u8, u8, u8) { + match m { + ChessMove::Quiet { + piece_type, + from_square, + to_square, + promotion_piece, + } => (0, from_square.to_index(), to_square.to_index()), + ChessMove::Capture { + piece_type, + from_square, + to_square, + captured_piece, + promotion_piece, + } => (1, from_square.to_index(), to_square.to_index()), + ChessMove::Castle { + king_type, + king_from, + king_to, + rook_type, + rook_from, + rook_to, + } => (2, king_from.to_index(), king_to.to_index()), + ChessMove::EnPassant { + pawn_type, + from_square, + to_square, + captured_piece, + captured_from, + } => (3, from_square.to_index(), to_square.to_index()), + } } - } - impl PartialOrd for ChessMove { - fn partial_cmp(&self, other: &Self) -> Option { - Some(self.cmp(other)) - } - } - impl PartialEq for GameEnd { - fn eq(&self, other: &Self) -> bool { - match (self, other) { - (GameEnd::WhiteWon(a), GameEnd::WhiteWon(b)) => a == b, - (GameEnd::BlackWon(a), GameEnd::BlackWon(b)) => a == b, - (GameEnd::Draw(a), GameEnd::Draw(b)) => a == b, - _ => false, + #[test] + fn get_available_moves_test() { + let boards: [&str; 2] = [ + "rnbqkbnr/pppppppp/8/1B6/4P3/5P1N/PPPP2PP/RNBQK2R w KQkq e6 0 1", + "6Bn/B2Pk3/8/p1r3NK/3p4/b6P/3p2n1/2R5 w - - 0 1", + ]; + let mut expected_moves: Vec> = vec![ + vec![ + ChessMove::capture( + WhiteBishop, + BoardSquare::from_coord(1, 4), + BoardSquare::from_coord(3, 6), + BlackPawn, + None, + ), + ChessMove::quiet( + WhitePawn, + BoardSquare::from_coord(0, 1), + BoardSquare::from_coord(0, 2), + None, + ), + ChessMove::quiet( + WhitePawn, + BoardSquare::from_coord(0, 1), + BoardSquare::from_coord(0, 3), + None, + ), + ChessMove::quiet( + WhitePawn, + BoardSquare::from_coord(1, 1), + BoardSquare::from_coord(1, 2), + None, + ), + ChessMove::quiet( + WhitePawn, + BoardSquare::from_coord(1, 1), + BoardSquare::from_coord(1, 3), + None, + ), + ChessMove::quiet( + WhitePawn, + BoardSquare::from_coord(2, 1), + BoardSquare::from_coord(2, 2), + None, + ), + ChessMove::quiet( + WhitePawn, + BoardSquare::from_coord(2, 1), + BoardSquare::from_coord(2, 3), + None, + ), + ChessMove::quiet( + WhitePawn, + BoardSquare::from_coord(3, 1), + BoardSquare::from_coord(3, 2), + None, + ), + ChessMove::quiet( + WhitePawn, + BoardSquare::from_coord(3, 1), + BoardSquare::from_coord(3, 3), + None, + ), + ChessMove::quiet( + WhitePawn, + BoardSquare::from_coord(4, 3), + BoardSquare::from_coord(4, 4), + None, + ), + ChessMove::quiet( + WhitePawn, + BoardSquare::from_coord(5, 2), + BoardSquare::from_coord(5, 3), + None, + ), + ChessMove::quiet( + WhitePawn, + BoardSquare::from_coord(6, 1), + BoardSquare::from_coord(6, 2), + None, + ), + ChessMove::quiet( + WhitePawn, + BoardSquare::from_coord(6, 1), + BoardSquare::from_coord(6, 3), + None, + ), + ChessMove::quiet( + WhiteKnight, + BoardSquare::from_coord(1, 0), + BoardSquare::from_coord(0, 2), + None, + ), + ChessMove::quiet( + WhiteKnight, + BoardSquare::from_coord(1, 0), + BoardSquare::from_coord(2, 2), + None, + ), + ChessMove::quiet( + WhiteKnight, + BoardSquare::from_coord(7, 2), + BoardSquare::from_coord(6, 0), + None, + ), + ChessMove::quiet( + WhiteKnight, + BoardSquare::from_coord(7, 2), + BoardSquare::from_coord(5, 1), + None, + ), + ChessMove::quiet( + WhiteKnight, + BoardSquare::from_coord(7, 2), + BoardSquare::from_coord(5, 3), + None, + ), + ChessMove::quiet( + WhiteKnight, + BoardSquare::from_coord(7, 2), + BoardSquare::from_coord(6, 4), + None, + ), + ChessMove::quiet( + WhiteBishop, + BoardSquare::from_coord(1, 4), + BoardSquare::from_coord(5, 0), + None, + ), + ChessMove::quiet( + WhiteBishop, + BoardSquare::from_coord(1, 4), + BoardSquare::from_coord(4, 1), + None, + ), + ChessMove::quiet( + WhiteBishop, + BoardSquare::from_coord(1, 4), + BoardSquare::from_coord(3, 2), + None, + ), + ChessMove::quiet( + WhiteBishop, + BoardSquare::from_coord(1, 4), + BoardSquare::from_coord(2, 3), + None, + ), + ChessMove::quiet( + WhiteBishop, + BoardSquare::from_coord(1, 4), + BoardSquare::from_coord(0, 3), + None, + ), + ChessMove::quiet( + WhiteBishop, + BoardSquare::from_coord(1, 4), + BoardSquare::from_coord(0, 5), + None, + ), + ChessMove::quiet( + WhiteBishop, + BoardSquare::from_coord(1, 4), + BoardSquare::from_coord(2, 5), + None, + ), + ChessMove::quiet( + WhiteRook, + BoardSquare::from_coord(7, 0), + BoardSquare::from_coord(6, 0), + None, + ), + ChessMove::quiet( + WhiteRook, + BoardSquare::from_coord(7, 0), + BoardSquare::from_coord(5, 0), + None, + ), + ChessMove::quiet( + WhiteQueen, + BoardSquare::from_coord(3, 0), + BoardSquare::from_coord(4, 1), + None, + ), + ChessMove::quiet( + WhiteKing, + BoardSquare::from_coord(4, 0), + BoardSquare::from_coord(4, 1), + None, + ), + ChessMove::quiet( + WhiteKing, + BoardSquare::from_coord(4, 0), + BoardSquare::from_coord(5, 1), + None, + ), + ChessMove::quiet( + WhiteKing, + BoardSquare::from_coord(4, 0), + BoardSquare::from_coord(5, 0), + None, + ), + ChessMove::castle( + WhiteKing, + BoardSquare::from_coord(4, 0), + BoardSquare::from_coord(6, 0), + WhiteRook, + BoardSquare::from_coord(7, 0), + BoardSquare::from_coord(5, 0), + ), + ], + vec![ + ChessMove::capture( + WhiteBishop, + BoardSquare::from_coord(0, 6), + BoardSquare::from_coord(2, 4), + BlackRook, + None, + ), + ChessMove::capture( + WhiteRook, + BoardSquare::from_coord(2, 0), + BoardSquare::from_coord(2, 4), + BlackRook, + None, + ), + ChessMove::quiet( + WhitePawn, + BoardSquare::from_coord(7, 2), + BoardSquare::from_coord(7, 3), + None, + ), + ChessMove::quiet( + WhitePawn, + BoardSquare::from_coord(3, 6), + BoardSquare::from_coord(3, 7), + Some(WhiteQueen), + ), + ChessMove::quiet( + WhitePawn, + BoardSquare::from_coord(3, 6), + BoardSquare::from_coord(3, 7), + Some(WhiteRook), + ), + ChessMove::quiet( + WhitePawn, + BoardSquare::from_coord(3, 6), + BoardSquare::from_coord(3, 7), + Some(WhiteBishop), + ), + ChessMove::quiet( + WhitePawn, + BoardSquare::from_coord(3, 6), + BoardSquare::from_coord(3, 7), + Some(WhiteKnight), + ), + ChessMove::quiet( + WhiteBishop, + BoardSquare::from_coord(0, 6), + BoardSquare::from_coord(1, 5), + None, + ), + ChessMove::quiet( + WhiteBishop, + BoardSquare::from_coord(0, 6), + BoardSquare::from_coord(1, 7), + None, + ), + ChessMove::quiet( + WhiteBishop, + BoardSquare::from_coord(6, 7), + BoardSquare::from_coord(7, 6), + None, + ), + ChessMove::quiet( + WhiteBishop, + BoardSquare::from_coord(6, 7), + BoardSquare::from_coord(5, 6), + None, + ), + ChessMove::quiet( + WhiteBishop, + BoardSquare::from_coord(6, 7), + BoardSquare::from_coord(4, 5), + None, + ), + ChessMove::quiet( + WhiteBishop, + BoardSquare::from_coord(6, 7), + BoardSquare::from_coord(3, 4), + None, + ), + ChessMove::quiet( + WhiteBishop, + BoardSquare::from_coord(6, 7), + BoardSquare::from_coord(2, 3), + None, + ), + ChessMove::quiet( + WhiteBishop, + BoardSquare::from_coord(6, 7), + BoardSquare::from_coord(1, 2), + None, + ), + ChessMove::quiet( + WhiteBishop, + BoardSquare::from_coord(6, 7), + BoardSquare::from_coord(0, 1), + None, + ), + ChessMove::quiet( + WhiteRook, + BoardSquare::from_coord(2, 0), + BoardSquare::from_coord(0, 0), + None, + ), + ChessMove::quiet( + WhiteRook, + BoardSquare::from_coord(2, 0), + BoardSquare::from_coord(1, 0), + None, + ), + ChessMove::quiet( + WhiteRook, + BoardSquare::from_coord(2, 0), + BoardSquare::from_coord(3, 0), + None, + ), + ChessMove::quiet( + WhiteRook, + BoardSquare::from_coord(2, 0), + BoardSquare::from_coord(4, 0), + None, + ), + ChessMove::quiet( + WhiteRook, + BoardSquare::from_coord(2, 0), + BoardSquare::from_coord(5, 0), + None, + ), + ChessMove::quiet( + WhiteRook, + BoardSquare::from_coord(2, 0), + BoardSquare::from_coord(6, 0), + None, + ), + ChessMove::quiet( + WhiteRook, + BoardSquare::from_coord(2, 0), + BoardSquare::from_coord(7, 0), + None, + ), + ChessMove::quiet( + WhiteRook, + BoardSquare::from_coord(2, 0), + BoardSquare::from_coord(2, 1), + None, + ), + ChessMove::quiet( + WhiteRook, + BoardSquare::from_coord(2, 0), + BoardSquare::from_coord(2, 2), + None, + ), + ChessMove::quiet( + WhiteRook, + BoardSquare::from_coord(2, 0), + BoardSquare::from_coord(2, 3), + None, + ), + ChessMove::quiet( + WhiteKing, + BoardSquare::from_coord(7, 4), + BoardSquare::from_coord(6, 3), + None, + ), + ChessMove::quiet( + WhiteKing, + BoardSquare::from_coord(7, 4), + BoardSquare::from_coord(7, 5), + None, + ), + ], + ]; + + for case in 0..2 { + let mut generated_moves = get_available_moves(boards[case]); + + generated_moves.sort(); + expected_moves[case].sort(); + assert_eq!(generated_moves.len(), expected_moves[case].len()); + assert_eq!(generated_moves, expected_moves[case]); + } + } + + #[test] + fn is_game_over_test() { + let boards: [&str; 4] = [ + "2k5/3pn3/2pP4/1R1P3B/1Np5/3RPp2/1B6/6Kb w - - 0 1", + "2K3B1/4P3/8/7p/4pPn1/1N1P1p1p/4bp2/2Rk4 b - - 0 1", + "6N1/B2PP3/pR1b4/3P2nb/6P1/3P1k2/2p5/4r1K1 w - - 0 1", + "3n1K2/p2k1p2/5P2/b1p2P2/P7/8/3p2r1/8 w - - 0 1", + ]; + let expected_results: [Option; 4] = [ + None, + Some(GameEnd::WhiteWon("".to_string())), + Some(GameEnd::BlackWon("".to_string())), + Some(GameEnd::Draw("".to_string())), + ]; + + for case in 0..4 { + let fen = boards[case]; + let actual = is_game_over(fen); + assert_eq!(actual, expected_results[case]); + } } - } } - fn canonical(m: &ChessMove) -> (u8, u8, u8) { - match m { - ChessMove::Quiet { piece_type, from_square, to_square, promotion_piece } => - (0, from_square.to_index(), to_square.to_index()), - ChessMove::Capture { piece_type, from_square, to_square, captured_piece, promotion_piece } => - (1, from_square.to_index(), to_square.to_index()), - ChessMove::Castle { king_type, king_from, king_to, rook_type, rook_from, rook_to } => - (2, king_from.to_index(), king_to.to_index()), - ChessMove::EnPassant { pawn_type, from_square, to_square, captured_piece, captured_from } => - (3, from_square.to_index(), to_square.to_index()), - } - } - - #[test] - fn get_available_moves_test() { - let boards: [&str; 2] = [ - "rnbqkbnr/pppppppp/8/1B6/4P3/5P1N/PPPP2PP/RNBQK2R w KQkq e6 0 1", - "6Bn/B2Pk3/8/p1r3NK/3p4/b6P/3p2n1/2R5 w - - 0 1" - ]; - let mut expected_moves: Vec> = vec![ - vec![ - ChessMove::capture(WhiteBishop, BoardSquare::from_coord(1, 4), BoardSquare::from_coord(3, 6), BlackPawn, None), - ChessMove::quiet(WhitePawn, BoardSquare::from_coord(0, 1), BoardSquare::from_coord(0, 2), None), - ChessMove::quiet(WhitePawn, BoardSquare::from_coord(0, 1), BoardSquare::from_coord(0, 3), None), - ChessMove::quiet(WhitePawn, BoardSquare::from_coord(1, 1), BoardSquare::from_coord(1, 2), None), - ChessMove::quiet(WhitePawn, BoardSquare::from_coord(1, 1), BoardSquare::from_coord(1, 3), None), - ChessMove::quiet(WhitePawn, BoardSquare::from_coord(2, 1), BoardSquare::from_coord(2, 2), None), - ChessMove::quiet(WhitePawn, BoardSquare::from_coord(2, 1), BoardSquare::from_coord(2, 3), None), - ChessMove::quiet(WhitePawn, BoardSquare::from_coord(3, 1), BoardSquare::from_coord(3, 2), None), - ChessMove::quiet(WhitePawn, BoardSquare::from_coord(3, 1), BoardSquare::from_coord(3, 3), None), - ChessMove::quiet(WhitePawn, BoardSquare::from_coord(4, 3), BoardSquare::from_coord(4, 4), None), - ChessMove::quiet(WhitePawn, BoardSquare::from_coord(5, 2), BoardSquare::from_coord(5, 3), None), - ChessMove::quiet(WhitePawn, BoardSquare::from_coord(6, 1), BoardSquare::from_coord(6, 2), None), - ChessMove::quiet(WhitePawn, BoardSquare::from_coord(6, 1), BoardSquare::from_coord(6, 3), None), - ChessMove::quiet(WhiteKnight, BoardSquare::from_coord(1, 0), BoardSquare::from_coord(0, 2), None), - ChessMove::quiet(WhiteKnight, BoardSquare::from_coord(1, 0), BoardSquare::from_coord(2, 2), None), - ChessMove::quiet(WhiteKnight, BoardSquare::from_coord(7, 2), BoardSquare::from_coord(6, 0), None), - ChessMove::quiet(WhiteKnight, BoardSquare::from_coord(7, 2), BoardSquare::from_coord(5, 1), None), - ChessMove::quiet(WhiteKnight, BoardSquare::from_coord(7, 2), BoardSquare::from_coord(5, 3), None), - ChessMove::quiet(WhiteKnight, BoardSquare::from_coord(7, 2), BoardSquare::from_coord(6, 4), None), - ChessMove::quiet(WhiteBishop, BoardSquare::from_coord(1, 4), BoardSquare::from_coord(5, 0), None), - ChessMove::quiet(WhiteBishop, BoardSquare::from_coord(1, 4), BoardSquare::from_coord(4, 1), None), - ChessMove::quiet(WhiteBishop, BoardSquare::from_coord(1, 4), BoardSquare::from_coord(3, 2), None), - ChessMove::quiet(WhiteBishop, BoardSquare::from_coord(1, 4), BoardSquare::from_coord(2, 3), None), - ChessMove::quiet(WhiteBishop, BoardSquare::from_coord(1, 4), BoardSquare::from_coord(0, 3), None), - ChessMove::quiet(WhiteBishop, BoardSquare::from_coord(1, 4), BoardSquare::from_coord(0, 5), None), - ChessMove::quiet(WhiteBishop, BoardSquare::from_coord(1, 4), BoardSquare::from_coord(2, 5), None), - ChessMove::quiet(WhiteRook, BoardSquare::from_coord(7, 0), BoardSquare::from_coord(6, 0), None), - ChessMove::quiet(WhiteRook, BoardSquare::from_coord(7, 0), BoardSquare::from_coord(5, 0), None), - ChessMove::quiet(WhiteQueen, BoardSquare::from_coord(3, 0), BoardSquare::from_coord(4, 1), None), - ChessMove::quiet(WhiteKing, BoardSquare::from_coord(4, 0), BoardSquare::from_coord(4, 1), None), - ChessMove::quiet(WhiteKing, BoardSquare::from_coord(4, 0), BoardSquare::from_coord(5, 1), None), - ChessMove::quiet(WhiteKing, BoardSquare::from_coord(4, 0), BoardSquare::from_coord(5, 0), None), - ChessMove::castle(WhiteKing, BoardSquare::from_coord(4, 0), BoardSquare::from_coord(6, 0), WhiteRook, BoardSquare::from_coord(7, 0), BoardSquare::from_coord(5, 0)) - ], - vec![ - ChessMove::capture(WhiteBishop, BoardSquare::from_coord(0, 6), BoardSquare::from_coord(2, 4), BlackRook, None), - ChessMove::capture(WhiteRook, BoardSquare::from_coord(2, 0), BoardSquare::from_coord(2, 4), BlackRook, None), - ChessMove::quiet(WhitePawn, BoardSquare::from_coord(7, 2), BoardSquare::from_coord(7, 3), None), - ChessMove::quiet(WhitePawn, BoardSquare::from_coord(3, 6), BoardSquare::from_coord(3, 7), Some(WhiteQueen)), - ChessMove::quiet(WhitePawn, BoardSquare::from_coord(3, 6), BoardSquare::from_coord(3, 7), Some(WhiteRook)), - ChessMove::quiet(WhitePawn, BoardSquare::from_coord(3, 6), BoardSquare::from_coord(3, 7), Some(WhiteBishop)), - ChessMove::quiet(WhitePawn, BoardSquare::from_coord(3, 6), BoardSquare::from_coord(3, 7), Some(WhiteKnight)), - ChessMove::quiet(WhiteBishop, BoardSquare::from_coord(0, 6), BoardSquare::from_coord(1, 5), None), - ChessMove::quiet(WhiteBishop, BoardSquare::from_coord(0, 6), BoardSquare::from_coord(1, 7), None), - ChessMove::quiet(WhiteBishop, BoardSquare::from_coord(6, 7), BoardSquare::from_coord(7, 6), None), - ChessMove::quiet(WhiteBishop, BoardSquare::from_coord(6, 7), BoardSquare::from_coord(5, 6), None), - ChessMove::quiet(WhiteBishop, BoardSquare::from_coord(6, 7), BoardSquare::from_coord(4, 5), None), - ChessMove::quiet(WhiteBishop, BoardSquare::from_coord(6, 7), BoardSquare::from_coord(3, 4), None), - ChessMove::quiet(WhiteBishop, BoardSquare::from_coord(6, 7), BoardSquare::from_coord(2, 3), None), - ChessMove::quiet(WhiteBishop, BoardSquare::from_coord(6, 7), BoardSquare::from_coord(1, 2), None), - ChessMove::quiet(WhiteBishop, BoardSquare::from_coord(6, 7), BoardSquare::from_coord(0, 1), None), - ChessMove::quiet(WhiteRook, BoardSquare::from_coord(2, 0), BoardSquare::from_coord(0, 0), None), - ChessMove::quiet(WhiteRook, BoardSquare::from_coord(2, 0), BoardSquare::from_coord(1, 0), None), - ChessMove::quiet(WhiteRook, BoardSquare::from_coord(2, 0), BoardSquare::from_coord(3, 0), None), - ChessMove::quiet(WhiteRook, BoardSquare::from_coord(2, 0), BoardSquare::from_coord(4, 0), None), - ChessMove::quiet(WhiteRook, BoardSquare::from_coord(2, 0), BoardSquare::from_coord(5, 0), None), - ChessMove::quiet(WhiteRook, BoardSquare::from_coord(2, 0), BoardSquare::from_coord(6, 0), None), - ChessMove::quiet(WhiteRook, BoardSquare::from_coord(2, 0), BoardSquare::from_coord(7, 0), None), - ChessMove::quiet(WhiteRook, BoardSquare::from_coord(2, 0), BoardSquare::from_coord(2, 1), None), - ChessMove::quiet(WhiteRook, BoardSquare::from_coord(2, 0), BoardSquare::from_coord(2, 2), None), - ChessMove::quiet(WhiteRook, BoardSquare::from_coord(2, 0), BoardSquare::from_coord(2, 3), None), - ChessMove::quiet(WhiteKing, BoardSquare::from_coord(7, 4), BoardSquare::from_coord(6, 3), None), - ChessMove::quiet(WhiteKing, BoardSquare::from_coord(7, 4), BoardSquare::from_coord(7, 5), None) - ] - ]; - - for case in 0..2 { - - let mut generated_moves = get_available_moves(boards[case]); - - generated_moves.sort(); - expected_moves[case].sort(); - assert_eq!(generated_moves.len(), expected_moves[case].len()); - assert_eq!(generated_moves, expected_moves[case]); - } - } - - #[test] - fn is_game_over_test() { - - let boards: [&str; 4] = [ - "2k5/3pn3/2pP4/1R1P3B/1Np5/3RPp2/1B6/6Kb w - - 0 1", - "2K3B1/4P3/8/7p/4pPn1/1N1P1p1p/4bp2/2Rk4 b - - 0 1", - "6N1/B2PP3/pR1b4/3P2nb/6P1/3P1k2/2p5/4r1K1 w - - 0 1", - "3n1K2/p2k1p2/5P2/b1p2P2/P7/8/3p2r1/8 w - - 0 1" - ]; - let expected_results: [Option; 4] = [ - None, - Some(GameEnd::WhiteWon("".to_string())), - Some(GameEnd::BlackWon("".to_string())), - Some(GameEnd::Draw("".to_string())) - ]; - - for case in 0..4 { - let fen = boards[case]; - let actual = is_game_over(fen); - assert_eq!(actual, expected_results[case]); - } - } -} \ No newline at end of file diff --git a/server/src/connection.rs b/server/src/connection.rs index 498a6b3..3014b65 100644 --- a/server/src/connection.rs +++ b/server/src/connection.rs @@ -193,12 +193,12 @@ pub async fn handle_connection( info!("id: {}", &player_id); - error!("\n\n\n"); + println!("\n\n\n"); println!( "{:?}", engine::get_available_moves("rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1") ); - error!("\n\n\n"); + println!("\n\n\n"); // Message processing loop while let Some(Ok(message)) = read.next().await { @@ -243,7 +243,7 @@ pub async fn handle_connection( .current_match .unwrap(); - println!("\n\nstep: {:?}", step); + println!("\n\nstep: {:?}\n", step); { info!("updating board state in match: {}", &match_id); @@ -253,7 +253,13 @@ pub async fn handle_connection( &matches.get(&match_id).unwrap().board_state, &step, ); + + info!( + "board after engine fn: {}", + matches.get_mut(&match_id).unwrap().board_state.clone() + ); } + let message = ServerMessage2::UIUpdate { fen: matches .lock() diff --git a/ui/src/main.rs b/ui/src/main.rs index 8546525..e25e3e0 100644 --- a/ui/src/main.rs +++ b/ui/src/main.rs @@ -276,8 +276,10 @@ impl ChessApp { if let Ok(mut state) = game_state_clone.lock() { match &server_msg { ServerMessage2::UIUpdate { fen, turn_player } => { + info!("raw fen: {}", &fen); state.fen = fen.clone(); state.turn_player = Some(turn_player.clone()); + warn!("turn player: {}", &state.turn_player.clone().unwrap()); } ServerMessage2::MatchFound { color, @@ -503,6 +505,9 @@ impl ChessApp { } } ServerMessage2::UIUpdate { fen, turn_player } => { + if let Some(tx) = &self.tx_to_network { + let _ = tx.send(ClientEvent::RequestLegalMoves {fen: self.game_state.lock().unwrap().fen.clone()}); + } info!("Board updated with FEN: {}", fen); } _ => {} @@ -957,7 +962,7 @@ impl eframe::App for ChessApp { let text_color = if piece_char.is_uppercase() { egui::Color32::WHITE } else { - egui::Color32::BLACK + egui::Color32::BLACK }; board_painter.text( @@ -986,26 +991,12 @@ impl eframe::App for ChessApp { if let Some(click_pos) = ui.ctx().pointer_interact_pos() { if rect.contains(click_pos) { let res = self.handle_click(display_row, display_col); - match res { - Ok(_) => { - if let Some(tx) = &self.tx_to_network { - info!("requesting legal moves from server"); - let _ = tx.send( - ClientEvent::RequestLegalMoves { - fen: self - .game_state - .lock() - .unwrap() - .fen - .clone(), - }, - ); - }; + match res { + Ok(_) => {} + Err(e) => { + error!("{}", e); + } } - Err(e) => { - error!("{}", e); - } - } } } }