diff --git a/src/board.rs b/src/board.rs deleted file mode 100644 index c236eed..0000000 --- a/src/board.rs +++ /dev/null @@ -1,24 +0,0 @@ -// bored -use crate::models::piece::Piece; - - -fn print_board(board: Board) { - println!("{}", board.iter().map(|row| row.iter().map(|p| p.to_string())..join(" ")).join("\n")); -} - -fn main() { - // let board = vec![ - // vec![Piece::Pharaoh], - // vec![], - // vec![], - // vec![], - // ]; - - // print_board(board); -} - - -fn is_legal_move() -> bool { - return true; -} - diff --git a/src/main.rs b/src/main.rs index 91daa5e..4b5bb1f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,9 +1,10 @@ use std::env; -mod models { - pub mod board; - pub mod piece; - pub mod networking; -} + +// mod models { +// pub mod board; +// pub mod piece; +// pub mod networking; +// } fn print_help() { println!("Ey fam, hmu with dat '--serve' or '--join
'") @@ -38,26 +39,26 @@ fn main() { } - println!("{}", serialize_move(models::networking::Action::Rotate { - from: (2, 2), - rot: models::networking::RotationDirection::Positive - })); + // println!("{}", &serialize_move(models::networking::Action::Rotate { + // from: (2, 2), + // rot: models::networking::RotationDirection::Positive + // })); } -fn serialize_move(action: models::networking::Action) -> str { - let serialized = serde_json::to_string(&action); - match serialized { - Ok(s) => { - println!("OK: {}", s); - return &s; - }, - Err(_e) => { - println!("Couldn't serialize..."); - return (""); - } - } - } \ No newline at end of file +// fn serialize_move(action: models::networking::Action) -> str { +// let serialized = serde_json::to_string(&action); +// match serialized { +// Ok(s) => { +// println!("OK: {}", s); +// return &s; +// }, +// Err(_e) => { +// println!("Couldn't serialize..."); +// return (""); +// } +// } +// } \ No newline at end of file diff --git a/src/models.rs b/src/models.rs deleted file mode 100644 index e69de29..0000000 diff --git a/src/models/board.rs b/src/models/board.rs index ddf029b..07997e4 100644 --- a/src/models/board.rs +++ b/src/models/board.rs @@ -1,5 +1,58 @@ +use std::fmt; -// use crate::models::piece::Piece; +use super::piece::Piece; -// #[derive(Display)] -pub type Board = Vec>; \ No newline at end of file +pub struct Board(Vec>>); + +impl fmt::Display for Board { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + let str = self + .0 + .to_vec() + .into_iter() + .map(|row| { + row + .into_iter() + .map(|op| match op { + Some(p) => p.to_string(), + None => ".".to_string(), + }) + .collect::>() + .join(" ") + .to_string() + }) + .collect::>() + .join("\n"); + + return write!(f, "{}", str); + } +} + +impl Board { + pub fn from_string(s: &str) -> Board { + let board = s + .split("\n") + .map(|row| { + row + .chars() + .map(|l| Piece::from_string(&l).ok()) + .collect::>() + }) + .collect::>(); + Board(board) + } + + pub fn default() -> Board { + let board = vec![ + "....OpO2..", + "..3.......", + "...4......", + "1.3.\\/.2.4", + "2.4./\\.1.3", + "......2...", + ".......1..", + "..4OpO....", + ]; + Board::from_string(&board.join("\n")) + } +} \ No newline at end of file diff --git a/src/models/mod.rs b/src/models/mod.rs new file mode 100644 index 0000000..df2f8b7 --- /dev/null +++ b/src/models/mod.rs @@ -0,0 +1,8 @@ +pub mod board; +// pub mod networking; +pub mod piece; +pub mod player; + +fn main() { + println!("{}", board::Board::default()) +} \ No newline at end of file diff --git a/src/models/piece.rs b/src/models/piece.rs index ebf52e5..9a76fd1 100644 --- a/src/models/piece.rs +++ b/src/models/piece.rs @@ -1,37 +1,81 @@ use std::fmt; -enum DjedDirection { +use super::player::Player; + +#[derive(Clone)] +pub enum DjedDirection { NorthWest, NorthEast, } -enum PyramidDirection { - NorthWest, +#[derive(Clone)] +pub enum PyramidDirection { NorthEast, SouthEast, SouthWest, + NorthWest, } -enum Stack { +#[derive(Clone)] +pub enum ObeliskStack { Single, Double, } -// #[derive(Display)] -pub enum Piece { +#[derive(Clone)] +pub enum PieceType { Pharaoh, Djed(DjedDirection), Pyramid(PyramidDirection), - Obelisk(Stack) + Obelisk(ObeliskStack), +} + +#[derive(Clone)] +pub struct Piece { + player: Player, + typ: PieceType, } impl fmt::Display for Piece { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - match self { - Piece::Pharaoh => write!(f, "Pharaoh"), - Piece::Djed(_) => write!(f, "Djed"), - Piece::Pyramid(_) => write!(f, "Pyramid"), - Piece::Obelisk(_) => write!(f, "Obelisk"), + match &self.typ { + PieceType::Pharaoh => write!(f, "P"), + PieceType::Djed(d) => match d { + DjedDirection::NorthWest => write!(f, "⟋"), + DjedDirection::NorthEast => write!(f, "⟍"), + }, + PieceType::Pyramid(d) => match d { + PyramidDirection::NorthEast => write!(f, "\u{25E3}"), + PyramidDirection::SouthEast => write!(f, "\u{25E4}"), + PyramidDirection::SouthWest => write!(f, "\u{25E5}"), + PyramidDirection::NorthWest => write!(f, "\u{25E2}"), + }, + PieceType::Obelisk(s) => match s { + ObeliskStack::Single => write!(f, "\u{25C7}"), + ObeliskStack::Double => write!(f, "\u{25C8}"), + }, } } -} \ No newline at end of file +} + +impl Piece { + pub fn from_string(s: &char) -> Result { + let typ = match s { + 'p' => Some(PieceType::Pharaoh), + '/' => Some(PieceType::Djed(DjedDirection::NorthWest)), + '\\' => Some(PieceType::Djed(DjedDirection::NorthEast)), + '1' => Some(PieceType::Pyramid(PyramidDirection::NorthEast)), + '2' => Some(PieceType::Pyramid(PyramidDirection::SouthEast)), + '3' => Some(PieceType::Pyramid(PyramidDirection::SouthWest)), + '4' => Some(PieceType::Pyramid(PyramidDirection::NorthWest)), + 'o' => Some(PieceType::Obelisk(ObeliskStack::Single)), + 'O' => Some(PieceType::Obelisk(ObeliskStack::Double)), + _ => None, + }; + + match typ { + Some(p) => Ok(Piece {typ: p, player: Player::player1("test-user")}), + None => Err("No such piece"), + } + } +} diff --git a/src/models/player.rs b/src/models/player.rs new file mode 100644 index 0000000..267d056 --- /dev/null +++ b/src/models/player.rs @@ -0,0 +1,15 @@ +#[derive(Clone)] +pub struct Player { + name: String, + // TODO: Make color its own type + color: String, +} + +impl Player { + pub fn player1(name: &str) -> Player { + Player { + name: name.to_string(), + color: "".to_string(), + } + } +} \ No newline at end of file