This lesson builds a number-guessing game, covering variables, I/O, random numbers, types, control flow, and error handling.
1. Setting Up the Project
$ cargo new guessing_game
$ cd guessing_game
Run: cargo run (outputs "Hello, world!").
2. Accepting User Input
use std::io;
fn main() {
println!("Guess the number!");
println!("Please input your guess.");
let mut guess = String::new();
io::stdin()
.read_line(&mut guess)
.expect("Failed to read line");
println!("You guessed: {guess}");
}
3. Generating a Random Secret Number
Add to Cargo.toml:
[dependencies]
rand = "0.8.5"
Update main.rs:
use std::io;
use rand::Rng;
fn main() {
// ... (add)
let secret_number = rand::thread_rng().gen_range(1..=100);
println!("The secret number is: {secret_number}");
// ... (rest of input code)
}
4. Comparing Guess to Secret Number
use std::cmp::Ordering;
// ... (add to imports)
let guess: u32 = guess.trim().parse().expect("Please type a number!");
match guess.cmp(&secret_number) {
Ordering::Less => println!("Too small!"),
Ordering::Greater => println!("Too big!"),
Ordering::Equal => println!("You win!"),
}
5. Allowing Multiple Guesses with a Loop
Wrap in loop { ... } and add break; on win.
6. Handling Invalid Input
let guess: u32 = match guess.trim().parse() {
Ok(num) => num,
Err(_) => continue,
};
7. Final Code
use std::cmp::Ordering;
use std::io;
use rand::Rng;
fn main() {
println!("Guess the number!");
let secret_number = rand::thread_rng().gen_range(1..=100);
loop {
println!("Please input your guess.");
let mut guess = String::new();
io::stdin()
.read_line(&mut guess)
.expect("Failed to read line");
let guess: u32 = match guess.trim().parse() {
Ok(num) => num,
Err(_) => continue,
};
println!("You guessed: {guess}");
match guess.cmp(&secret_number) {
Ordering::Less => println!("Too small!"),
Ordering::Greater => println!("Too big!"),
Ordering::Equal => {
println!("You win!");
break;
}
}
}
}
Key Concepts
- Variables and mutability (
let mut). - String handling, error handling with
Result. - Random generation with
rand. - Control flow:
loop,match,break,continue. - Cargo for dependencies.
You Try
Edit the guess value below and click Run to see how the match expression handles comparisons (simplified without random or input).
use std::cmp::Ordering;
fn main() {
let secret = 5;
let guess = 3; // Change this value and run
match guess.cmp(&secret) {
Ordering::Less => println!("Too small!"),
Ordering::Greater => println!("Too big!"),
Ordering::Equal => println!("You win!"),
}
}