Rust 编程实现猜数字游戏
文章目录
- 编程实现猜数字游戏
- 游戏规则
- 创建新项目
- 默认代码
- 处理用户输入
- 代码解析
- 生成随机数
- 添加依赖
- 生成逻辑
- 比较猜测值与目标值
- 类型转换
- 循环与错误处理优化
- 添加循环
- 优雅处理非法输入
- 最终完整代码
- 核心概念总结
编程实现猜数字游戏
我们使用cargo
和rust
实现一个经典编程练习——猜数字游戏,在实践中掌握Rust核心概念:let绑定、match模式匹配、方法、关联函数、外部包(crate)等。
游戏规则
程序生成1-100的随机整数作为目标数字。玩家输入猜测值后,程序提示猜测偏大或偏小。若猜中则显示祝贺信息并退出。
创建新项目
### 初始化项目
$ cargo new guessing_game
$ cd guessing_game
-
第一条命令创建项目,第二条进入项目目录
-
生成的Cargo.toml文件包含项目元信息:
[package]
name = "guessing_game"
version = "0.1.0"
edition = "2024"
[dependencies] # 依赖项声明区域
默认代码
src/main.rs包含自动生成的"Hello, world!":
fn main() {println!("Hello, world!");}
使用cargo run编译并运行:
$ cargo run
Hello, world!
处理用户输入
use std::io; // 导入I/O库fn main() {println!("猜数字游戏!");println!("请输入你的猜测:");let mut guess = String::new(); // 可变字符串变量io::stdin().read_line(&mut guess) // 读取输入到guess.expect("读取失败"); // 错误处理println!("你猜的是: {}", guess); // 占位符输出
}
代码解析
-
let mut
:声明可变变量(默认不可变) -
String::new()
:创建空字符串,::表示关联函数 -
&mut guess
:可变引用,允许修改字符串内容 -
expect()
:处理Result类型(成功返回内容,失败崩溃并显示信息)
生成随机数
添加依赖
修改Cargo.toml:
[dependencies]
rand = "0.9.1" # 指定版本号
Cargo会自动下载依赖(含次级依赖包)
注:这里也可通过cargo add rand来安装依赖。
生成逻辑
use rand::Rng; // 导入随机数特性(trait)let secret_number = rand::thread_rng().gen_range(1..=100);
println!("神秘数字: {}", secret_number); // 测试用
thread_rng():获取线程本地生成器
gen_range(1..=100):生成1-100闭区间随机数
比较猜测值与目标值
use std::cmp::Ordering; // 导入比较枚举match guess.cmp(&secret_number) {Ordering::Less => println!("太小了!"),Ordering::Greater => println!("太大了!"),Ordering::Equal => println!("你赢了!")
}
类型转换
需将字符串猜测值转为整数:
let guess: u32 = guess.trim().parse().expect("请输入数字!");
// 类型标注 | 去空格 | 解析 | 错误处理
-
遮蔽(shadowing):复用变量名转换类型
-
错误处理:非数字输入导致崩溃(后续优化)
循环与错误处理优化
添加循环
loop {// 输入和比较逻辑}
优雅处理非法输入
替换expect为模式匹配,避免崩溃:
let guess: u32 = match guess.trim().parse() {Ok(num) => num, // 解析成功返回数字Err(_) => continue, // 失败则跳过本轮循环};
### 胜利时退出
在匹配成功分支添加break:
Ordering::Equal => {println!("你赢了!");break; // 退出循环
}
最终完整代码
use std::cmp::Ordering;
use std::io;
use rand::Rng;fn main() {println!("猜数字游戏!");// rand::thread_rng 在0.9.1版中过期。// let secret_number = rand::thread_rng().gen_range(1..=100);let secret_number = rand::rng().random_range(1..=100);loop {println!("请输入猜测数字:");let mut guess = String::new();io::stdin().read_line(&mut guess).expect("读取失败");let guess: u32 = match guess.trim().parse() {Ok(num) => num,Err(_) => continue,};println!("你猜的是: {}", guess);match guess.cmp(&secret_number) {Ordering::Less => println!("太小了!"),Ordering::Greater => println!("太大了!"),Ordering::Equal => {println!("你赢了!");break;}}}
}
核心概念总结
概念 | 作用说明 | 示例片段 |
---|---|---|
let绑定 | 声明变量(默认不可变) | let mut guess = String::new() |
match匹配 | 处理枚举分支 | 比较Ordering的三种状态 |
关联函数 | 类型命名空间的函数 | String::new() |
外部包 | 扩展功能(如随机数) | rand::rng() |
错误处理 | Result类型与模式匹配 | parse() 后的Ok /Err 处理 |
循环控制 | loop与break结合 | 胜利时退出循环 |
通过此项目,我们实践了变量声明、模式匹配、错误处理等Rust核心机制。下一步可尝试扩展功能:记录猜测次数、添加难度分级或输入验证增强。