Rust 编程实现猜数字游戏

article/2025/7/19 21:50:17

文章目录

  • 编程实现猜数字游戏
    • 游戏规则
    • 创建新项目
      • 默认代码
      • 处理用户输入
      • 代码解析
    • 生成随机数
      • 添加依赖
      • 生成逻辑
    • 比较猜测值与目标值
      • 类型转换
    • 循环与错误处理优化
      • 添加循环
      • 优雅处理非法输入​
    • 最终完整代码
    • 核心概念总结

编程实现猜数字游戏

rust crab

我们使用cargorust实现一个经典编程练习——猜数字游戏,在实践中掌握Rust核心概念:let绑定、match模式匹配、方法、关联函数、外部包(crate)等。

游戏规则

程序生成1-100的随机整数作为目标数字。玩家输入猜测值后,程序提示猜测偏大或偏小。若猜中则显示祝贺信息并退出。

创建新项目

​### 初始化项目

$ cargo new guessing_game
$ cd guessing_game
  • 第一条命令创建项目,第二条进入项目目录

  • 生成的Cargo.toml文件包含项目元信息:

[package]
name = "guessing_game"
version = "0.1.0"
edition = "2024"
[dependencies]  # 依赖项声明区域

默认代码

src/main.rs包含自动生成的"Hello, world!":

fn main() {println!("Hello, world!");}

使用cargo run编译并运行:

$ cargo run
Hello, world!

处理用户输入

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:

[dependencies]
rand = "0.9.1"  # 指定版本号

Cargo会自动下载依赖(含次级依赖包)

注:这里也可通过cargo add rand来安装依赖。

生成逻辑

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闭区间随机数

比较猜测值与目标值

use std::cmp::Ordering; // 导入比较枚举match guess.cmp(&secret_number) {Ordering::Less => println!("太小了!"),Ordering::Greater => println!("太大了!"),Ordering::Equal => println!("你赢了!")
}

类型转换

需将字符串猜测值转为整数:

let guess: u32 = guess.trim().parse().expect("请输入数字!"); 
// 类型标注 | 去空格 | 解析 | 错误处理
  • 遮蔽(shadowing)​:复用变量名转换类型

  • 错误处理​:非数字输入导致崩溃(后续优化)

循环与错误处理优化

添加循环

loop {// 输入和比较逻辑}

优雅处理非法输入​

替换expect为模式匹配,避免崩溃:

let guess: u32 = match guess.trim().parse() {Ok(num) => num,       // 解析成功返回数字Err(_) => continue,   // 失败则跳过本轮循环};

​### 胜利时退出
在匹配成功分支添加break:

Ordering::Equal => {println!("你赢了!");break; // 退出循环
}

最终完整代码

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核心机制。下一步可尝试扩展功能:记录猜测次数、添加难度分级或输入验证增强。


http://www.hkcw.cn/article/jUFZtixnHA.shtml

相关文章

苏州SAP代理公司排名:工业园区企业推荐的服务商

目录 一、SAP实施商选择标准体系 1、行业经验维度 2、实施方法论维度 3、资质认证维度 4、团队实力维度 二、SAP苏州实施商工博科技 1、SAP双重认证,高等院校支持 2、以SAP ERP为核心,助力企业数字化转型 三、苏州使用SAP的企业 苏州是中国工业…

2505软考高项第一、二批真题终极汇总

第一批2025.05综合题(75道选择题) 1、2025 年中央一号文件对进一步深化农村改革的各项任务作出全面部署。“推进农业科技力量协同攻关”的相关措施不包括()。 A.强化农业科研资源力量统筹,培育农业科技领军企业 B.发挥农业科研平台作用&…

微深节能 堆取料机动作综合检测系统 格雷母线

精准定位,高效运行——微深节能格雷母线堆取料机动作综合检测系统 在现代工业自动化领域,精准的位置检测是保障设备高效运行的关键。武汉市微深节能科技有限公司推出的格雷母线高精度位移测量系统,凭借其卓越的性能和可靠性,成为…

Android Native 之 adbd进程分析

目录 1、adbd守护进程 2、adbd权限降级 3、adbd命令解析 1)adb shell 2)adb root 3)adb reboot 4、案例 1)案例之实现不需要执行adb root命令自动具有root权限 2)案例之实现不需要RSA认证直接能够使用adb she…

wireshark分析国标rtp ps流

1.将抓到的tcp或者udp视频流使用decode as 转为rtp包 2.电话->RTP->RTP播放器 选择Export 里面的Payload 就可以导出原始PS流

next.js 如何做中英文切换(详解)

最近开发的项目涉及到了 react, 因为之前没用过 next.js, 发现文档比较乱,所以也是花了点时间,这里做个记录。 前提依赖:App 文件夹路由 {"next": "14.2.22","react-i18next": "^15.5.1","i1…

SpringAI系列4: Tool Calling 工具调用 【感觉这版本有bug】

前言:在最近发布的 Spring AI 1.0.0.M6 版本中,其中一个重大变化是 Function Calling 被废弃,被 Tool Calling 取代。Tool Calling工具调用(也称为函数调用)是AI应用中的常见模式,允许模型通过一组API或工具…

SAR ADC 比较器噪声分析(二)

SAR ADC的比较器是非常重要的模块,需要仔细设计。主要考虑比较器的以下指标: 1)失调电压 2)输入共模范围 3)比较器精度 4)传输延时 5)噪声 6)功耗 这里主要讲一下动态比较器的noise。 动态比较器一般用于高速SAR ADC中,且精度不会超过12bit…

