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

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 编程有了更深入的理解和掌握。相信在未来,这些知识将成为我们探索更多编程领域的基础,让我们在编程的世界里走得更远。

相关文章:

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

Rust 系列 &#x1f380;Rust编程语言入门教程&#xff08;一&#xff09;安装Rust&#x1f6aa; &#x1f380;Rust编程语言入门教程&#xff08;二&#xff09;hello_world&#x1f6aa; &#x1f380;Rust编程语言入门教程&#xff08;三&#xff09; Hello Cargo&#x1f…...

ubuntu部署小笔记-采坑

ubuntu部署小笔记 搭建前端控制端后端前端nginx反向代理使用ubuntu部署nextjs项目问题一 如何访问端口号配置后台运行该进程pm2 问题二 包体过大生产环境下所需文件 问题三 部署在vercel时出现的问题需要魔法访问后端api时&#xff0c;必须使用https协议电脑端访问正常&#xf…...

【代码审计】-Tenda AC 18 v15.03.05.05 /goform接口文档漏洞挖掘

路由器&#xff1a;Tenda AC 18 v15.03.05.05 固件下载地址&#xff1a;https://www.tenda.com.cn/material?keywordac18 1./goform/SetSpeedWan 接口文档&#xff1a; formSetSpeedWan函数中speed_di参数缓冲区溢出漏洞&#xff1a; 使用 binwalk -eM 解包固件&#xff0c…...

2025年02月21日Github流行趋势

项目名称&#xff1a;source-sdk-2013 项目地址url&#xff1a;https://github.com/ValveSoftware/source-sdk-2013项目语言&#xff1a;C历史star数&#xff1a;7343今日star数&#xff1a;929项目维护者&#xff1a;JoeLudwig, jorgenpt, narendraumate, sortie, alanedwarde…...

git 克隆及拉取github项目到本地微信开发者工具,微信开发者工具通过git commit、git push上传代码到github仓库

git 克隆及拉取github项目到本地微信开发者工具&#xff0c;微信开发者工具通过git commit、git push上传代码到github仓库 git 克隆及拉取github项目到本地 先在自己的用户文件夹新建一个项目文件夹&#xff0c;取名为项目名 例如这样 C:\Users\HP\yzj-再打开一个终端页面&…...

【算法基础】--前缀和

