Move some methods around

This commit is contained in:
2025-02-20 21:24:59 +01:00
parent 797c54e83b
commit 15202df4f4

View File

@@ -158,35 +158,76 @@ pub enum PieceType {
} }
impl PieceType { impl PieceType {
fn initial_setup(&self) -> Vec<(Piece, Position)> { fn new_pawn(color: Color, file: File) -> (Piece, Position) {
fn pawn(color: Color, file: File) -> (Piece, Position) { let pos = Position::new(file, color.get_pawn_rank());
let pos = Position::new(file, color.get_pawn_rank()); (
( Piece {
Piece { piece_type: PieceType::Pawn,
piece_type: PieceType::Pawn, color,
color, },
}, pos,
pos, )
) }
fn pawn_move_rays(position: &Position, color: &Color) -> Vec<Ray> {
let direction = match color {
Color::Black => Direction::Decr,
Color::White => Direction::Incr,
};
let go = |p: &Position| p.delta(&Direction::Stay, &direction);
if position.rank == color.get_pawn_rank() {
let one = go(position).unwrap();
let two = go(&one).unwrap();
vec![Ray {
positions: vec![one, two],
}]
} else {
if let Some(p) = go(position) {
vec![Ray {
positions: vec![p],
}]
} else {
vec![]
}
} }
}
fn pawn_capture_rays(position: &Position, color: &Color) -> Vec<Ray> {
let direction = match color {
Color::Black => Direction::Decr,
Color::White => Direction::Incr,
};
let mut capture_rays = vec![];
if let Some(p) = position.delta(&Direction::Incr, &direction) {
capture_rays.push(Ray {
positions: vec![p],
});
}
if let Some(p) = position.delta(&Direction::Decr, &direction) {
capture_rays.push(Ray {
positions: vec![p],
});
}
capture_rays
}
fn initial_setup(&self) -> Vec<(Piece, Position)> {
match &self { match &self {
PieceType::Pawn => vec![ PieceType::Pawn => vec![
pawn(Color::White, File::A), PieceType::new_pawn(Color::White, File::A),
pawn(Color::White, File::B), PieceType::new_pawn(Color::White, File::B),
pawn(Color::White, File::C), PieceType::new_pawn(Color::White, File::C),
pawn(Color::White, File::D), PieceType::new_pawn(Color::White, File::D),
pawn(Color::White, File::E), PieceType::new_pawn(Color::White, File::E),
pawn(Color::White, File::F), PieceType::new_pawn(Color::White, File::F),
pawn(Color::White, File::G), PieceType::new_pawn(Color::White, File::G),
pawn(Color::White, File::H), PieceType::new_pawn(Color::White, File::H),
pawn(Color::Black, File::A), PieceType::new_pawn(Color::Black, File::A),
pawn(Color::Black, File::B), PieceType::new_pawn(Color::Black, File::B),
pawn(Color::Black, File::C), PieceType::new_pawn(Color::Black, File::C),
pawn(Color::Black, File::D), PieceType::new_pawn(Color::Black, File::D),
pawn(Color::Black, File::E), PieceType::new_pawn(Color::Black, File::E),
pawn(Color::Black, File::F), PieceType::new_pawn(Color::Black, File::F),
pawn(Color::Black, File::G), PieceType::new_pawn(Color::Black, File::G),
pawn(Color::Black, File::H), PieceType::new_pawn(Color::Black, File::H),
], ],
} }
} }
@@ -201,56 +242,19 @@ struct Ray {
positions: Vec<Position>, positions: Vec<Position>,
} }
fn pawn_move_rays(position: &Position, color: &Color) -> Vec<Ray> {
let direction = match color {
Color::Black => Direction::Decr,
Color::White => Direction::Incr,
};
if position.rank == color.get_pawn_rank() {
let one = position.delta(&Direction::Stay, &direction).unwrap();
let two = one.delta(&Direction::Stay, &direction).unwrap();
vec![Ray {
positions: vec![one, two],
}]
} else {
if let Some(position) = position.delta(&Direction::Stay, &direction) {
vec![Ray {
positions: vec![position],
}]
} else {
vec![]
}
}
}
fn pawn_capture_rays(position: &Position, color: &Color) -> Vec<Ray> {
let direction = match color {
Color::Black => Direction::Decr,
Color::White => Direction::Incr,
};
let mut capture_rays = vec![];
if let Some(p) = position.delta(&Direction::Incr, &direction) {
capture_rays.push(Ray {
positions: vec![p],
});
}
if let Some(p) = position.delta(&Direction::Decr, &direction) {
capture_rays.push(Ray {
positions: vec![p],
});
}
capture_rays
}
impl Piece { impl Piece {
fn get_move_rays(&self, position: &Position) -> Vec<Ray> { fn get_move_rays(&self, position: &Position) -> Vec<Ray> {
match self.piece_type { match self.piece_type {
PieceType::Pawn => pawn_move_rays(position, &self.color), PieceType::Pawn => {
PieceType::pawn_move_rays(position, &self.color)
}
} }
} }
fn get_capture_rays(&self, position: &Position) -> Vec<Ray> { fn get_capture_rays(&self, position: &Position) -> Vec<Ray> {
match self.piece_type { match self.piece_type {
PieceType::Pawn => pawn_capture_rays(position, &self.color), PieceType::Pawn => {
PieceType::pawn_capture_rays(position, &self.color)
}
} }
} }
} }