【Rust】——猜数游戏

🎃个人专栏:

🐬 算法设计与分析:算法设计与分析_IT闫的博客-CSDN博客

🐳Java基础:Java基础_IT闫的博客-CSDN博客

🐋c语言:c语言_IT闫的博客-CSDN博客

🐟MySQL:数据结构_IT闫的博客-CSDN博客

🐠数据结构:​​​​​​数据结构_IT闫的博客-CSDN博客

💎C++:C++_IT闫的博客-CSDN博客

🥽C51单片机:C51单片机(STC89C516)_IT闫的博客-CSDN博客

💻基于HTML5的网页设计及应用:基于HTML5的网页设计及应用_IT闫的博客-CSDN博客​​​​​​

🥏python:python_IT闫的博客-CSDN博客

🐠离散数学:离散数学_IT闫的博客-CSDN博客

​​​​​​🥽Linux:​​​​Linux_Y小夜的博客-CSDN博客

🚝Rust:Rust_Y小夜的博客-CSDN博客

欢迎收看,希望对大家有用!

目录

🎯简介

🎯过程

🚝创建文件并用vscode打开

🚝编写并分析猜测代码

🥽源码

🥽分析

🚝生成一个随机数

🥽引入rand

 🥽代码分析

🚝比较随机数和所猜数字

🥽分析代码

🚝进行多次猜测

🎯总结


🎯简介

        你将会学到 letmatch、方法(method)、关联函数(associated function)、外部 crate 等知识!后续文章会深入探讨这些概念的细节。

        猜猜看游戏。它是这么工作的:程序将会随机生成一个 1 到 100 之间的随机整数。接着它会请玩家猜一个数并输入,然后提示猜测是大了还是小了。如果猜对了,它会打印祝贺信息并退出。

🎯过程

🚝创建文件并用vscode打开

$ cargo new guessing_game
$ cd guessing_game
$ code .
  • 第一个命令,cargo new,它获取项目的名称(guessing_game)作为第一个参数。
  • 第二个命令进入到新创建的项目目录。
  • 第三个命令使用vscode打开文件夹。

🚝编写并分析猜测代码

🥽源码

use std::io;fn main() {println!("猜数游戏!");println!("请输入你猜的数字:");let mut guess = String::new();io::stdin().read_line(&mut guess).expect("发生错误");println!("你猜的数字是:{}",guess);
}

🥽分析

为了获取用户输入并打印结果作为输出,我们需要将 io输入/输出库引入当前作用域。io 库来自于标准库,也被称为 std

use std::io;

如果你需要的类型不在预导入内容中,就必须使用 use 语句显式地将其引入作用域。std::io 库提供很多有用的功能,包括接收用户输入的功能。


fn main() {

fn 语法声明了一个新函数,小括号 () 表明没有参数,大括号 { 作为函数体的开始。

提醒:println! 是一个在屏幕上打印字符串的宏。


创建存储用户的输入:

    let mut guess = String::new();

提醒:要使用关键字mut(后续文章会进行讲解)创建变量,只用let,创建是常量,变量默认是不可变的,这意味着一旦我们给变量赋值,这个值就不再可以修改了。

        等号(=)告诉 Rust 我们现在想将某个值绑定在变量上。等号的右边是 guess 所绑定的值,它是 String::new 的结果,这个函数会返回一个 String 的新实例。

  ::new 那一行的 :: 语法表明 new 是 String 类型的一个 关联函数associated function)。关联函数是针对类型实现的,在这个例子中是 String,而不是 String 的某个特定实例。一些语言中把它称为 静态方法static method)。

  new 函数创建了一个新的空字符串,你会发现很多类型上有 new 函数,因为它是创建类型实例的惯用函数名。

       总的来说,let mut guess = String::new(); 这一行创建了一个可变变量,当前它绑定到一个新的 String 空实例上。


    io::stdin().read_line(&mut guess)

  .read_line(&mut guess),调用read_line方法从标准输入句柄获取用户输入。我们还将 &mut guess 作为参数传递给 read_line() 函数,让其将用户输入储存到这个字符串中。read_line 的工作是,无论用户在标准输入中键入什么内容,都将其追加(不会覆盖其原有内容)到一个字符串中,因此它需要字符串作为参数。这个字符串参数应该是可变的,以便 read_line 将用户输入附加上去。

  &(取地址符) 表示这个参数是一个 引用reference),它允许多处代码访问同一处数据,而无需在内存中多次拷贝。引用是一个复杂的特性,Rust 的一个主要优势就是安全而简单的操纵引用。完成当前程序并不需要了解如此多细节。现在,我们只需知道它像变量一样,默认是不可变的。因此,需要写成 &mut guess 来使其可变,而不是 &guess。(第四章会更全面的解释引用。)


