console_games/games/
guess_the_number.rs1use crate::Play;
2use console::Term;
3use rand::Rng;
4use std::{
5 cmp::Ordering,
6 io::{stdin, stdout, Write},
7};
8
9pub struct GuessTheNumber;
10
11impl Play for GuessTheNumber {
12 fn name(&self) -> &'static str {
13 "Guess the Number"
14 }
15
16 fn start(&self) {
17 let mut rng = rand::thread_rng();
18 let min = 0;
19 let max = 100;
20 let random_number = rng.gen_range(min..=max);
21
22 let term = Term::stdout();
23
24 for i in (0..7).rev() {
25 print!(
26 "Guesses left: {}\nBetween {} and {}, inclusive\nYou Choose: ",
27 i + 1,
28 min,
29 max
30 );
31 stdout().flush().expect("Failed to flush");
32
33 let mut input = String::new();
34 stdin().read_line(&mut input).expect("Failed to read input");
35
36 let input = input.trim();
37 if input.is_empty() {
38 continue;
39 }
40 let input: u8 = match input.parse() {
41 Ok(val) => val,
42 Err(_) => continue,
43 };
44
45 term.clear_screen().expect("Failed to clear screen");
46
47 match input.cmp(&random_number) {
48 Ordering::Less => println!("{input}, Too low!\n"),
49 Ordering::Greater => println!("{input}, Too high!\n"),
50 Ordering::Equal => {
51 println!("You win!\n");
52 break;
53 }
54 }
55 }
56
57 println!("You lose!\nThe number was {random_number}\n");
58 }
59}