2022年03月11日 日更 73 / 100 天
创建新项目
cargo new guessing_game
cd guessing_game // 进入创建的项目目录
code . // 使用 vscode 打开项目
上述命令自动在 src 目录下创建了一个 main.rs 文件
处理一次猜测
获取用户输入的数字,并打印出来
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); // {} 是变量占位符
}
测试代码
cargo run
生成秘密数字
•引入 rand 包
在 Cargo.toml 文件中声明引入的包
...
[dependencies]
rand = "0.8.5"
编辑器可能有大量报错,看不懂没事。关闭编辑器。执行以下命令
cargo build // 这条命令可以把引入包下载过来
重新打开项目,可以看到一切正常了。
生成一个随机数
use std::io;
use rand::Rng;
fn main() {
println!("Guess the number!");
let secret_number = rand::thread_rng().gen_range(1..101); // 生成随机数的方法
println!("The secret number is : {}", secret_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);
}
比较猜测的数字和秘密数字
use std::{io, cmp::Ordering};
use rand::Rng;
fn main() {
// 省略代码同上
let mut guess= String::new();
io::stdin().read_line(&mut guess).expect("Failed to read line");
// 变量遮蔽把 guess 的类型变成 数字类型
let guess: u32 = guess.trim().parse().expect("Please type a number!");
println!("You guessed:{}", guess);
match guess.cmp(&secret_number) {
Ordering::Less => println!("Too small !"),
Ordering::Greater => println!("Too big!"),
Ordering::Equal => println!("You win!"),
}
}
使用循环来允许多次猜测
use std::{io, cmp::Ordering};
use rand::Rng;
fn main() {
println!("Guess the number!");
let secret_number= rand::thread_rng().gen_range(1..101);
println!("The secret number is : {}", secret_number);
// 引入循环语句处理
loop {
println!("Please input your guess.");
let mut guess= String::new();
io::stdin().read_line(&mut guess).expect("Failed to read line");
// 变量遮蔽把 guess 的类型变成 数字类型
let guess: u32 = guess.trim().parse().expect("Please type a number!");
println!("You guessed:{}", guess);
match guess.cmp(&secret_number) {
Ordering::Less => println!("Too small !"),
Ordering::Greater => println!("Too big!"),
Ordering::Equal => println!("You win!"),
}
}
}
猜测正确后退出
use std::{io, cmp::Ordering};
use rand::Rng;
fn main() {
println!("Guess the number!");
let secret_number= rand::thread_rng().gen_range(1..101);
println!("The secret number is : {}", secret_number);
loop {
println!("Please input your guess.");
let mut guess= String::new();
io::stdin().read_line(&mut guess).expect("Failed to read line");
// 变量遮蔽把 guess 的类型变成 数字类型
let guess: u32 = guess.trim().parse().expect("Please type a number!");
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; // 这里使用 break 退出循环
}
}
}
}
处理无效输入
防止用户输入不是数字的时候,导致程序崩溃。
use std::{io, cmp::Ordering, num};
use rand::Rng;
fn main() {
// 省略代码同上
// 现在这里变成 match 匹配错误处理
let guess: u32 = match guess.trim().parse() {
Ok(num) => num,
Err(_) => continue,
};
println!("You guessed:{}", guess);
// 以下代码同上
}
}
总结
通过这个猜数游戏,正好复习了一个项目,从初始创建,到引入第三方包。程序语法上用到,变量、循环、match匹配。