diff --git a/src/lib.rs b/src/lib.rs index 9b2d479..64ec179 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,15 +1,18 @@ -const GRID_LENGTH: u8 = 15; -const TRAY_LENGTH: u8 = 7; -const ALL_LETTERS_BONUS: u32 = 50; +use std::fmt; +use std::fmt::{Formatter, Write}; + +pub const GRID_LENGTH: u8 = 15; +pub const TRAY_LENGTH: u8 = 7; +pub const ALL_LETTERS_BONUS: u32 = 50; #[derive(Debug)] -enum Letter { +pub enum Letter { FixedLetter{text: char, points: u32}, Blank(char) } #[derive(Debug)] -enum CellType { +pub enum CellType { Normal, DoubleWord, DoubleLetter, @@ -19,19 +22,19 @@ enum CellType { } #[derive(Debug)] -struct Cell { - value: Option, +pub struct Cell { + pub value: Option, cell_type: CellType, } #[derive(Debug)] -struct Board { +pub struct Board { cells: Vec, } impl Board { - fn new() -> Self { + pub fn new() -> Self { let mut cells = Vec::new(); @@ -98,7 +101,7 @@ impl Board { Board {cells} } - fn get_cell(&self, x: u8, y: u8) -> Result<&Cell, &str> { + pub fn get_cell(&self, x: u8, y: u8) -> Result<&Cell, &str> { if x >= GRID_LENGTH || y >= GRID_LENGTH { Err("x & y must be within the board's coordinates") } else { @@ -106,6 +109,63 @@ impl Board { Ok(self.cells.get(coord).unwrap()) } } + + pub fn get_cell_mut(&mut self, x: u8, y: u8) -> Result<&mut Cell, &str> { + if x >= GRID_LENGTH || y >= GRID_LENGTH { + Err("x & y must be within the board's coordinates") + } else { + let coord = (x + GRID_LENGTH*y) as usize; + Ok(self.cells.get_mut(coord).unwrap()) + } + } +} + +impl fmt::Display for Board { + fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { + + let mut str = String::new(); + + let normal = "\x1b[48;5;174m\x1b[38;5;0m"; + let triple_word = "\x1b[48;5;196m\x1b[38;5;0m"; + let double_word = "\x1b[48;5;204m\x1b[38;5;0m"; + let triple_letter = "\x1b[48;5;21m\x1b[38;5;15m"; + let double_letter = "\x1b[48;5;51m\x1b[38;5;0m"; + str.write_char('\n').unwrap(); + + for x in 0..GRID_LENGTH { + + for y in 0..GRID_LENGTH { + let cell = self.get_cell(x, y).unwrap(); + + let color = match cell.cell_type { + CellType::Normal => {normal} + CellType::DoubleWord => {double_word} + CellType::DoubleLetter => {double_letter} + CellType::TripleLetter => {triple_letter} + CellType::TripleWord => {triple_word} + CellType::Start => {double_word} + }; + + let content = match &cell.value { + None => {' '} + Some(letter) => {*match letter { + Letter::FixedLetter {text, points} => {text}, + Letter::Blank(text) => {text} + }} + }; + + + str.write_str(color).unwrap(); + str.write_char(content).unwrap(); + + + } + str.write_str("\x1b[0m\n").unwrap(); + } + + write!(f, "{}", str) + + } } diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..552e2e6 --- /dev/null +++ b/src/main.rs @@ -0,0 +1,24 @@ +use WordGrid::{Board, Letter}; + +fn main() { + let mut board = Board::new(); + + let c1 = board.get_cell_mut(8, 6).unwrap(); + c1.value = Some(Letter::FixedLetter {text: 'J', points: 0}); + board.get_cell_mut(8, 7).unwrap().value = Some(Letter::FixedLetter {text: 'o', points: 0}); + board.get_cell_mut(8, 8).unwrap().value = Some(Letter::FixedLetter {text: 'e', points: 0}); + board.get_cell_mut(8, 9).unwrap().value = Some(Letter::FixedLetter {text: 'l', points: 0}); + + board.get_cell_mut(9, 8).unwrap().value = Some(Letter::FixedLetter {text: 'i', points: 0}); + board.get_cell_mut(9, 9).unwrap().value = Some(Letter::FixedLetter {text: 's', points: 0}); + + board.get_cell_mut(10, 8).unwrap().value = Some(Letter::FixedLetter {text: 'c', points: 0}); + board.get_cell_mut(10, 9).unwrap().value = Some(Letter::FixedLetter {text: 'o', points: 0}); + board.get_cell_mut(10, 10).unwrap().value = Some(Letter::FixedLetter {text: 'o', points: 0}); + board.get_cell_mut(10, 11).unwrap().value = Some(Letter::FixedLetter {text: 'l', points: 0}); + + println!("{}", board); + + //println!("\x1b[38;5;196m Hello my name is Joel"); + //println!("\x1b[48;5;20m Hello my name is Joel"); +} \ No newline at end of file