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

相关文章:

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

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

haproxy实现MySQL服务器负载均衡

1.环境准备 准备好下面四台台服务器&#xff1a; 主机名IP角色open-Euler1192.168.121.150mysql-server1openEuler-2192.168.121.151mysql-server2openEuler-3192.168.121.152clientRocky8-1192.168.121.160haproxy 2.mysql服务器配置 1.下载mariadb #下载mariadb [rootop…...

Windows桌面系统管理5:Windows 10操作系统注册表

Windows桌面系统管理0&#xff1a;总目录-CSDN博客 Windows桌面系统管理1&#xff1a;计算机硬件组成及组装-CSDN博客 Windows桌面系统管理2&#xff1a;VMware Workstation使用和管理-CSDN博客 Windows桌面系统管理3&#xff1a;Windows 10操作系统部署与使用-CSDN博客 Wi…...

CSDN文章质量分查询系统【赠python爬虫、提分攻略】

CSDN文章质量分查询系统 https://www.csdn.net/qc 点击链接-----> CSDN文章质量分查询系统 <------点击链接 点击链接-----> https://www.csdn.net/qc <------点击链接 点击链接-----> CSDN文章质量分查询系统 <------点击链接 点击链…...

Mysql测试连接失败

解决方案 1 将mysql.exe(C:\Program Files\MySQL\MySQL Server 8.0\bin\mysql.exe)配置到系统环境变量 2 管理员权限启动cmd 输入 3 ALTER USER rootlocalhost IDENTIFIED WITH mysql_native_password BY 123456; 4 FLUSH PRIVILEGES;...

DeepSeek(AI)如何赋能智能漏洞扫描与利用的思考

当下&#xff0c;网络安全威胁持续演变&#xff0c;从简单恶意软件传播发展为结合人工智能、大数据分析的APT&#xff0c;对个人、企业及政府关键信息基础设施构成严重挑战。 漏洞作为网络安全薄弱点&#xff0c;数量和种类随软件系统升级与网络架构复杂化急剧增加&#xff0c…...

Springboot使用Redis发布订阅自动更新缓存数据源

背景 当项目有很多数据源的时候&#xff0c;通常会在启动的时候就把数据源连接加载缓存上&#xff0c;当数据源进行变更后如何自动实时将缓存的数据源进行更新呢&#xff1f;如果是单个项目直接调接口方法就行了&#xff0c;但是涉及到分布式多个系统呢&#xff1f; 解决方案…...

rust学习六、简单的struct结构

一、结构定义 struct-翻译为结构/结构体 总体上有两种定义方式&#xff1a;带有详细属性名的&#xff1b;不带属性名&#xff08;元组&#xff09; 从工程角度出发&#xff0c;并不推荐不带属性的定义方式&#xff0c;因为不友好。希望rust后面不要搞类似好像很友好&#xff…...

.NET周刊【2月第2期 2025-02-09】

国内文章 开箱即用的.NET MAUI组件库 V-Control 发布了! https://www.cnblogs.com/jevonsflash/p/18701494 文章介绍了V-Control&#xff0c;一个适用于.NET MAUI的组件库。作者计划将其开源&#xff0c;强调.NET MAUI是生产力强的跨平台移动开发工具。V-Control提供多种组件…...

Linux的基础指令和环境部署,项目部署实战(下)

目录 上一篇&#xff1a;Linxu的基础指令和环境部署&#xff0c;项目部署实战&#xff08;上&#xff09;-CSDN博客 1. 搭建Java部署环境 1.1 apt apt常用命令 列出所有的软件包 更新软件包数据库 安装软件包 移除软件包 1.2 JDK 1.2.1. 更新 1.2.2. 安装openjdk&am…...

【分布式理论15】分布式调度1:分布式资源调度的由来与过程

文章目录 一、操作系统的资源调度&#xff1a;从单核到多核二、 分布式系统的资源调度&#xff1a;从单台服务器到集群三、 固定资源映射四、 动态资源分配&#xff1a;灵活的任务-资源匹配五、 资源调度过程&#xff1a;从申请到执行 本文主要讨论主题&#xff1a; 从操作系统…...

Python常见面试题的详解12

1. hasattr ()、getattr ()、setattr () 函数是如何使用的&#xff1f; 要点 这三个函数用于对对象的属性进行检查、获取和设置操作&#xff0c;是 Python 中进行对象属性动态操作的重要工具。 hasattr()&#xff1a;用于检查对象是否具有指定属性或方法。 getattr()&#x…...

未来AI方向落地场景:小语言模型,super_private_agent

未来AI方向落地场景:小语言模型,super_private_agent 目录 未来AI方向落地场景:小语言模型,super_private_agent小语言模型super - private - agent(注重隐私的智能代理)碳基生命和硅基生命交互界面面向agent的专用交互协议和数据接口从web平台经济到网络平台举例说明社交…...

使用 PyTorch 实现标准卷积神经网络(CNN)

