summaryrefslogtreecommitdiff
path: root/src/grid.rs
diff options
context:
space:
mode:
authorChristian Cunningham <cc@localhost>2024-02-07 19:15:07 -0800
committerChristian Cunningham <cc@localhost>2024-02-07 19:15:07 -0800
commit5f3e5f473c6d7a45297c4d301eb2a2d61078586b (patch)
treebd725a5d16dc27a1c7b5b0997732feb57aaa3192 /src/grid.rs
parentccc015a370b87cebec77c3f48cd72ec3039dea6d (diff)
Modularize
Diffstat (limited to 'src/grid.rs')
-rw-r--r--src/grid.rs179
1 files changed, 179 insertions, 0 deletions
diff --git a/src/grid.rs b/src/grid.rs
new file mode 100644
index 0000000..db7b985
--- /dev/null
+++ b/src/grid.rs
@@ -0,0 +1,179 @@
+use crate::card::card::*;
+use crate::card::player::*;
+
+#[allow(dead_code)]
+pub struct Grid<const SIZE: usize> {
+ pub field: [[Option<Card>; SIZE]; SIZE],
+}
+
+const NO_CARD: Option<Card> = None;
+impl<const SIZE: usize> Default for Grid<SIZE> {
+ fn default() -> Self {
+ Self {
+ field: [[NO_CARD; SIZE]; SIZE],
+ }
+ }
+}
+
+impl<const SIZE: usize> Grid<SIZE> {
+ pub fn randomize(&mut self) {
+ for y in 0..SIZE {
+ for x in 0..SIZE {
+ let mut card = Card::default();
+ card.randomize();
+ self.field[y][x] = Some(card);
+ }
+ }
+ }
+}
+
+fn get_owner(some_card: Option<Card>) -> &'static str {
+ match some_card {
+ Some(card) => {
+ match card.owner {
+ PlayerId::NONE => "( )",
+ PlayerId::PLAYER_1 => "(1)",
+ PlayerId::PLAYER_2 => "(2)",
+ }
+ }
+ None => {
+ "( )"
+ }
+ }
+}
+
+fn get_values(some_card: Option<Card>) -> [u8; 4] {
+ match some_card {
+ Some(card) => {
+ [card.n, card.e, card.s, card.w]
+ },
+ None => {
+ [0; 4]
+ }
+ }
+}
+
+fn get_value_u8(dir: usize, some_card: Option<Card>) -> u8 {
+ let values = get_values(some_card);
+ match dir {
+ // P1N
+ 0 => {
+ match some_card {
+ Some(card) => {
+ match card.owner {
+ PlayerId::PLAYER_2 => values[2],
+ _ => values[0],
+ }
+ }
+ None => {0},
+ }
+ },
+ // P1E
+ 1 => {
+ match some_card {
+ Some(card) => {
+ match card.owner {
+ PlayerId::PLAYER_2 => values[3],
+ _ => values[1],
+ }
+ }
+ None => {0},
+ }
+ },
+ // P1S
+ 2 => {
+ match some_card {
+ Some(card) => {
+ match card.owner {
+ PlayerId::PLAYER_2 => values[0],
+ _ => values[2],
+ }
+ }
+ None => {0},
+ }
+ },
+ // P1W
+ 3 => {
+ match some_card {
+ Some(card) => {
+ match card.owner {
+ PlayerId::PLAYER_2 => values[1],
+ _ => values[3],
+ }
+ }
+ None => {0},
+ }
+ },
+ _ => {0},
+ }
+}
+
+fn get_value(dir: usize, some_card: Option<Card>) -> String {
+ let value = get_value_u8(dir, some_card);
+ if value == 0 {
+ return " ".to_string();
+ }
+ return format!("{:<3?}", value);
+}
+
+impl<const SIZE: usize> core::fmt::Debug for Grid<SIZE> {
+ fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
+ if let Err(error) = write!(f, ".") {
+ return Err(error);
+ }
+ for _x in 0..SIZE {
+ if let Err(error) = write!(f, "============") {
+ return Err(error);
+ }
+ }
+ if let Err(error) = write!(f, ".\n") {
+ return Err(error);
+ }
+ for y in (0..SIZE).rev() {
+ for s in 0..3 {
+ if let Err(error) = write!(f, "|") {
+ return Err(error);
+ }
+ for x in 0..SIZE {
+ match s {
+ 0 => {
+ if let Err(error) = write!(f, " {} ", get_value(0, self.field[y][x])) {
+ return Err(error);
+ }
+ },
+ 1 => {
+ if let Err(error) = write!(f, "{} {} {} ", get_value(3, self.field[y][x]), get_owner(self.field[y][x]), get_value(1, self.field[y][x])) {
+ return Err(error);
+ }
+ },
+ 2 => {
+ if let Err(error) = write!(f, " {} ", get_value(2, self.field[y][x])) {
+ return Err(error);
+ }
+ },
+ _ => {},
+ };
+ //buf = match self.field[y][x] {
+ // None => {write!(f, "{:?} ", PlayerId::NONE)},
+ // Some(card) => {write!(f, "{:?} ", card.owner)},
+ //};
+ }
+ if let Err(error) = write!(f, "|\n") {
+ return Err(error);
+ }
+ }
+ }
+ if let Err(error) = write!(f, "'") {
+ return Err(error);
+ }
+ for _x in 0..SIZE {
+ if let Err(error) = write!(f, "============") {
+ return Err(error);
+ }
+ }
+ if let Err(error) = write!(f, "'\n") {
+ return Err(error);
+ }
+ return Ok(())
+ }
+}