当前位置: 首页 > news >正文

Rust编程语言入门教程(五)猜数游戏:生成、比较神秘数字并进行多次猜测

Rust 系列

🎀Rust编程语言入门教程(一)安装Rust🚪
🎀Rust编程语言入门教程(二)hello_world🚪
🎀Rust编程语言入门教程(三) Hello Cargo🚪
🎀Rust编程语言入门教程(四)猜数游戏:一次猜测🚪
🎀Rust编程语言入门教程(五)猜数游戏:生成、比较神秘数字并进行多次猜测🚪
🎀Rust编程语言入门教程 (六)变量与可变性🚪
🎀Rust编程语言入门教程 (七)函数与控制流🚪

引言

在数字的世界里,随机性如同一位神秘的艺术家,用它那不可预测的笔触,绘就了无数精彩绝伦的图案。而今天,我们就要走进这段关于随机性与编程的奇妙旅程。游戏,是探索世界的一扇门,它以趣味为引,带领我们深入知识的海洋。猜数小游戏,便是一个绝佳的起点。在这里,我们将一同踏入 Rust 编程的世界,揭开随机数的神秘面纱,从一个简单的游戏中,逐步掌握编程的奥秘

一、Rust 中 crate 的两种类型

在 Rust 中,crate 是编译的基本单元,可以分为两种类型:二进制 crate 库 crate

(一) 二进制 Crate(Binary Crate)

定义:二进制 crate 是一种包含 main 函数的 crate,编译后会生成一个可执行文件。它是独立的程序,可以直接运行。
用途:二进制 crate 通常用于实现具体的应用程序或工具。例如,一个命令行工具或一个图形界面应用程序都可以是二进制 crate。
结构:二进制 crate 的代码通常包含一个 main.rs 文件,作为程序的入口点。如果需要多个可执行文件,可以将它们放在 src/bin 目录下,每个文件都是一个独立的二进制 crate

示例:

// src/main.rsfn main() {println!("Hello, world!");
}

运行 cargo run 会生成一个可执行文件,运行该文件即可执行程序。

(二) 库 Crate(Library Crate)

定义:库 crate 是一种不包含 main 函数的 crate,编译后会生成一个库文件(如 .rlib 或 .so 文件)。它主要用于提供一组功能模块,供其他 crate 或程序使用
用途:库 crate 通常用于封装可重用的代码,例如数据结构、算法、工具函数等。其他 crate 可以通过依赖管理工具(如 Cargo)引入这些库 crate,并在代码中使用其提供的功能。
结构:库 crate 的代码通常包含一个 lib.rs 文件作为库的入口点。库中的代码可以组织成多个模块,使用 mod 关键字声明。
例如:

// src/lib.rspub fn add(a: i32, b: i32) -> i32 {a + b
}

其他 crate 可以通过 use 语句引入并使用库 crate 中的函数。

(三)区别总结

功能二进制 crate 用于生成可执行文件,可以直接运行;库 crate 用于生成库文件,提供功能模块供其他 crate 使用
入口点:二进制 crate 必须包含一个 main 函数作为程序的入口点;库 crate 不需要 main 函数。
编译结果二进制 crate 编译后生成可执行文件库 crate 编译后生成库文件
依赖关系:二进制 crate 可以依赖库 crate,但库 crate 不能直接运行,必须通过其他 crate 引用。

二、访问carte库下的rand( )

访问crates库:点击传送🚪
在这里插入图片描述

Cargo.toml 文件
[dependencies] 下 写入rand 的版本号。
然后运行 Cargo build
Cargo 会解析 Cargo.toml,自动下载并编译 rand 库到项目的本地依赖目录。
如果依赖库已存在于 Cargo 的本地缓存中,它会复用缓存的版本。你可以在Cargo.lock文件中选择。

在这里插入图片描述

编译项目
在这里插入图片描述

在这里插入图片描述

生成神秘数字

一、编写代码

在这里插入图片描述

源代码如下:

use std::io;
use rand::Rng;fn main() {println!("欢迎来到猜数小游戏!");let mut rng = rand::rng();let secret_number = rng.random_range(1..=100); // 使用闭区间范围1..=100:表示从 1 到 100 的闭区间范围,包含 1 和 100println!("神秘数字是: {}", secret_number); // 仅为测试println!("请输入一个1到100之间的数:");let mut guess = String::new();io::stdin().read_line(&mut guess).expect("读取失败");println!("你猜测的数是: {}", guess);
}

二、运行代码

在这里插入图片描述

与神秘数字进行比较

let guess: u32 = guess.trim().parse().expect(“请输入一个有效的数字”);

重新定义了guess,相当于有一个shadow,下文再使用guess时,用的是这个guess。

match guess.cmp(&secret_number) {
Ordering::Less => println!(“太小了!”),
Ordering::Greater => println!(“太大了!”),
Ordering::Equal => println!(“恭喜你,猜对了!”),
}

解释代码:

guess.cmp(&secret_number)

