use crate::secret::Secret;
use std::fmt;
#[derive(Debug, PartialEq, Clone)]
pub enum State {
Ongoing,
Victory,
Defeat,
VictoryGameOver,
DefeatGameOver,
}
#[derive(Debug, PartialEq)]
pub struct Game {
pub secret: Secret,
pub lifes: u8,
pub last_guess: char,
pub state: State,
pub last_game: bool,
}
impl Game {
pub fn new(secretstr: &str, lifes: u8, last_game: bool) -> Self {
let secret = Secret::new(secretstr);
Self {
secret,
lifes,
last_guess: ' ',
state: State::Ongoing,
last_game,
}
}
pub fn guess(&mut self, character: char) {
if character == '\n' {
return;
};
self.last_guess = character;
let found = self.secret.guess(character);
if !found {
self.lifes -= 1;
}
self.state = if self.lifes == 0 {
self.secret.disclose_all();
if self.last_game {
State::DefeatGameOver
} else {
State::Defeat
}
} else if self.secret.is_fully_disclosed() {
if self.last_game {
State::VictoryGameOver
} else {
State::Victory
}
} else {
State::Ongoing
};
}
}
impl fmt::Display for Game {
fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> {
writeln!(
f,
"Lives:\t{}\tLast guess: {}\n",
self.lifes, self.last_guess
)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_game_simulation() {
let mut game = Game::new("_ab _cd", 2, true);
assert_eq!(format!("{}", game.secret), " a b _ _\n");
assert_eq!(game.lifes, 2);
assert_eq!(game.last_guess, ' ');
assert_eq!(game.state, State::Ongoing);
assert_eq!(game.last_game, true);
game.guess('c');
assert_eq!(format!("{}", game.secret), " a b c _\n");
assert_eq!(game.lifes, 2);
assert_eq!(game.last_guess, 'c');
assert_eq!(game.state, State::Ongoing);
assert_eq!(game.last_game, true);
game.guess('x');
assert_eq!(format!("{}", game.secret), " a b c _\n");
assert_eq!(game.lifes, 1);
assert_eq!(game.last_guess, 'x');
assert_eq!(game.state, State::Ongoing);
assert_eq!(game.last_game, true);
game.guess('y');
assert_eq!(format!("{}", game.secret), " a b c d\n");
assert_eq!(game.lifes, 0);
assert_eq!(game.last_guess, 'y');
assert_eq!(game.state, State::DefeatGameOver);
assert_eq!(game.last_game, true);
}
}