diff --git a/CHANGELOG.md b/CHANGELOG.md index 72a2829..2ba2602 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +# 0.4.3 + +- Number tower now has to be filled out instead of being calculated automatically. +- Number tower now counts seconds. + # 0.4.2 - update `self_update` dependency, which is now able to replace running files on Windows. diff --git a/Cargo.lock b/Cargo.lock index dec77b3..850714e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -520,7 +520,7 @@ dependencies = [ [[package]] name = "kopfrechner" -version = "0.4.2" +version = "0.4.3" dependencies = [ "colored", "dialoguer", diff --git a/Cargo.toml b/Cargo.toml index 5018c1a..7a1784b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -2,7 +2,7 @@ name = "kopfrechner" authors = ["Wolfgang Schwendtbauer"] repository = "https://github.com/Woife5/kopfrechner" -version = "0.4.2" +version = "0.4.3" edition = "2021" [dependencies] diff --git a/src/modes/mod.rs b/src/modes/mod.rs index 2ef6bd0..bd64ee8 100644 --- a/src/modes/mod.rs +++ b/src/modes/mod.rs @@ -20,7 +20,7 @@ fn get_number_input(prompt: String) -> Option { _ => match input_text.parse::() { Ok(v) => return Some(v), Err(_) => { - println!("\rNot a valid number, try again."); + println!("\rNot a valid number, try again. (Enter 'q' to quit)"); continue; } }, diff --git a/src/modes/multiplication.rs b/src/modes/multiplication.rs index 28d734c..9331da9 100644 --- a/src/modes/multiplication.rs +++ b/src/modes/multiplication.rs @@ -76,8 +76,8 @@ pub fn run(range: RangeInclusive) { } println!("\n{}", "Results:".bold()); - println!("{}: {}", "Correct".green().italic(), correct,); - println!("{}: {}", "Incorrect".red().italic(), incorrect,); + println!("{}: {}", "Correct".green().italic(), correct); + println!("{}: {}", "Incorrect".red().italic(), incorrect); println!( "{}: {:.2}s", "Average time".italic(), diff --git a/src/modes/number_tower.rs b/src/modes/number_tower.rs index 96e80b2..272d1fd 100644 --- a/src/modes/number_tower.rs +++ b/src/modes/number_tower.rs @@ -1,4 +1,4 @@ -use colored::Colorize; +use colored::{ColoredString, Colorize}; use super::get_number_input; @@ -10,20 +10,52 @@ pub fn prepare_and_run() { } } +fn run_iteration(current: &usize, padding: ColoredString) -> Result<(), ()> { + let input = match get_number_input("".to_string()) { + Some(v) => v, + None => return Err(()), + }; + + let input_str = format!("{:>20}", input); + let result_text = if input == *current { + "Correct!".green() + } else { + format!("Wrong! ({})", current).red() + }; + + // Move cursor up one line and clear the line + print!("\x1B[1A\x1B[2K\r"); + println!("{:>20} {} {}", input_str, padding, result_text); + Ok(()) +} + pub fn run(start: usize) { + let start_time = std::time::Instant::now(); let mut current = start; - for i in 2..=9 { + let padding = format!("| × {}", 2).yellow(); + println!("{:>20} {}", current, padding); + current *= 2; + + for i in 3..=9 { let padding = format!("| × {}", i).yellow(); - println!("{:>20} {}", current, padding); + match run_iteration(¤t, padding) { + Err(_) => return, + _ => (), + }; current *= i; } for i in 2..=9 { let padding = format!("| ÷ {}", i).yellow(); - println!("{:>20} {}", current, padding); + match run_iteration(¤t, padding) { + Err(_) => return, + _ => (), + }; current /= i; } println!("{:>20} {}", current, "| Result".yellow()); + let elapsed = start_time.elapsed(); + println!("took {}", elapsed.as_secs()); }