Untitled
unknown
rust
2 years ago
2.8 kB
5
Indexable
use aoko::standard::functions::fun::read_line; use itertools::Itertools; use rand::{thread_rng, Rng}; use std::process; macro_rules! match_op { ($input:ident $num:ident $ask:ident, $($pattern:pat, $idx:expr, $op:tt $($succ:expr)?);+ $(;)?) => { match $input.as_slice() { $( $pattern => { if match $input[$idx..].iter().join("").parse::<u8>() { Ok(num) => num, Err(_) => { println!("Wrong input, try again."); continue; } } $op $num { println!("Yes! You guessed {} times!", $ask); $($succ)? } else { println!("No! You guessed {} times!", $ask); } }, )+ } }; } macro_rules! n { ($new:expr) => { match read_line().trim_end() { "n" => $new, "q" => process::exit(0), _ => panic!("Wrong input, game exit."), } }; } fn main() { 'start: loop { print!("#########################################################\n"); print!("## Welcome to the Guessing Number Game! ##\n"); print!("## Each game produces a random number from 1 to 100. ##\n"); print!("## You can only use >,>=,=,<,<= symbols and numbers ##\n"); print!("## to ask me questions. Like >50, <=38, =47 etc. ##\n"); print!("## I can only answer yes or no! ##\n"); print!("#########################################################\n"); let secret_number = thread_rng().gen_range(1..=100); let mut ask_times = 1; loop { println!("Please input your guess:"); let input = read_line().trim_end().chars().collect_vec(); let succ = || { print!("#####################################\n"); print!("## Bingo! You guessed right! ##\n"); print!("#####################################\n"); print!("You asked {ask_times} times in total!\n"); println!("Input n to start a new game and q to exit the game!"); }; match_op! { input secret_number ask_times, ['<', '=', ..], 2, >=; ['<', ..], 1, >; ['>', '=', ..], 2, <=; ['>', ..], 1, <; ['=', ..], 1, == { succ(); n!(continue 'start); }; _pure_num, 0, == { succ(); n!(continue 'start); }; } ask_times += 1; } } }
Editor is loading...