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

Change how move parsing works

+30 -40
+30 -40
src/lib.rs
··· 9 9 } 10 10 11 11 impl Piece { 12 + fn from_char(ch: char) -> Option<Self> { 13 + Some(match ch { 14 + 'N' => Self::Knight, 15 + 'B' => Self::Bishop, 16 + 'R' => Self::Rook, 17 + 'Q' => Self::Queen, 18 + 'K' => Self::King, 19 + 'P' => Self::Pawn, 20 + _ => return None, 21 + }) 22 + } 12 23 fn value(self) -> i32 { 13 24 match self { 14 25 Piece::Pawn => 1, ··· 90 101 white_value - black_value 91 102 } 92 103 fn make_move(&mut self, algebra: &str) { 93 - let mover = if self.white_to_move { 94 - &mut self.white 95 - } else { 96 - &mut self.black 97 - }; 98 - let nonmover = if self.white_to_move { 99 - &mut self.black 104 + let (mover, non_mover) = if self.white_to_move { 105 + (&mut self.white, &mut self.black) 100 106 } else { 101 - &mut self.white 107 + (&mut self.black, &mut self.white) 102 108 }; 103 - 104 109 if algebra == "O-O" || algebra == "0-0" { 105 110 mover 106 111 .iter_mut() ··· 124 129 .unwrap() 125 130 .file = 3; 126 131 } 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 - }; 140 - 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; 132 + let mut move_segments = vec![]; 133 + let mut iter = algebra.chars(); 134 + while let Some(ch) = iter.next() { 135 + if let Some(piece) = Piece::from_char(ch) { 136 + move_segments.push(MoveSegment::Piece(piece)); 137 + } else if let Some(file) = ch.to_digit(10) { 138 + move_segments.push(MoveSegment::File(file as usize)); 139 + } else if ch >= 'a' && ch <= 'h' { 140 + move_segments.push(MoveSegment::Rank(ch as usize)); 141 + } else if ch == 'x' { 142 + move_segments.push(MoveSegment::Captures) 143 + } else if ch == '=' 144 + && let Some(next) = iter.next() // if given bad notation this breaks, but the notation was unparseable anyway 145 + && let Some(piece) = Piece::from_char(next) 146 + { 147 + move_segments.push(MoveSegment::Promotion(piece)); 155 148 } 156 149 } 157 - 158 - let destination_square = todo!(); 159 - todo!() 160 150 } 161 151 } 162 152 }