# 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進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。