.expect("发生错误");

用于报错处理。


println!("你猜的数字是:{}",guess);

将用户猜的数字打印出来,guess也可以写到{}里;

🚝生成一个随机数

🥽引入rand

在我们使用 rand 编写代码之前,需要修改 Cargo.toml 文件,引入一个 rand 依赖。

在Cargo.toml修改成以下代码:

[dependencies]
rand="0.3.14"

在 Cargo.toml 文件中,标题以及之后的内容属同一个片段,直到遇到下一个标题才开始新的片段。[dependencies] 片段告诉 Cargo 本项目依赖了哪些外部 crate 及其版本。

可以用cargo update进行更新

提醒:一定要开启rust服务(可以点击ctrl+shift+p,在输入框里搜索rust)

 🥽代码分析

use rand::Rng;

Rng 是一个 trait,它定义了随机数生成器应实现的方法,想使用这些方法的话,此 trait 必须在作用域中。


let secret_number = rand::thread_rng().gen_range(1,101);

  rand::thread_rng 函数提供实际使用的随机数生成器:它位于当前执行线程的本地环境中,并从操作系统获取 seed。接着调用随机数生成器的 gen_range 方法。这个方法由 use rand::Rng 语句引入到作用域的 Rng trait 定义。gen_range 方法获取一个范围表达式(range expression)作为参数,并生成一个在此范围之间的随机数。这里使用的这类范围表达式使用了 start,end 这样的形式,前闭后开

提醒:新版的参数形式可以能做的改变,详情见官方文档,以官方为准。

🚝比较随机数和所猜数字

🥽分析代码

    match guess.cmp(&num) {Ordering::Less => println!("Too small!"),Ordering::Greater => println!("Too big!"),Ordering::Equal => println!("You win!"),}

  cmp 方法用来比较两个值并可以在任何可比较的值上调用。它获取一个被比较值的引用:这里是把 guess 与 secret_number 做比较。然后它会返回一个刚才通过 use 引入作用域的 Ordering 枚举的成员。

        一个 match 表达式由 分支(arms) 构成。一个分支包含一个 模式pattern)和表达式开头的值与分支模式相匹配时应该执行的代码。Rust 获取提供给 match 的值并挨个检查每个分支的模式。

提醒:可能会出现类型不匹配的情况(guess默认为strng,而num默认为i32)

需要用

  let guess: u32 = guess.trim().parse().expect("错误");

进行修改。

        我们将这个新变量绑定到 guess.trim().parse() 表达式上。表达式中的 guess 指的是包含输入的字符串类型 guess 变量。String 实例的 trim 方法会去除字符串开头和结尾的空白字符,我们必须执行此方法才能将字符串与 u32 比较,因为 u32 只能包含数值型数据。用户必须输入 enter 键才能让 read_line 返回并输入他们的猜想,这将会在字符串中增加一个换行(newline)符。


parse方法将字符串转换成其他类型。这里用它来把字符串转换为数值。

所以我们要进行修改

        let guess:u32=match guess.trim().parse(){Ok(num)=>num,Err(_)=>continue,};

如果 parse 不能从字符串生成一个数字,返回一个 Result 的 Err 成员时,expect 会使游戏崩溃并打印附带的信息。如果 parse 成功地将字符串转换为一个数字,它会返回 Result 的 Ok 成员,然后 expect 会返回 Ok 值中的数字。

