实践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!🚀


参考资源

相关推荐
来恩10031 小时前
C# 类与对象详解
开发语言·c#
komo莫莫da1 小时前
寒假刷题Day19
java·开发语言
ElseWhereR2 小时前
C++ 写一个简单的加减法计算器
开发语言·c++·算法
※DX3906※3 小时前
cpp实战项目—string类的模拟实现
开发语言·c++
wjs20243 小时前
Nginx 安装配置指南
开发语言
Dr.勿忘4 小时前
C#面试常考随笔8:using关键字有哪些用法?
开发语言·unity·面试·c#·游戏引擎
dal118网工任子仪4 小时前
92,[8] 攻防世界 web Web_php_wrong_nginx_config
开发语言·php
wjs20244 小时前
SQLite Update 语句详解
开发语言
加油,旭杏4 小时前
【go语言】接口
开发语言·后端·golang