Add tray and tile pool
This commit is contained in:
parent
55f96f32f5
commit
e3ba7ac440
6 changed files with 164 additions and 6 deletions
|
@ -7,4 +7,4 @@ edition = "2021"
|
|||
|
||||
[dependencies]
|
||||
csv = "1.2.2"
|
||||
|
||||
rand = {version = "0.8.5", features = ["small_rng"]}
|
||||
|
|
29
src/board.rs
29
src/board.rs
|
@ -50,10 +50,10 @@ impl Coordinates {
|
|||
|
||||
#[derive(Debug, Copy, Clone)]
|
||||
pub struct Letter {
|
||||
text: char,
|
||||
points: u32,
|
||||
ephemeral: bool,
|
||||
is_blank: bool,
|
||||
pub text: char,
|
||||
pub points: u32,
|
||||
pub ephemeral: bool,
|
||||
pub is_blank: bool,
|
||||
}
|
||||
|
||||
impl Letter {
|
||||
|
@ -65,6 +65,27 @@ impl Letter {
|
|||
is_blank: false,
|
||||
}
|
||||
}
|
||||
|
||||
pub fn new(text: Option<char>, points: u32) -> Letter {
|
||||
match text {
|
||||
None => {
|
||||
Letter {
|
||||
text: ' ',
|
||||
points,
|
||||
ephemeral: true,
|
||||
is_blank: true,
|
||||
}
|
||||
}
|
||||
Some(text) => {
|
||||
Letter {
|
||||
text,
|
||||
points,
|
||||
ephemeral: true,
|
||||
is_blank: false,
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
|
|
|
@ -1,3 +1,53 @@
|
|||
use rand::prelude::SliceRandom;
|
||||
use rand::{Rng};
|
||||
use crate::board::Letter;
|
||||
|
||||
pub const GRID_LENGTH: u8 = 15;
|
||||
pub const TRAY_LENGTH: u8 = 7;
|
||||
pub const ALL_LETTERS_BONUS: u32 = 50;
|
||||
|
||||
pub fn standard_tile_pool<R: Rng>(rng: Option<&mut R>) -> Vec<Letter> {
|
||||
let mut letters = Vec::new();
|
||||
|
||||
fn add_n_times(vector: &mut Vec<Letter>, letter: Letter, n: usize) {
|
||||
for _ in 0..n {
|
||||
vector.push(letter);
|
||||
}
|
||||
}
|
||||
|
||||
add_n_times(&mut letters, Letter::new(Some('A'), 1), 9);
|
||||
add_n_times(&mut letters, Letter::new(Some('B'), 3), 2);
|
||||
add_n_times(&mut letters, Letter::new(Some('C'), 3), 2);
|
||||
add_n_times(&mut letters, Letter::new(Some('D'), 2), 4);
|
||||
add_n_times(&mut letters, Letter::new(Some('E'), 1), 12);
|
||||
add_n_times(&mut letters, Letter::new(Some('F'), 4), 2);
|
||||
add_n_times(&mut letters, Letter::new(Some('G'), 2), 3);
|
||||
add_n_times(&mut letters, Letter::new(Some('H'), 4), 2);
|
||||
add_n_times(&mut letters, Letter::new(Some('I'), 1), 9);
|
||||
add_n_times(&mut letters, Letter::new(Some('J'), 8), 1);
|
||||
add_n_times(&mut letters, Letter::new(Some('K'), 5), 1);
|
||||
add_n_times(&mut letters, Letter::new(Some('L'), 1), 4);
|
||||
add_n_times(&mut letters, Letter::new(Some('M'), 3), 2);
|
||||
add_n_times(&mut letters, Letter::new(Some('N'), 1), 6);
|
||||
add_n_times(&mut letters, Letter::new(Some('O'), 1), 8);
|
||||
add_n_times(&mut letters, Letter::new(Some('P'), 3), 2);
|
||||
add_n_times(&mut letters, Letter::new(Some('Q'), 10), 1);
|
||||
add_n_times(&mut letters, Letter::new(Some('R'), 1), 6);
|
||||
add_n_times(&mut letters, Letter::new(Some('S'), 1), 4);
|
||||
add_n_times(&mut letters, Letter::new(Some('T'), 1), 6);
|
||||
add_n_times(&mut letters, Letter::new(Some('U'), 1), 4);
|
||||
add_n_times(&mut letters, Letter::new(Some('V'), 4), 2);
|
||||
add_n_times(&mut letters, Letter::new(Some('W'), 4), 2);
|
||||
add_n_times(&mut letters, Letter::new(Some('X'), 8), 1);
|
||||
add_n_times(&mut letters, Letter::new(Some('Y'), 4), 2);
|
||||
add_n_times(&mut letters, Letter::new(Some('Z'), 10), 1);
|
||||
|
||||
add_n_times(&mut letters, Letter::new(None, 0), 2);
|
||||
|
||||
if rng.is_some() {
|
||||
letters.shuffle(rng.unwrap());
|
||||
}
|
||||
|
||||
letters
|
||||
|
||||
}
|
|
@ -2,4 +2,5 @@
|
|||
pub mod constants;
|
||||
pub mod board;
|
||||
pub mod dictionary;
|
||||
pub mod player_interaction;
|
||||
|
||||
|
|
86
src/player_interaction.rs
Normal file
86
src/player_interaction.rs
Normal file
|
@ -0,0 +1,86 @@
|
|||
use crate::board::Letter;
|
||||
|
||||
pub mod ai;
|
||||
|
||||
#[derive(Debug)]
|
||||
pub struct Tray {
|
||||
pub letters: Vec<Option<Letter>>
|
||||
}
|
||||
|
||||
impl Tray {
|
||||
pub fn new(tray_length: u8) -> Self {
|
||||
let mut letters = Vec::with_capacity(tray_length as usize);
|
||||
for _ in 0..tray_length {
|
||||
letters.push(None);
|
||||
}
|
||||
Tray {
|
||||
letters
|
||||
}
|
||||
}
|
||||
|
||||
pub fn fill(&mut self, standard_tile_pool: &mut Vec<Letter>) {
|
||||
for letter in self.letters.iter_mut() {
|
||||
if letter.is_none() {
|
||||
*letter = standard_tile_pool.pop();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub fn remove(&mut self, indices: Vec<u8>) {
|
||||
for i in indices {
|
||||
*self.letters.get_mut(i as usize).unwrap() = None;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
|
||||
#[test]
|
||||
fn test_tray() {
|
||||
let mut letters = vec![
|
||||
Letter::new(Some('E'), 3),
|
||||
Letter::new(Some('O'), 2),
|
||||
Letter::new(Some('J'), 1)
|
||||
];
|
||||
|
||||
let mut tray = Tray::new(5);
|
||||
|
||||
assert_eq!(tray.letters.len(), 5);
|
||||
for letter in &tray.letters {
|
||||
assert!(letter.is_none());
|
||||
}
|
||||
|
||||
*tray.letters.get_mut(3).unwrap() = Some(Letter::new(Some('Z'), 10));
|
||||
|
||||
println!("{:?}", tray);
|
||||
|
||||
assert!(tray.letters.get(3).unwrap().is_some());
|
||||
|
||||
tray.fill(&mut letters);
|
||||
assert!(letters.is_empty());
|
||||
|
||||
println!("{:?}", tray);
|
||||
|
||||
assert_eq!(tray.letters.get(0).unwrap().unwrap().text, 'J');
|
||||
assert_eq!(tray.letters.get(1).unwrap().unwrap().text, 'O');
|
||||
assert_eq!(tray.letters.get(2).unwrap().unwrap().text, 'E');
|
||||
assert_eq!(tray.letters.get(3).unwrap().unwrap().text, 'Z');
|
||||
assert!(tray.letters.get(4).unwrap().is_none());
|
||||
|
||||
tray.remove(vec![3, 4]);
|
||||
|
||||
assert_eq!(tray.letters.get(0).unwrap().unwrap().text, 'J');
|
||||
assert_eq!(tray.letters.get(1).unwrap().unwrap().text, 'O');
|
||||
assert_eq!(tray.letters.get(2).unwrap().unwrap().text, 'E');
|
||||
assert!(tray.letters.get(3).unwrap().is_none());
|
||||
assert!(tray.letters.get(4).unwrap().is_none());
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
0
src/player_interaction/ai.rs
Normal file
0
src/player_interaction/ai.rs
Normal file
Loading…
Reference in a new issue