前缀和 一、一维前缀和示例模板[寻找数组的中心下标 ](https://leetcode.cn/problems/tvdfij/description/)除自身以外的数组乘积和可被k整除的子数组 一、一维前缀和 前缀和就是快速求出数组某一个连续区间内所有元素的和。 示例模板 已知一个数组arr&#xff0c;求前缀和 …...

统一的多摄像头3D感知框架!PETRv2论文精读

论文地址&#xff1a;PETRv2: A Unified Framework for 3D Perception from Multi-Camera Images 源代码&#xff1a;PETR 摘要 在本文中&#xff0c;我们提出了PETRv2&#xff0c;用于从多视角图像中进行3D感知的统一框架。基于PETR [24]&#xff0c;PETRv2探索了时间建模的…...

【Linux】Linux 文件系统—— 探讨软链接(symbolic link)

ℹ️大家好&#xff0c;我是练小杰&#xff0c;周五又到了&#xff0c;明天应该就是牛马的休息日了吧&#xff01;&#xff01;&#x1f606; 前天我们详细介绍了 硬链接的特点&#xff0c;现在继续探讨 软链接的特点&#xff0c;并且后续将添加更多相关知识噢&#xff0c;谢谢…...

快速排序_912. 排序数组(10中排序算法)

快速排序_912. 排序数组&#xff08;10中排序算法&#xff09; 1 快速排序&#xff08;重点&#xff09;报错代码超时代码修改官方题解快速排序 1&#xff1a;基本快速排序快速排序 2&#xff1a;双指针&#xff08;指针对撞&#xff09;快速排序快速排序 3&#xff1a;三指针快…...

DEMF模型赋能多模态图像融合,助力肺癌高效分类

目录 论文创新点 实验设计 1. 可视化的研究设计 2. 样本选取和数据处理 3. 集成分类模型 4. 实验结果 5. 可视化结果 图表总结 可视化知识图谱 在肺癌早期筛查中,计算机断层扫描(CT)和正电子发射断层扫描(PET)作为两种关键的影像学手段,分别提供了丰富的解剖结构…...

Linux-CentOS 7安装

Centos 7镜像&#xff1a;https://pan.baidu.com/s/1fkQHYT64RMFRGLZy1xnSWw 提取码: q2w2 VMware Workstation&#xff1a;https://pan.baidu.com/s/1JnRcDBIIOWGf6FnGY_0LgA 提取码: w2e2 1、打开vmware workstation 2、选择主界面的"创建新的虚拟机"或者点击左上…...

Android14(13)添加墨水屏手写API

软件平台&#xff1a;Android14 硬件平台&#xff1a;QCS6115 需求&#xff1a;特殊品类的产品墨水屏实现手写的功能&#xff0c;本来Android自带的Input这一套可以实现实时展示笔迹&#xff0c;但是由于墨水屏特性&#xff0c;达不到正常的彩屏刷新的帧率&#xff0c;因此使用…...

AI助力下的PPT革命:DeepSeek 与Kimi的高效创作实践

清华大学出品《DeepSeek&#xff1a;从入门到精通》分享 在忙碌的职场中&#xff0c;制作一份高质量的PPT往往需要投入大量时间和精力&#xff0c;尤其是在临近截止日期时。今天&#xff0c;我们将探索如何借助 AI 工具 —— DeepSeek 和 Kimi —— 让 PPT 制作变得既快捷又高…...

【opencv】图像基本操作

一.计算机眼中的图像 1.1 图像读取 cv2.IMREAD_COLOR&#xff1a;彩色图像 cv2.IMREAD_GRAYSCCALE&#xff1a;灰色图像 ①导包 import cv2 # opencv读取的格式是BGR import matplotlib.pyplot as plt import numpy as np %matplotlib inline ②读取图像 img cv2.imread(…...

帆软报表FineReport入门:简单报表制作[扩展|左父格|上父格]

FineReport帮助文档 - 全面的报表使用教程和学习资料 数据库连接 点击号>>JDBC 选择要连接的数据库>>填写信息>>点击测试连接 数据库SQLite是帆软的内置数据库, 里面有练习数据 选择此数据库后,点击测试连接即可 数据库查询 方法一: 在左下角的模板数据集…...

云手机如何进行经纬度修改

云手机如何进行经纬度修改 云手机修改经纬度的方法因不同服务商和操作方式有所差异&#xff0c;以下是综合多个来源的常用方法及注意事项&#xff1a; 通过ADB命令注入GPS数据&#xff08;适用于技术用户&#xff09; 1.连接云手机 使用ADB工具连接云手机服务器&#xff0c;…...

VUE中的组件加载方式

加载方式有哪些&#xff0c;及如何进行选择 常规的静态引入是在组件初始化时就加载所有依赖的组件&#xff0c;而懒加载则是等到组件需要被渲染的时候才加载。 对于大型应用&#xff0c;可能会有很多组件&#xff0c;如果一开始都加载&#xff0c;可能会影响首屏加载时间。如…...

天 锐 蓝盾终端安全管理系统:办公U盘拷贝使用管控限制

天 锐 蓝盾终端安全管理系统以终端安全为基石&#xff0c;深度融合安全、管理与维护三大要素&#xff0c;通过对桌面终端系统的精准把控&#xff0c;助力企业用户构筑起更为安全、稳固且可靠的网络运行环境。它实现了管理的标准化&#xff0c;有效破解终端安全管理难题&#xf…...

计算机网络之物理层——基于《计算机网络》谢希仁第八版

(꒪ꇴ꒪ )&#xff0c;Hello我是祐言QAQ我的博客主页&#xff1a;C/C语言&#xff0c;数据结构&#xff0c;Linux基础&#xff0c;ARM开发板&#xff0c;网络编程等领域UP&#x1f30d;快上&#x1f698;&#xff0c;一起学习&#xff0c;让我们成为一个强大的攻城狮&#xff0…...

区块链中的递归长度前缀(RLP)序列化详解

文章目录 1. 什么是RLP序列化&#xff1f;2. RLP的设计目标与优势3. RLP处理的数据类型4. RLP编码规则详解字符串的编码规则列表的编码规则 5. RLP解码原理6. RLP在以太坊中的应用场景7. 编码示例分析8. 总结 1. 什么是RLP序列化&#xff1f; 递归长度前缀&#xff08;RLP&…...

分布式简单理解

基本概念 应⽤(Application)/系统&#xff08;System&#xff09; 为了完成⼀整套服务的⼀个程序或者⼀组相互配合的程序群。⽣活例⼦类⽐&#xff1a;为了完成⼀项任 务&#xff0c;⽽搭建的由⼀个⼈或者⼀群相互配的⼈组成的团队。 模块&#xff08;Module&#xff09;/组件…...

记录:Docker 安装记录

今天在安装 ollama 时发现无法指定安装目录&#xff0c;而且它的命令行反馈内容很像 docker &#xff0c;而且它下载的模型也是放在 C 盘&#xff0c;那么如果我 C 盘空间不足&#xff0c;就装不了 deepseek-r1:70b &#xff0c;于是想起来之前安装 Docker 的时候也遇到过类似问…...

Leetcode 二叉树展开为链表

java solution class Solution {public void flatten(TreeNode root) {//首先设置递归终止条件if(root null) return;//分别递归处理左右子树&#xff0c;//递归需要先处理子问题&#xff08;子树的拉平&#xff09;&#xff0c;然后才能处理当前问题&#xff08;当前节点的指…...

IEEE官方期刊缩写查询pdf分享

可以直接保存...

RabbitMQ 消息队列 优化发送邮件

express 发送邮件 最简单的异步发送邮件方法为何要使用 RabbitMQ&#xff1f;如何在 Node 项目中集成 RabbitMQ&#xff1f; 一、 不用 await 发送邮件 在实际开发之前&#xff0c;不妨先思考下&#xff0c;我们最终的目的是为了让邮件异步发送。那发送邮件这里有个await&am…...

【AI】常见的AI工具地址和学习资料链接

AI工具地址&#xff1a; DeepSeek&#xff1a;DeepSeekChatGPT-4o&#xff1a;https://openai.com/chatgpt/overview/Kimi&#xff1a;Kimi.ai - 会推理解析&#xff0c;能深度思考的AI助手豆包&#xff1a;豆包讯飞星火&#xff1a;讯飞星火大模型-AI大语言模型-星火大模型-科…...

NetLogon 权限提升漏洞

参考文章&#xff1a;CVE-2020-1472NetLogon权限提升漏洞_cve-2020-1472复现 谢公子-CSDN博客 域控机器账户&#xff1a;WIN-0V0GAORDC17 域控 ip&#xff1a;192.168.72.163 域内攻击者机器 ip&#xff1a;192.168.72.158&#xff0c;host&#xff1a;WIN10-01 攻击者 kali…...

【C++】 Flow of Control

《C程序设计基础教程》——刘厚泉&#xff0c;李政伟&#xff0c;二零一三年九月版&#xff0c;学习笔记 文章目录 1、选择结构1.1、if 语句1.2、嵌套的 if 语句1.3、条件运算符 ?:1.4、switch 语句 2、循环结构2.1、while 语句2.2、do-while 语句2.3、 for 循环2.4、循环嵌套…...

图论 之 迪斯科特拉算法求解最短路径

文章目录 题目743.网络延迟时间3341.到达最后一个房间的最少时间I 求解最短路径的问题&#xff0c;分为使用BFS和使用迪斯科特拉算法&#xff0c;这两种算法求解的范围是有区别的 BFS适合求解&#xff0c;边的权值都是1的图中的最短路径的问题 图论 之 BFS迪斯科特拉算法适合求…...

module ‘cv2.dnn‘ has no attribute ‘DictValue‘解决办法

module ‘cv2.dnn‘ has no attribute ‘DictValue‘解决办法 pip install opencv-python4.7.0.72 -i https://pypi.tuna.tsinghua.edu.cn/simple 测试&#xff1a; python -c"import cv2"...