Lesson 2: Programming a Guessing Game

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

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!"),
    }
}