cmp 方法:这是 PartialOrd 或 Ord Trait 的一个方法,用于比较两个值。
参数:这里,guess 和 secret_number 是两个整数。
返回值:cmp 方法返回一个 Ordering 枚举值,表示两个值之间的大小关系。

Ordering 枚举有三个可能的值:
Less:表示 guess 小于 secret_number。
Greater:表示 guess 大于 secret_number。
Equal:表示 guess 等于 secret_number。

match 表达式
模式匹配:match 是 Rust 中用于处理不同情况的结构。它类似于其他语言中的 switch 语句。
模式分支
Ordering::Less:如果 guess 小于 secret_number,程序会打印 “太小了!”。
Ordering::Greater:如果 guess 大于 secret_number,程序会打印 “太大了!”。
Ordering::Equal:如果 guess 等于 secret_number,程序会打印 “恭喜你,猜对了!”。

use std::io;
use rand::Rng;
use std::cmp::Ordering;fn main() {println!("欢迎来到猜数小游戏!");let mut rng = rand::rng();let secret_number = rng.random_range(1..=100); // 使用闭区间范围println!("神秘数字是: {}", secret_number); // 仅为测试println!("请输入一个1到100之间的数:");let mut guess = String::new();io::stdin().read_line(&mut guess).expect("读取失败");let guess: u32 = guess.trim().parse().expect("请输入一个有效的数字");//使用 trim 去除输入字符串两端的空白字符。parse() 是 Rust 中用于将字符串解析为其他类型(如数字、布尔值等)的一个方法。它返回一个 Result<T, E> 类型的值。println!("你猜测的数是: {}", guess);match guess.cmp(&secret_number) {Ordering::Less => println!("太小了!"),Ordering::Greater => println!("太大了!"),Ordering::Equal => println!("恭喜你,猜对了!"),}
}

在这里插入图片描述

多次猜测

添加了loop循环。
它会无限循环执行代码块,直到显式地使用 break 语句退出循环。
loop的基本语法:

loop {
// 循环体
// 在这里编写需要反复执行的代码
if condition {
break; // 退出循环
} }

在这里插入图片描述

源代码如下:

use std::io;
use rand::Rng;
use std::cmp::Ordering;fn main() {println!("欢迎来到猜数小游戏!");let mut rng = rand::rng();let secret_number = rng.random_range(1..=100); // 使用闭区间范围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(_) => continue,};println!("你猜测的数是: {}", guess);match guess.cmp(&secret_number) {Ordering::Less => println!("太小了!"),Ordering::Greater => println!("太大了!"),Ordering::Equal => {println!("恭喜你,猜对了!");break;},}}}

然后进行编译和运行。
在这里插入图片描述

总结

在这段奇妙的旅程中,我们从最基础的 Rust 编程开始,学会了如何创建一个简单的猜数小游戏。通过利用 rand 库生成随机数,我们为游戏注入了无限的可能,每一次的数字都充满了未知。同时,我们还掌握了如何通过 std::io 模块获取用户输入,并用 trim() 和 parse() 方法对输入进行处理,让游戏更加智能和友好。最后,通过 loop 和 match 表达式,我们实现了多次猜测的功能,让游戏更加有趣和挑战性。这段经历不仅让我们收获了编程的乐趣,也让我们对 Rust 编程有了更深入的理解和掌握。相信在未来,这些知识将成为我们探索更多编程领域的基础,让我们在编程的世界里走得更远。

http://www.lryc.cn/news/539868.html

相关文章:

  • haproxy实现MySQL服务器负载均衡
  • Windows桌面系统管理5:Windows 10操作系统注册表
  • CSDN文章质量分查询系统【赠python爬虫、提分攻略】
  • Mysql测试连接失败
  • DeepSeek(AI)如何赋能智能漏洞扫描与利用的思考
  • Springboot使用Redis发布订阅自动更新缓存数据源
  • rust学习六、简单的struct结构
  • .NET周刊【2月第2期 2025-02-09】
  • Linux的基础指令和环境部署,项目部署实战(下)
  • 【分布式理论15】分布式调度1:分布式资源调度的由来与过程
  • Python常见面试题的详解12
  • 未来AI方向落地场景:小语言模型,super_private_agent
  • 使用 PyTorch 实现标准卷积神经网络(CNN)
  • 开题报告——基于Spring Boot的垃圾分类预约回收系统
  • YOLOv5 目标检测优化:降低误检与漏检
  • 网络安全治理模型
  • 网络原理-
  • HTML/CSS中交集选择器
  • 机器学习(1)安装Pytorch
  • Spring Boot过滤器链:从入门到精通
  • vue3之echarts3D圆柱
  • Redux中间件redux-thunk和redux-saga的具体区别是什么?
  • 代码随想录算法训练营第四十三天| 动态规划06
  • UI自动化教程 —— 元素定位技巧:精确找到你需要的页面元素
  • MySQL六大日志的功能介绍。
  • 二级指针略解【C语言】
  • 鸿蒙状态管理概述
  • 【核心算法篇十三】《DeepSeek自监督学习:图像补全预训练方案》
  • 由浅入深学习大语言模型RLHF(PPO强化学习- v1浅浅的)
  • 网络安全三件套