卷积神经网络&#xff08;CNN&#xff09;是深度学习中的重要组成部分&#xff0c;广泛应用于图像处理、语音识别、视频分析等任务。在这篇博客中&#xff0c;我们将使用 PyTorch 实现一个标准的卷积神经网络&#xff08;CNN&#xff09;&#xff0c;并介绍各个部分的作用。 什…...

开题报告——基于Spring Boot的垃圾分类预约回收系统

关于本科毕业设计(论文)开题报告的规定 为切实做好本科毕业设计(论文)的开题报告工作,保证论文质量,特作如下规定: 一、开题报告是本科毕业设计(论文)的必经过程,所有本科生在写作毕业设计(论文)之前都必须作开题报告。 二、开题报告主要检验学生对专业知识的驾驭能…...

YOLOv5 目标检测优化:降低误检与漏检

1. 引言 在目标检测任务中&#xff0c;误检&#xff08;False Positive, FP&#xff09;和漏检&#xff08;False Negative, FN&#xff09;是影响检测性能的两个主要问题。误检意味着模型检测到了不存在的目标&#xff0c;而漏检则指模型未能检测到真实存在的目标。本文将介绍…...

网络安全治理模型

0x02 知识点 安全的目标是提供 可用性 Avialability机密性 confidentiality完整性 Integrity真实性 Authenticity不可否认性 Nonrepudiation 安全治理是一个提供监督、问责和合规性的框架 信息安全系统 Information Security Management System ISMS 策略&#xff0c;工作程…...

网络原理-

文章目录 协议应用层传输层网络层 数据链路层 协议 在网络通信中,协议是非常重要的概念.协议就是一种约定. 在网络通信过程中,对协议进行了分层 接下来就按照顺序向大家介绍每一种核心的协议. 应用层 应用层是咱们程序员打交道最多的一层协议.应用层里有很多现成的协议,但…...

HTML/CSS中交集选择器

1.作用:选中同时符合多个条件的元素 交集就是或的意思 2.语法:选择器1选择器2选择器3......选择器n{} 3.举例: /* 选中:类名为beauty的p元素,此种写法用的非常的多 */p.beauty{color: red;}/* 选中:类名包含rich和beauty的元素 */.rich.beauty{color: blue;} 4.注意: 1.有标签…...

机器学习(1)安装Pytorch

1.安装命令 pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 2.安装过程Log&#xff1a; Looking in indexes: https://download.pytorch.org/whl/cu118 Co…...

51c自动驾驶~合集58

我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留&#xff0c;CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制&#xff08;CCA-Attention&#xff09;&#xff0c;…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者

抖音增长新引擎&#xff1a;品融电商&#xff0c;一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中&#xff0c;品牌如何破浪前行&#xff1f;自建团队成本高、效果难控&#xff1b;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...

MMaDA: Multimodal Large Diffusion Language Models

CODE &#xff1a; https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA&#xff0c;它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构&#xf…...

oracle与MySQL数据库之间数据同步的技术要点

Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异&#xff0c;它们的数据同步要求既要保持数据的准确性和一致性&#xff0c;又要处理好性能问题。以下是一些主要的技术要点&#xff1a; 数据结构差异 数据类型差异&#xff…...

自然语言处理——Transformer

自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效&#xff0c;它能挖掘数据中的时序信息以及语义信息&#xff0c;但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN&#xff0c;但是…...

html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码

目录 一、&#x1f468;‍&#x1f393;网站题目 二、✍️网站描述 三、&#x1f4da;网站介绍 四、&#x1f310;网站效果 五、&#x1fa93; 代码实现 &#x1f9f1;HTML 六、&#x1f947; 如何让学习不再盲目 七、&#x1f381;更多干货 一、&#x1f468;‍&#x1f…...

使用Spring AI和MCP协议构建图片搜索服务

目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式&#xff08;本地调用&#xff09; SSE模式&#xff08;远程调用&#xff09; 4. 注册工具提…...

打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用

一、方案背景​ 在现代生产与生活场景中&#xff0c;如工厂高危作业区、医院手术室、公共场景等&#xff0c;人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式&#xff0c;存在效率低、覆盖面不足、判断主观性强等问题&#xff0c;难以满足对人员打手机行为精…...

解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用

在工业制造领域&#xff0c;无损检测&#xff08;NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统&#xff0c;以非接触式光学麦克风技术为核心&#xff0c;打破传统检测瓶颈&#xff0c;为半导体、航空航天、汽车制造等行业提供了高灵敏…...

渗透实战PortSwigger Labs指南:自定义标签XSS和SVG XSS利用

阻止除自定义标签之外的所有标签 先输入一些标签测试&#xff0c;说是全部标签都被禁了 除了自定义的 自定义<my-tag onmouseoveralert(xss)> <my-tag idx onfocusalert(document.cookie) tabindex1> onfocus 当元素获得焦点时&#xff08;如通过点击或键盘导航&…...