a simple chess game to play locally on a tablet or with a mouse
at master 3.2 kB view raw
1use crate::types; 2 3pub fn parse_fen(fen_string: &str) -> Vec<Vec<types::Piece>> { 4 let array = fen_string.split("/").collect::<Vec<&str>>(); 5 let mut board: Vec<Vec<types::Piece>> = vec![]; 6 7 for x in 0..8 { 8 board.push(vec![]); 9 for _ in 0..8 { 10 board[x].push(types::Piece::Empty); 11 } 12 } 13 14 let mut line_offset: usize = 0; 15 for line in array { 16 let mut offset: usize = 0; 17 for piece in line.chars() { 18 let piece_color: types::PieceColor = if piece.is_ascii_uppercase() { types::PieceColor::White } else { types::PieceColor::Black }; 19 20 match piece.to_ascii_lowercase() { 21 'p' => board[offset][line_offset] = types::Piece::Pawn(piece_color), 22 'r' => board[offset][line_offset] = types::Piece::Rook(piece_color), 23 'n' => board[offset][line_offset] = types::Piece::Knight(piece_color), 24 'b' => board[offset][line_offset] = types::Piece::Bishop(piece_color), 25 'q' => board[offset][line_offset] = types::Piece::Queen(piece_color), 26 'k' => board[offset][line_offset] = types::Piece::King(piece_color), 27 x => { 28 if !x.is_numeric() { 29 panic!("Invalid FEN string at: {}", x); 30 } 31 32 let skip: i32 = x.to_string().parse::<i32>().unwrap(); 33 34 35 for _ in 0..skip { 36 board[offset][line_offset] = types::Piece::Empty; 37 offset += 1; 38 } 39 } 40 } 41 42 if ['r', 'n', 'b', 'q', 'k', 'p'].contains(&piece.to_ascii_lowercase()) { 43 offset += 1; 44 } 45 } 46 47 line_offset += 1; 48 } 49 50 for x in 0..8 { 51 for y in 0..8 { 52 match &board[x][y] { 53 types::Piece::Empty => print!("( )"), 54 types::Piece::Pawn(color) => print!("({})", match color { 55 types::PieceColor::White => "P", 56 types::PieceColor::Black => "p" 57 }), 58 types::Piece::Rook(color) => print!("({})", match color { 59 types::PieceColor::White => "R", 60 types::PieceColor::Black => "r" 61 }), 62 types::Piece::Knight(color) => print!("({})", match color { 63 types::PieceColor::White => "N", 64 types::PieceColor::Black => "n" 65 }), 66 types::Piece::Bishop(color) => print!("({})", match color { 67 types::PieceColor::White => "B", 68 types::PieceColor::Black => "b" 69 }), 70 types::Piece::Queen(color) => print!("({})", match color { 71 types::PieceColor::White => "Q", 72 types::PieceColor::Black => "q" 73 }), 74 types::Piece::King(color) => print!("({})", match color { 75 types::PieceColor::White => "K", 76 types::PieceColor::Black => "k" 77 }) 78 } 79 } 80 println!(); 81 } 82 83 board 84}