🚝进行多次猜测

loop 关键字创建了一个无限循环。我们会增加循环来给用户更多机会猜数字:

确保 loop 循环中的代码多缩进四个空格,再次运行程序。注意这里有一个新问题,因为程序忠实地执行了我们的要求:永远地请求另一个猜测,用户好像无法退出。

用户总能使用 ctrl-c 终止程序。不过还有另一个方法跳出无限循环。如果用户输入的答案不是一个数字,程序会崩溃。我们可以利用这一点来退出,

 match guess.cmp(&num){Ordering::Less=>println!("small"),Ordering::Greater=>println!("big"),Ordering::Equal=>{println!("win");break;}}

🎯总结

use std::{cmp::Ordering, io};
use rand::Rng;fn main() {println!("猜数!");let num=rand::thread_rng().gen_range(1,101);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(&num){Ordering::Less=>println!("small"),Ordering::Greater=>println!("big"),Ordering::Equal=>{println!("win");break;}}}
}

程序将会随机生成一个 1 到 100 之间的随机整数。接着它会请玩家猜一个数并输入,然后提示猜测是大了还是小了。如果猜对了,它会打印祝贺信息并退出。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2779250.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL篇----第十七篇

系列文章目录 文章目录 系列文章目录前言一、对于关系型数据库而言,索引是相当重要的概念,请回答有关索引的几个问题二、解释 MySQL 外连接、内连接与自连接的区别三、Myql 中的事务回滚机制概述前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分…

redis之布隆过滤

目录 1、redis之布隆过滤 2、布隆过滤器原理 3、布隆过滤器使用步骤 初始化bitmap 添加占坑位 判断是否存在圜 1、redis之布隆过滤 布隆过滤:有一个初值都为0的bit数组和多个哈希函数构成,用来快速判断集合中是否存在某个元素。目的:减…

顶级思维方式——认知篇三(财富与金钱)

目录 1、 什么是财富/财富的定义? 2、财富的影响 3、 财富意味着什么? 4、财富与幸福的关系 5、物质财富如何使用才有实际意义? 6、金钱的运作方式 7、【物质财富自由】后的选择 1、 什么是财富/财富的定义? 财富是一个多维…

c++之说_14|左值引用与右值引用

