Initial commit; board grid is defined
This commit is contained in:
commit
b874bb99d4
3 changed files with 145 additions and 0 deletions
3
.gitignore
vendored
Normal file
3
.gitignore
vendored
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
/target
|
||||||
|
/Cargo.lock
|
||||||
|
.idea/
|
8
Cargo.toml
Normal file
8
Cargo.toml
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
[package]
|
||||||
|
name = "WordGrid"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2021"
|
||||||
|
|
||||||
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
|
[dependencies]
|
134
src/lib.rs
Normal file
134
src/lib.rs
Normal file
|
@ -0,0 +1,134 @@
|
||||||
|
const GRID_LENGTH: u8 = 15;
|
||||||
|
const TRAY_LENGTH: u8 = 7;
|
||||||
|
const ALL_LETTERS_BONUS: u32 = 50;
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
enum Letter {
|
||||||
|
FixedLetter{text: char, points: u32},
|
||||||
|
Blank(char)
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
enum CellType {
|
||||||
|
Normal,
|
||||||
|
DoubleWord,
|
||||||
|
DoubleLetter,
|
||||||
|
TripleLetter,
|
||||||
|
TripleWord,
|
||||||
|
Start,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
struct Cell {
|
||||||
|
value: Option<Letter>,
|
||||||
|
cell_type: CellType,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
struct Board {
|
||||||
|
cells: Vec<Cell>,
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
impl Board {
|
||||||
|
fn new() -> Self {
|
||||||
|
let mut cells = Vec::new();
|
||||||
|
|
||||||
|
|
||||||
|
/// Since the board is symmetrical in both directions for the purposes of our logic we can keep our coordinates in one corner
|
||||||
|
///
|
||||||
|
/// # Arguments
|
||||||
|
///
|
||||||
|
/// * `x`: A coordinate
|
||||||
|
///
|
||||||
|
/// returns: u8 The coordinate mapped onto the lower-half
|
||||||
|
fn map_to_corner(x: u8) -> u8 {
|
||||||
|
return if x > GRID_LENGTH / 2 {
|
||||||
|
GRID_LENGTH - x - 1
|
||||||
|
} else {
|
||||||
|
x
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for i in 0..GRID_LENGTH {
|
||||||
|
let i = map_to_corner(i);
|
||||||
|
for j in 0..GRID_LENGTH {
|
||||||
|
let j = map_to_corner(j);
|
||||||
|
|
||||||
|
let mut typee = CellType::Normal;
|
||||||
|
|
||||||
|
// double word scores are diagonals
|
||||||
|
if i == j {
|
||||||
|
typee = CellType::DoubleWord;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Triple letters
|
||||||
|
if (i % 4 == 1) && j % 4 == 1 && !(i == 1 && j == 1) {
|
||||||
|
typee = CellType::TripleLetter;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Double letters
|
||||||
|
if (i % 4 == 2) && (j % 4 == 2) && !(
|
||||||
|
i == 2 && j == 2
|
||||||
|
) {
|
||||||
|
typee = CellType::DoubleLetter;
|
||||||
|
}
|
||||||
|
if (i.min(j) == 0 && i.max(j) == 3) || (i.min(j)==3 && i.max(j) == 7) {
|
||||||
|
typee = CellType::DoubleLetter;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Triple word scores
|
||||||
|
if (i % 7 == 0) && (j % 7 == 0) {
|
||||||
|
typee = CellType::TripleWord;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Start
|
||||||
|
if i == 7 && j == 7 {
|
||||||
|
typee = CellType::Start;
|
||||||
|
}
|
||||||
|
|
||||||
|
cells.push(Cell {
|
||||||
|
cell_type: typee,
|
||||||
|
value: None,
|
||||||
|
})
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Board {cells}
|
||||||
|
}
|
||||||
|
|
||||||
|
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 {
|
||||||
|
let coord = (x + GRID_LENGTH*y) as usize;
|
||||||
|
Ok(self.cells.get(coord).unwrap())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_cell_types() {
|
||||||
|
let board = Board::new();
|
||||||
|
|
||||||
|
assert!(matches!(board.get_cell(0, 0).unwrap().cell_type, CellType::TripleWord));
|
||||||
|
assert!(matches!(board.get_cell(1, 0).unwrap().cell_type, CellType::Normal));
|
||||||
|
assert!(matches!(board.get_cell(0, 1).unwrap().cell_type, CellType::Normal));
|
||||||
|
assert!(matches!(board.get_cell(1, 1).unwrap().cell_type, CellType::DoubleWord));
|
||||||
|
|
||||||
|
assert!(matches!(board.get_cell(13, 13).unwrap().cell_type, CellType::DoubleWord));
|
||||||
|
assert!(matches!(board.get_cell(14, 14).unwrap().cell_type, CellType::TripleWord));
|
||||||
|
assert!(matches!(board.get_cell(11, 14).unwrap().cell_type, CellType::DoubleLetter));
|
||||||
|
|
||||||
|
assert!(matches!(board.get_cell(7, 7).unwrap().cell_type, CellType::Start));
|
||||||
|
assert!(matches!(board.get_cell(8, 6).unwrap().cell_type, CellType::DoubleLetter));
|
||||||
|
assert!(matches!(board.get_cell(5, 9).unwrap().cell_type, CellType::TripleLetter));
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue