From bc75b075ef59a6b3b04b8a7b060809b64e8886d0 Mon Sep 17 00:00:00 2001 From: Micha White Date: Fri, 22 Dec 2023 10:02:53 -0500 Subject: Add SquareCoordinates methods --- model/src/board.rs | 2 +- model/src/coordinates.rs | 59 +++++++++++++++++++++++++++++++++++++++++++----- model/src/moves.rs | 4 ++-- 3 files changed, 56 insertions(+), 9 deletions(-) diff --git a/model/src/board.rs b/model/src/board.rs index 7d61779..52d2b44 100644 --- a/model/src/board.rs +++ b/model/src/board.rs @@ -147,7 +147,7 @@ impl CheckersBitBoard { if row > 32 || col > 32 { None } else { - let value = SquareCoordinate::new(row as u8, col as u8).to_value(); + let value = SquareCoordinate::new(row as u8, col as u8).to_ampere_value(); if let Some(value) = value { if self.piece_at(value) { Some(Piece::new( diff --git a/model/src/coordinates.rs b/model/src/coordinates.rs index c821e1f..0f45322 100644 --- a/model/src/coordinates.rs +++ b/model/src/coordinates.rs @@ -8,16 +8,55 @@ pub struct SquareCoordinate { impl SquareCoordinate { pub fn new(rank: u8, file: u8) -> Self { - if rank > 32 { - panic!("A Square cannot have a rank greater than 32. Got {}", rank) - } else if file > 32 { - panic!("A Square cannot have a file greater than 32. Got {}", file) + if rank > 8 { + panic!("A Square cannot have a rank greater than 8. Got {}", rank) + } else if file > 8 { + panic!("A Square cannot have a file greater than 8. Got {}", file) } else { Self { rank, file } } } - pub fn from_value(value: usize) -> Self { + pub fn from_normal_value(value: usize) -> Self { + static VALUE_COORDINATE_MAP: [SquareCoordinate; 32] = [ + SquareCoordinate { rank: 0, file: 6 }, + SquareCoordinate { rank: 0, file: 4 }, + SquareCoordinate { rank: 0, file: 2 }, + SquareCoordinate { rank: 0, file: 0 }, + SquareCoordinate { rank: 1, file: 7 }, + SquareCoordinate { rank: 1, file: 5 }, + SquareCoordinate { rank: 1, file: 3 }, + SquareCoordinate { rank: 1, file: 1 }, + SquareCoordinate { rank: 2, file: 6 }, + SquareCoordinate { rank: 2, file: 4 }, + SquareCoordinate { rank: 2, file: 2 }, + SquareCoordinate { rank: 2, file: 0 }, + SquareCoordinate { rank: 3, file: 7 }, + SquareCoordinate { rank: 3, file: 5 }, + SquareCoordinate { rank: 3, file: 3 }, + SquareCoordinate { rank: 3, file: 1 }, + SquareCoordinate { rank: 4, file: 6 }, + SquareCoordinate { rank: 4, file: 4 }, + SquareCoordinate { rank: 4, file: 2 }, + SquareCoordinate { rank: 4, file: 0 }, + SquareCoordinate { rank: 5, file: 7 }, + SquareCoordinate { rank: 5, file: 5 }, + SquareCoordinate { rank: 5, file: 3 }, + SquareCoordinate { rank: 5, file: 1 }, + SquareCoordinate { rank: 6, file: 6 }, + SquareCoordinate { rank: 6, file: 4 }, + SquareCoordinate { rank: 6, file: 2 }, + SquareCoordinate { rank: 6, file: 0 }, + SquareCoordinate { rank: 7, file: 7 }, + SquareCoordinate { rank: 7, file: 5 }, + SquareCoordinate { rank: 7, file: 3 }, + SquareCoordinate { rank: 7, file: 1 }, + ]; + + VALUE_COORDINATE_MAP[value] + } + + pub fn from_ampere_value(value: usize) -> Self { static VALUE_COORDINATE_MAP: [SquareCoordinate; 32] = [ SquareCoordinate { rank: 0, file: 6 }, SquareCoordinate { rank: 1, file: 7 }, @@ -64,7 +103,7 @@ impl SquareCoordinate { self.file } - pub fn to_value(self) -> Option { + pub fn to_ampere_value(self) -> Option { if self.rank % 2 == 0 { if self.file % 2 == 0 { Some(((18 - ((self.file / 2) * 6)) + ((self.rank / 2) * 8)) as usize % 32) @@ -91,6 +130,14 @@ impl SquareCoordinate { None } } + + pub fn to_normal_value(self) -> Option { + if self.rank % 2 == 0 { + Some(self.rank as usize * 4 + self.file as usize % 4) + } else { + Some(self.rank as usize * 4 + self.file as usize % 4 + 1) + } + } } impl Display for SquareCoordinate { diff --git a/model/src/moves.rs b/model/src/moves.rs index 525a35c..c266f77 100644 --- a/model/src/moves.rs +++ b/model/src/moves.rs @@ -131,8 +131,8 @@ impl Display for Move { write!( f, "{}-{}", - SquareCoordinate::from_value(self.start() as usize), - SquareCoordinate::from_value(self.end_position()) + SquareCoordinate::from_ampere_value(self.start() as usize), + SquareCoordinate::from_ampere_value(self.end_position()) ) } } -- cgit v1.2.3