cleanroom implementation of a chess engine. doesn't work :)

add tests for castling

+46 -15
+46 -15
src/lib.rs
··· 95 95 } else { 96 96 &mut self.black 97 97 }; 98 + let nonmover = if self.white_to_move { 99 + &mut self.black 100 + } else { 101 + &mut self.white 102 + }; 98 103 99 104 if algebra == "O-O" || algebra == "0-0" { 100 105 mover ··· 118 123 .find(|lp| lp.piece == Piece::Rook && lp.file == 0) 119 124 .unwrap() 120 125 .file = 3; 121 - } 126 + } else { 127 + let first_char = algebra.chars().next().unwrap(); 128 + let piece = if first_char.is_ascii_uppercase() { 129 + match first_char { 130 + 'R' => Piece::Rook, 131 + 'N' => Piece::Knight, 132 + 'B' => Piece::Bishop, 133 + 'K' => Piece::King, 134 + 'Q' => Piece::Queen, 135 + _ => unreachable!(), 136 + } 137 + } else { 138 + Piece::Pawn 139 + }; 122 140 123 - let first_char = algebra.chars().next().unwrap(); 124 - let piece = if first_char.is_ascii_uppercase() { 125 - match first_char { 126 - 'R' => Piece::Rook, 127 - 'N' => Piece::Knight, 128 - 'B' => Piece::Bishop, 129 - 'K' => Piece::King, 130 - 'Q' => Piece::Queen, 131 - _ => unreachable!(), 141 + if (piece == Piece::Pawn) { 142 + let file = first_char as usize; 143 + let rank = algebra.chars().nth(1).unwrap() as usize - 'a' as usize; 144 + if algebra.len() == 2 { 145 + nonmover.retain(|lp| lp.rank != rank && lp.file != file); 146 + mover 147 + .iter_mut() 148 + .find(|lp| { 149 + lp.file == file 150 + && lp.piece == Piece::Pawn 151 + && self.valid_moves(lp).includes((rank, file)) 152 + }) 153 + .unwrap() 154 + .rank = rank; 155 + } 132 156 } 133 - } else { 134 - Piece::Pawn 135 - }; 136 157 137 - let destination_square = todo!(); 138 - todo!() 158 + let destination_square = todo!(); 159 + todo!() 160 + } 139 161 } 162 + } 163 + 164 + #[derive(Clone, Copy, PartialEq, Eq)] 165 + enum MoveSegment { 166 + Piece(Piece), 167 + Rank(usize), 168 + File(usize), 169 + Captures, 170 + Promotion(Piece), 140 171 } 141 172 142 173 #[cfg(test)]