文章目录
编程实现猜数字游戏

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