Skip to content

2. 猜数字游戏

2.1 代码结构

rust
// prelude,导入标准库
use std::io;

fn main() {
    println!("猜数游戏!");

    // 可变变量接收用户输入
    let mut guess = String::new();
    io::stdin().read_line(&mut guess).expect("读取行失败");
    println!("你猜测的数字是:{}", guess);
}

上述代码用于实现读取用户输入的功能,io::stdin().read_line(&mut guess) 用于读取用户输入的内容,&mut guess 表示将用户输入的内容存储到 guess 变量中。

2.2 使用 rand 库生成随机数

由于 Rust 并没有提供生成随机数的标准库,我们需要使用第三方库 rand 来生成随机数。

Cargo.toml 中添加 rand 库的依赖:

toml
[dependencies]
rand = "^0.8.5"

修改 main.rs 文件:

rust
use rand::Rng;
use std::io;

fn main() {
    println!("猜数游戏!");
    let secret_number = rand::thread_rng().gen_range(1..101);

    loop {
        let mut guess = String::new();
        io::stdin().read_line(&mut guess).expect("读取行失败");
        let guess: u32 = guess.trim().parse().expect("请输入一个数字");

        println!("你猜测的数字是:{}", guess);

        match guess.cmp(&secret_number) {
            std::cmp::Ordering::Less => println!("太小了!"),
            std::cmp::Ordering::Greater => println!("太大了!"),
            std::cmp::Ordering::Equal => {
                println!("你赢了!");
                break;
            },
        }
    }
}

我们还可以使用 match 语句对错误处理进行一些优化:

rust
use rand::Rng;
use std::io;
use std::io::Write;

fn main() {
    println!("猜数游戏!");
    let secret_number = rand::thread_rng().gen_range(1..101);

    loop {
        print!("请输入数字:");
        io::stdout().flush().unwrap();

        let mut guess = String::new();
        io::stdin().read_line(&mut guess).expect("读取行失败");
        let guess: u32 = match guess.trim().parse() {
            Ok(num) => num,
            Err(_) => {
                println!("请输入一个数字!");
                continue;
            },
        };

        println!("你猜测的数字是:{}", guess);

        match guess.cmp(&secret_number) {
            std::cmp::Ordering::Less => println!("太小了!"),
            std::cmp::Ordering::Greater => println!("太大了!"),
            std::cmp::Ordering::Equal => {
                println!("你赢了!");
                break;
            }
        }
    }
}

我们先解释一些语句。

use 语句用于导入库,rand::Rng 是一个第三方库,用于生成随机数。

rust
use rand::Rng;
use std::io;

let 语句用于声明变量,使用 mut 关键字声明可变变量(Mutable Variable)。

1..101 是一个范围(Range),表示从 1 到 100(不包含 101)的范围。这是 Rust 的一个新语法区间表达式,如果想包含 101 可以写作 1..=100

parse().expect("请输入一个数字"); 是一个错误处理行为,如果用户输入的不是数字,程序会抛出异常。

.parse() 在此返回一个 Result<u32, ParseIntError> 类型,Result 是一个枚举类型,Ok 表示成功,Err 表示失败。