实践Rust:编写一个猜数字游戏

如果你正在学习Rust,并且想通过一个有趣的小项目来巩固所学知识,那么"猜数字游戏"是一个绝佳的选择!这个游戏的逻辑非常简单:程序会随机生成一个数字,玩家需要猜测这个数字是多少,程序会告诉玩家猜大了还是猜小了,直到猜中为止。

通过这个项目,你将学习到Rust的以下核心概念:

  • Cargo:Rust的构建工具和包管理器。
  • let:用于声明变量。
  • match:用于模式匹配。
  • method:方法,与特定类型关联的函数。
  • fn:函数,可重用的代码块。
  • crate:如何引入第三方库。

让我们一步步来实现这个游戏吧!


1. 游戏逻辑

猜数字游戏的逻辑非常简单:

  1. 程序随机生成一个1到100之间的数字。
  2. 玩家输入一个数字作为猜测。
  3. 程序比较玩家的猜测和生成的数字:
    • 如果猜对了,游戏结束,程序恭喜玩家。
    • 如果猜错了,程序会告诉玩家猜大了还是猜小了,然后让玩家继续猜。
  4. 重复步骤2和3,直到玩家猜中为止。

2. 创建项目

首先,使用Cargo创建一个新项目:

bash 复制代码
cargo new guessing_game
cd guessing_game

这会生成一个名为guessing_game的项目,并自动创建Cargo.tomlsrc/main.rs文件。


3. 编写代码

打开src/main.rs文件,开始编写代码。

(1)引入外部crate

我们需要使用rand库来生成随机数。在Cargo.toml文件中添加以下内容:

toml 复制代码
[dependencies]
rand = "0.8"

然后运行cargo build,Cargo会自动下载并编译rand库。

也可以直接在命令行中使用命令cargo add rand来添加最新版本的rand包。

使用最新版本的包时可能会遇见提示某些函数已过期的提示,可自行修改或者参考本专栏源码仓库Waitfish/rust_example
thread_rnggen_range在新版本的rand包中已经改名,根据提示改成新的包名即可。

(2)编写主程序

src/main.rs中编写以下代码:

rust 复制代码
use rand::Rng;
use std::cmp::Ordering;
use std::io;

fn main() {
    println!("猜数字游戏!");

    // 生成一个1到100之间的随机数
    let secret_number = rand::thread_rng().gen_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(_) => {
                println!("请输入一个有效的数字!");
                continue;
            }
        };

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

        // 比较猜测的数字和生成的数字
        match guess.cmp(&secret_number) {
            Ordering::Less => println!("太小了!"),
            Ordering::Greater => println!("太大了!"),
            Ordering::Equal => {
                println!("恭喜你,猜对了!");
                break;
            }
        }
    }
}

4. 代码解析

(1)Cargo
  • 我们使用Cargo创建项目,并通过Cargo.toml管理依赖(如rand库)。
(2)let
  • let用于声明变量。例如:

    rust 复制代码
    let secret_number = rand::thread_rng().gen_range(1..=100);

    这里声明了一个不可变的变量secret_number,存储生成的随机数。

  • 如果要声明可变变量,需要使用mut关键字:

    rust 复制代码
    let mut guess = String::new();
(3)match
  • match用于模式匹配。例如:

    rust 复制代码
    match guess.cmp(&secret_number) {
        Ordering::Less => println!("太小了!"),
        Ordering::Greater => println!("太大了!"),
        Ordering::Equal => {
            println!("恭喜你,猜对了!");
            break;
        }
    }

    这里根据guesssecret_number的比较结果,执行不同的操作。

(4)method: 方法
  • 方法是与特定类型关联的函数。例如:

    rust 复制代码
    guess.trim().parse()

    trim()String类型的方法,用于去除字符串两端的空白字符。

(5)fn: 函数
  • 函数是可重用的代码块。例如:

    rust 复制代码
    fn main() {
        // 主函数
    }

    main函数是程序的入口点。

(6)使用外部crate
  • 我们通过rand库生成随机数:

    rust 复制代码
    let secret_number = rand::thread_rng().gen_range(1..=100);

5. 运行游戏

在项目目录中运行以下命令:

bash 复制代码
cargo run

然后根据提示输入你的猜测,看看能否猜中随机生成的数字!


6. 总结

通过这个简单的猜数字游戏,我们学习了Rust的以下核心概念:

  • Cargo:管理项目和依赖。
  • let:声明变量。
  • match:模式匹配。
  • method 方法:与类型关联的函数。
  • fn 函数:可重用的代码块。
  • 外部crate:引入第三方库。

希望这个小项目能帮助你更好地理解Rust的基础知识。接下来,你可以尝试扩展这个游戏,比如增加难度、记录猜测次数等。Happy Coding!🚀


参考资源

相关推荐
C_V_Better34 分钟前
浏览器缓存机制:JavaScript 文件缓存导致 404 错误的解决方案
开发语言·前端·javascript·缓存
小救星小杜、37 分钟前
a = b &&c 的含义
开发语言·前端·javascript
59678515438 分钟前
C# ListView设置标题头背景颜色和字体颜色
开发语言·c#
#摩斯先生1 小时前
iOS QLPreviewController预览PDF文件等(Swift)
开发语言·ios·pdf·xcode·swift
Lill_bin1 小时前
Java中的分布式锁:原理、实现与最佳实践
java·开发语言·数据结构·分布式·算法·排序算法·maven
weixin_307779131 小时前
Python带多组标签的Snowflake SQL查询批量数据导出程序
开发语言·python·sql
大模型铲屎官1 小时前
Python 科学计算与机器学习入门:NumPy + Scikit-Learn 实战指南
开发语言·人工智能·python·机器学习·numpy·编程·scikit-learn
尤宸翎1 小时前
Elixir语言的容量规划
开发语言·后端·golang
小峰编程1 小时前
Python数据类型进阶——详解
linux·运维·服务器·开发语言·python·pycharm·swift
m0_466923801 小时前
【java】字符串存储的内存原理
java·开发语言