console_games/games/
guess_the_number.rs

1use 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}