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
表示失败。