Haproxy搭建Web集群

目录 Haproxy概述 Haproxy调度算法 静态调度算法 动态调度算法 其他调度算法 案例环境 配置网站 配置Haproxy Haproxy日志 MySQL负载均衡调度模式 Nginx负载均衡算法 Haproxy概述 Haproxy是一款开源、高性能的负载均衡和代理服务器,支持TCP和HTTP协议&a…

中联教育 - 嵌入式BI助力财经数据分析服务

“借助Wyn商业智能软件嵌入式BI工具强大的嵌入式能力,我们实现了与已有的财经教育教学实训平台的深度融合,大幅提升了平台的数据分析服务能力。同时,产品简单易用的特性,也让我们的学员能够快速上手,进行财务报表的设计…

Qt实现csv文件按行读取的方式

Qt实现csv文件按行读取的方式 场景:我有一个保存数据的csv文件,文件内保存的是按照行保存的数据,每行数据是以逗号为分隔符分割的文本数据。如下图所示: 现在,我需要按行把这些数据读取出来。 一、使用QTextStream文本流的方式读取 #include <QFile>void readfil…

VMware Workstation虚拟系统设置双网口

一.设置windows11系统VMware Network Adapter VMnet1。 1.进入到网络和Internet -> 高级网络设置 2.找到VMware Network Adapter VMnet1&#xff0c;进入到“更多配置选项”并“编辑”。 3.进入到属性&#xff0c;双击“Interenet协议版本4&#xff08;TCP/IPv4&#xff…

CppCon 2014 学习:Lock-Free Programming

你这段文字讲的是“为什么要使用无锁&#xff08;Lock-Free&#xff09;代码”&#xff0c;我帮你总结并解释一下&#xff1a; 为什么选择无锁代码&#xff1f; 并发性和可扩展性&#xff08;Concurrency and scalability&#xff09; 无锁算法允许多个线程同时操作共享数据&a…

MFA多因素认证与TOTP算法核心解析(含Java案例)

目录 一、多因素认证(MFA)概述MFA基本概念MFA与2FA的区别MFA的重要性 二、TOTP算法原理TOTP基本概念时间变量T的计算TOTP生成过程TOTP验证过程 三、TOTP在MFA中的应用绑定流程认证流程TOTP的优势 四、TOTP的安全考虑哈希算法选择密钥管理防暴力破解时间同步通信安全 五、TOTP的…

openssl-aes-ctr使用openmp加速

openssl-aes-ctr使用openmp加速 openssl-aes-ctropenmp omp for openssl-aes-ctr 本文采用openssl-1.1.1w进行开发验证开发&#xff1b;因为aes-ctr加解密模式中&#xff0c;不依赖与上一个模块的加/解密的内容&#xff0c;所以对于aes-ctr加解密模式是比较适合进行并行加速的…

git查看commit属于那个tag

1. 快速确认commit原始分支及合入tag # git describe 213b4b3bbef2771f7a1b8166f6e6989442ca67c8 查看commit合入tag # git describe 213b4b3bbef2771f7a1b8166f6e6989442ca67c8 --all 查看commit原始分支 2.查看分支与master关系 # git show --all 0.5.67_0006 --stat 以缩…

怎么在window上打开ubuntu虚拟机?

怎么在window上打开ubuntu虚拟机&#xff1f; 1.先下载ubuntu镜像包并解压&#xff08;VM-ubuntu18-202304.7z&#xff09;,下载地址在本文档中有链接&#xff0c;自行查找。&#xff08;解压路径不要有中文&#xff09; 2.打开VMware软件&#xff0c;&#xff08;软件下载地址…

中国移动咪咕助力第五届全国人工智能大赛“AI+数智创新”专项赛道开展

第五届全国人工智能大赛由鹏城实验室主办&#xff0c;新一代人工智能产业技术创新战略联盟承办&#xff0c;华为、中国移动、鹏城实验室科教基金会等单位协办&#xff0c;广东省人工智能与机器人学会支持。 大赛发布“AI图像编码”、“AI增强视频质量评价”、“AI数智创新”三大…

第十三章 MQTT消息

系列文章目录 系列文章目录 第一章 总体概述 第二章 在实体机上安装ubuntu 第三章 Windows远程连接ubuntu 第四章 使用Docker安装和运行EMQX 第五章 Docker卸载EMQX 第六章 EMQX客户端MQTTX Desktop的安装与使用 第七章 EMQX客户端MQTTX CLI的安装与使用 第八章 Wireshark工具…

国芯思辰| 16通道12位模数转换器SC1425高性价比SGM5200替代方案,专为数字电源优化

与传统的模拟电源相比&#xff0c;数字电源的主要区别是控制与通信部分。在复杂的多系统业务中&#xff0c;数字电源是通过软件编程来实现多方面的应用&#xff0c;数字电源广泛应用于在可控因素较多、实时反应速度更快、需要多个模拟系统电源管理的、复杂的高性能系统应用中。…