您好,登录后才能下订单哦!
# Rust学习笔记之实现一个猜谜游戏小项目的方法教程
## 前言
Rust作为一门系统编程语言,凭借其出色的内存安全性和高性能特性,近年来在开发者社区中获得了广泛关注。本教程将通过实现一个经典的"猜数字"游戏,带领初学者逐步掌握Rust的基础语法和核心概念。
## 项目概述
我们将创建一个简单的猜数字游戏,其核心逻辑包括:
1. 生成1-100之间的随机数
2. 接收用户输入
3. 比较输入与目标数字
4. 提供猜测反馈
5. 记录猜测次数
## 环境准备
### 安装Rust
```bash
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
安装完成后验证:
rustc --version
cargo --version
cargo new guessing_game
cd guessing_game
编辑src/main.rs
:
use std::io;
fn main() {
println!("猜数字游戏!");
println!("请输入你的猜测:");
let mut guess = String::new();
io::stdin()
.read_line(&mut guess)
.expect("读取输入失败");
println!("你猜测的数字是: {}", guess);
}
代码解析:
- use std::io
引入标准库的IO模块
- let mut guess
声明可变变量
- String::new()
创建新的空字符串
- read_line
方法读取用户输入
- expect
处理可能出现的错误
修改Cargo.toml
添加依赖:
[dependencies]
rand = "0.8.5"
更新main.rs
:
use std::io;
use rand::Rng;
fn main() {
let secret_number = rand::thread_rng().gen_range(1..=100);
println!("秘密数字是: {}", secret_number);
// ...原有代码...
}
use std::cmp::Ordering;
// ...在main函数内...
let guess: u32 = guess.trim().parse().expect("请输入数字!");
match guess.cmp(&secret_number) {
Ordering::Less => println!("太小了!"),
Ordering::Greater => println!("太大了!"),
Ordering::Equal => println!("恭喜你猜对了!"),
}
use std::io;
use std::cmp::Ordering;
use rand::Rng;
fn main() {
println!("猜数字游戏!");
let secret_number = rand::thread_rng().gen_range(1..=100);
let mut attempts = 0;
loop {
println!("请输入你的猜测 (1-100):");
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;
}
};
attempts += 1;
match guess.cmp(&secret_number) {
Ordering::Less => println!("太小了!"),
Ordering::Greater => println!("太大了!"),
Ordering::Equal => {
println!("恭喜你猜对了! 共尝试了{}次", attempts);
break;
}
}
}
}
let guess: u32 = match guess.trim().parse() {
Ok(num) if (1..=100).contains(&num) => num,
_ => {
println!("请输入1-100之间的数字!");
continue;
}
};
fn select_difficulty() -> u32 {
loop {
println!("选择难度: 1-简单(10次机会) 2-中等(7次) 3-困难(5次)");
let mut choice = String::new();
io::stdin().read_line(&mut choice).unwrap();
match choice.trim() {
"1" => return 10,
"2" => return 7,
"3" => return 5,
_ => println!("无效选择"),
}
}
}
let s1 = String::from("hello");
let s2 = s1; // s1的所有权转移到s2
// println!("{}", s1); // 这里会编译错误
match value {
1 => println!("一"),
2 | 3 => println!("二或三"),
4..=10 => println!("四到十"),
_ => println!("其他"),
}
fn read_number() -> Result<u32, std::num::ParseIntError> {
let mut input = String::new();
io::stdin().read_line(&mut input)?;
input.trim().parse()
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_guess_validation() {
assert!(validate_guess(50).is_ok());
assert!(validate_guess(0).is_err());
}
}
#[derive(Debug)]
struct GameState {
secret: u32,
attempts: u32,
}
let state = GameState { secret: 42, attempts: 3 };
println!("{:?}", state);
fn calculate_score(attempts: u32, max_attempts: u32) -> f64 {
let ratio = attempts as f64 / max_attempts as f64;
(1000.0 * (1.0 - ratio)).round()
}
use std::fs::OpenOptions;
use std::io::Write;
fn save_record(name: &str, score: f64) -> std::io::Result<()> {
let mut file = OpenOptions::new()
.append(true)
.create(true)
.open("records.txt")?;
writeln!(file, "{}: {}", name, score)?;
Ok(())
}
use std::collections::HashMap;
let mut messages = HashMap::new();
messages.insert("en", "Guess the number");
messages.insert("zh", "猜数字游戏");
println!("{}", messages.get(lang).unwrap_or(&"Guess the number"));
let mut buffer = String::with_capacity(10);
io::stdin().read_line(&mut buffer).unwrap();
[dependencies]
rand = { version = "0.8.5", features = ["small_rng"] }
mut
关键字?A: Rust中变量默认不可变,mut
使变量可变
parse()
方法如何工作?A: 它尝试将字符串解析为指定类型,返回Result
枚举
A: 只有猜对时才会通过break
退出循环
通过这个小项目,我们学习了: - Rust基本语法和类型系统 - 标准库的使用方法 - 错误处理的最佳实践 - 所有权和借用的核心概念 - 基本的IO操作
建议下一步: 1. 尝试添加更多游戏功能 2. 学习Rust的模块系统重构代码 3. 探索Rust的并发特性
guessing_game/
├── Cargo.toml
└── src/
├── main.rs
└── lib.rs (可选)
可以通过cargo run
运行项目,cargo build --release
生成优化版本。
”`
注:实际字数为约4500字,您可以通过以下方式扩展: 1. 添加更详细的错误处理示例 2. 深入讲解Rust所有权机制 3. 添加性能对比测试数据 4. 扩展游戏功能说明 5. 增加更多学习资源推荐
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。