Rust 编程实现猜数字游戏

文章目录

编程实现猜数字游戏

我们使用cargorust实现一个经典编程练习------猜数字游戏,在实践中掌握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核心机制。下一步可尝试扩展功能:记录猜测次数、添加难度分级或输入验证增强。

相关推荐
测试员周周3 小时前
【Appium 系列】第16节-WebView-H5上下文切换 — 混合应用的自动化难点
运维·开发语言·人工智能·功能测试·appium·自动化·测试用例
Mahir085 小时前
Spring 循环依赖深度解密:从问题本质到三级缓存源码级解析
java·后端·spring·缓存·面试·循环依赖·三级缓存
杜子不疼.5 小时前
【C++ AI 大模型接入 SDK】 - DeepSeek 模型接入(上)
开发语言·c++·chatgpt
加号35 小时前
【C#】 串口通信技术深度解析及实现
开发语言·c#
sycmancia6 小时前
Qt——编辑交互功能的实现
开发语言·qt
石山代码6 小时前
C++ 内存分区 堆区
java·开发语言·c++
无风听海7 小时前
C# 隐式转换深度解析
java·开发语言·c#
一只大袋鼠7 小时前
Git 进阶(二):分支管理、暂存栈、远程仓库与多人协作
java·开发语言·git
LuminousCPP8 小时前
数据结构 - 线性表第四篇:C 语言通讯录优化升级全记录(踩坑 + 思考)
c语言·开发语言·数据结构·经验分享·笔记·学习
web3.08889998 小时前
1688 图搜接口(item_search_img / 拍立淘) 接入方法
开发语言·python