Add total board scoring
This commit is contained in:
parent
3c9a0db3cb
commit
3c97c9f2c5
1 changed files with 60 additions and 16 deletions
78
src/lib.rs
78
src/lib.rs
|
@ -93,8 +93,9 @@ trait Dictionary {
|
|||
fn substring_set(&self) -> HashSet<&str>;
|
||||
fn is_word_valid(&self, word: &Word) -> bool;
|
||||
}
|
||||
type DictionaryImpl = HashMap<String, f64>;
|
||||
|
||||
impl Dictionary for HashMap<String, f64> {
|
||||
impl Dictionary for DictionaryImpl{
|
||||
|
||||
fn create(path: &str) -> Self {
|
||||
let mut reader = csv::Reader::from_path(path).unwrap();
|
||||
|
@ -154,7 +155,7 @@ pub struct Board {
|
|||
cells: Vec<Cell>,
|
||||
}
|
||||
|
||||
struct Word<'a> {
|
||||
pub struct Word<'a> {
|
||||
cells: Vec<&'a Cell>,
|
||||
coords: Coordinates,
|
||||
}
|
||||
|
@ -296,23 +297,30 @@ impl Board {
|
|||
}
|
||||
}
|
||||
|
||||
/*
|
||||
fn calculate_scores(&self, dictionary: &Dictionary) -> Result<(Vec<(Word, u32)>, u32), &str> {
|
||||
let words = self.find_played_words()?;
|
||||
|
||||
pub fn calculate_scores(&self, dictionary: &DictionaryImpl) -> Result<(Vec<(Word, u32)>, u32), String> {
|
||||
let (words, tiles_played) = self.find_played_words()?;
|
||||
let mut words_and_scores = Vec::new();
|
||||
let mut total_score = 0;
|
||||
|
||||
for word in words {
|
||||
let mut word_score = 0;
|
||||
let mut word_multiplier = 1;
|
||||
|
||||
|
||||
if !dictionary.contains_key(&word.to_string()) {
|
||||
return Err(format!("{} is not a valid word", word.to_string()));
|
||||
}
|
||||
|
||||
todo!()
|
||||
}*/
|
||||
let score = word.calculate_score();
|
||||
total_score += score;
|
||||
words_and_scores.push((word, score));
|
||||
}
|
||||
|
||||
fn find_played_words(&self) -> Result<Vec<Word>, &str> {
|
||||
if tiles_played == TRAY_LENGTH {
|
||||
total_score += ALL_LETTERS_BONUS;
|
||||
}
|
||||
|
||||
Ok((words_and_scores, total_score))
|
||||
}
|
||||
|
||||
pub fn find_played_words(&self) -> Result<(Vec<Word>, u8), &str> {
|
||||
// We don't assume that the move is valid, so let's first establish that
|
||||
|
||||
|
||||
|
@ -406,7 +414,7 @@ impl Board {
|
|||
}
|
||||
|
||||
if anchored {
|
||||
Ok(words)
|
||||
Ok((words, tiles_played))
|
||||
} else {
|
||||
return Err("Played tiles must be anchored to something")
|
||||
}
|
||||
|
@ -679,7 +687,8 @@ mod tests {
|
|||
is_blank: false,
|
||||
});
|
||||
|
||||
let words = board.find_played_words().unwrap();
|
||||
let (words, tiles_played) = board.find_played_words().unwrap();
|
||||
assert_eq!(tiles_played, 1);
|
||||
assert_eq!(words.len(), 1);
|
||||
let word = words.first().unwrap();
|
||||
assert_eq!(word.calculate_score(), 2);
|
||||
|
@ -700,7 +709,8 @@ mod tests {
|
|||
is_blank: false,
|
||||
});
|
||||
|
||||
let words = board.find_played_words().unwrap();
|
||||
let (words, tiles_played) = board.find_played_words().unwrap();
|
||||
assert_eq!(tiles_played, 1);
|
||||
assert_eq!(words.len(), 1);
|
||||
let word = words.first().unwrap();
|
||||
assert_eq!(word.calculate_score(), 2);
|
||||
|
@ -816,7 +826,8 @@ mod tests {
|
|||
println!("{}", board);
|
||||
let words = board.find_played_words();
|
||||
match words {
|
||||
Ok(x) => {
|
||||
Ok((x, tiles_played)) => {
|
||||
assert_eq!(tiles_played, 2);
|
||||
assert_eq!(x.len(), 1);
|
||||
let word = x.get(0).unwrap();
|
||||
assert_eq!(word.to_string(), "JOEL");
|
||||
|
@ -860,7 +871,8 @@ mod tests {
|
|||
|
||||
let words = board.find_played_words();
|
||||
match words {
|
||||
Ok(x) => {
|
||||
Ok((x, tiled_played)) => {
|
||||
assert_eq!(tiled_played, 2);
|
||||
assert_eq!(x.len(), 2);
|
||||
let word = x.get(0).unwrap();
|
||||
assert_eq!(word.to_string(), "EGG");
|
||||
|
@ -874,6 +886,38 @@ mod tests {
|
|||
}
|
||||
Err(e) => { panic!("Expected to find a word to play; found error {}", e) }
|
||||
}
|
||||
|
||||
let scores = board.calculate_scores(&dictionary);
|
||||
match scores {
|
||||
Ok(_) => {panic!("Expected an error")}
|
||||
Err(e) => {assert_eq!(e, "JOEL is not a valid word")}
|
||||
}
|
||||
|
||||
let mut alt_dictionary = DictionaryImpl::new();
|
||||
alt_dictionary.insert("JOEL".to_string(), 0.5);
|
||||
alt_dictionary.insert("EGG".to_string(), 0.5);
|
||||
|
||||
|
||||
let scores = board.calculate_scores(&alt_dictionary);
|
||||
match scores {
|
||||
Ok((words, total_score)) => {
|
||||
assert_eq!(words.len(), 2);
|
||||
let (word, score) = words.get(0).unwrap();
|
||||
assert_eq!(word.to_string(), "EGG");
|
||||
assert_eq!(word.calculate_score(), 2 + 2 + 2);
|
||||
assert_eq!(*score, 2 + 2 + 2);
|
||||
|
||||
let (word, score) = words.get(1).unwrap();
|
||||
assert_eq!(word.to_string(), "JOEL");
|
||||
assert_eq!(word.calculate_score(), 8 + 1 + 2 + 1);
|
||||
assert_eq!(*score, 8 + 1 + 2 + 1);
|
||||
|
||||
assert_eq!(total_score, 18);
|
||||
}
|
||||
Err(e) => {panic!("Wasn't expecting to encounter error {e}")}
|
||||
}
|
||||
|
||||
|
||||
// replace one of the 'G' in EGG with an ephemeral to trigger an error
|
||||
board.get_cell_mut(maybe_invert(Coordinates(9, 8))).unwrap().value = Some(make_letter('G', true, 2));
|
||||
|
||||
|
|
Loading…
Reference in a new issue