提起左右值引用我就头疼 左值: 1、在内存中开辟了空间的便叫左值 2、左值不一定可以赋值 如字符串常量 3、左值可以取地址 右值: 1、在内存中没有开辟空间的 2、右值无法取地址 如: 立即数(1,2,3…

移动端web开发布局

目录 flex布局: flex布局父项常见属性: flex布局子项常见属性: REM适配布局: 响应式布局: flex布局: 需要先给父类盒子设置display:flex flex是flexiblebox的缩写,意为"弹…

面试经典150题——三数之和

​"The road to success and the road to failure are almost exactly the same." - Colin R. Davis 1. 题目描述 2. 题目分析与解析 2.1 思路一——暴力方法 因为三个数相加为0,那么说明其中两个加数的和与另一个加数为相反数则满足题意。所以可以得到…

猫头虎分享已解决Bug || IndexError: index 3 is out of bounds for axis 0 with size 3

博主猫头虎的技术世界 🌟 欢迎来到猫头虎的博客 — 探索技术的无限可能! 专栏链接: 🔗 精选专栏: 《面试题大全》 — 面试准备的宝典!《IDEA开发秘籍》 — 提升你的IDEA技能!《100天精通鸿蒙》 …

解决挂梯子 无法正常上网 的问题

方法: 打开 控制面板 👉 网络和Internet 👉 Internet选项 👉 连接 👉 局域网设置 👉 代理服务器 👉 取消选项 有问题可参考下图

案例:三台主机实现 级联复制

介绍:级联复制架构 级联复制架构 是一种特殊的主从结构,之前聊到的几种主从结构都只有两层,但级联复制架构中会有三层,关系如下: 也就是在级联复制架构中,存在两层从库,这实际上属于一主多从架…

Failed to construct ‘RTCIceCandidate‘ sdpMid and sdpMLineIndex are both null

最近在搞webrtc,在编写函数处理远端传递来的candidate时报错了,具体信息如下。国内关于webrtc的资料很少,所以去国外社区转了一圈,回来记录一下报错的解决方案 其实这个bug也好解决,根据报错信息可以判断是RTCIceCand…

C语言第二十二弹---指针(六)

✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】 指针 1. 回调函数是什么? 2、qsort使用举例 2.1、使用qsort函数排序整型数据 2.2 使用qsort排序结构体数据 3、qsort函数的模拟实现 总结 1. 回…

龙年,大吉

(1) 没有成功的企业,只有时代的企业。这就是人们老说的:天道酬勤。虽然这句话被人说滥了,虽然这句话被人说到反感了,但事实就是这样。 得道者多助。 (2) 人有三大运、三小运。 三大运…

Python基础语法(内置Python, pycharm配置方式)

一.工具安装与配置 1.Python解释器的安装 官网网址:https://www.python.org/ 选择downloads即可(Windows用户点击Windows, 苹果用户点击macOS) 找到最新版本, 并选择 Download Windows installer (64-bit) 下载完成后可在得到一个安装包进行安装(安装时间较长) 安装完成后…

【JMX】JAVA监控的基石

目录 1.概述 2.MBean 2.1.Standard MBean 2.2.Dynamic MBean 2.3.Model Bean 2.4.Dynamic MBean和Model Bean的区别 2.5.MXBean 2.6.Open Bean 3.控制台 1.概述 什么是JMX,首先来看一段对话: Java Management Extensions(JMX&#…

【Wio Terminal教程】使用LCD屏幕(4)

使用LCD屏幕(4) 一、TFT LCD的API例子1、实用图形2、数据显示3、字体4、作为背景显示 二、如何在Wio Terminal上使用LVGL图形库1、安装Seeed_Arduino_LvGL2、示例1. Bench Mark2. Stress Test3.资源 一、TFT LCD的API例子 本节为TFT LCD库的例子提供了一…

ERROR: Could not build wheels for roslz4

Python bugs 最近在安装python的rosbag包时出现了诸多问题,特别记录下。 python版本:3.11 系统版本:Windows10 x86_64 使用conda虚拟环境进行包管理。 运行命令 pip3 install roslz4 --extra-index-url https://rospypi.github.io/simple…

【数据结构与算法】【小白也能学的数据结构与算法】递归 分治 迭代 动态规划 无从下手?一文通!!!

🎉🎉欢迎光临🎉🎉 🏅我是苏泽,一位对技术充满热情的探索者和分享者。🚀🚀 🌟特别推荐给大家我的最新专栏《数据结构与算法:初学者入门指南》📘&am…

|Python新手小白低级教程之项目篇——turtle库|第一章:turtle库基础(1)

项目篇—文章目录 一、预告二、turtle基础1.导入2.画图代码(1)turtle.forward(长度)练习1.1 画线段 (2)turtle.left()和turtle.right()操作符练习2.1 画出边长为100正方形练习2.2 画出边长为100的三角形 (3&#xff09…

腾讯云4核8G12M轻量应用服务器性能够用吗?支持多少人?

腾讯云轻量4核8G12M轻量应用服务器支持多少人同时在线?通用型-4核8G-180G-2000G,2000GB月流量,系统盘为180GB SSD盘,12M公网带宽,下载速度峰值为1536KB/s,即1.5M/秒,假设网站内页平均大小为60KB…

Web前端-移动web开发_rem布局

文章目录 移动web开发之rem布局1.0 rem基础1.1 rem单位(重点)1.2 em单位(了解)1.3 媒体查询什么是媒体查询媒体查询语法规范 1.4 less 基础维护css弊端Less 介绍Less安装Less 使用之变量使用node编译less的指令Less 编译 vocode Less 插件Less 嵌套Less 运算Less中的Mixin混入L…