ATP 发表于 2024-3-5 17:23:26

【新手练习】用Rust写一个猜数字游戏

众所周知,Rust是非常强大且牛逼的语言,我个人认为可以碾压C++。

但是作为初学者,没什么本事,所以就写一个简单的猜数字游戏,随便把Rust的部署一起说一遍。(Windows一笔带过,毕竟一般我习惯在Ubuntu上操作)


Windows 平台:
首先你需要在他的官网(https://www.rust-lang.org/zh-CN/tools/install)下载rustup-init ,但是先决条件是你的PC需要安装Virtual Studio,或者您可以访问https://visualstudio.microsoft.com/zh-hans/visual-cpp-build-tools/ 来获取Microsoft C++ 生成工具(独立 MSVC 编译器、库和脚本)。
工具快捷下载:



接下来,你只需要按照正常的流程安装就行了。




Linux/Mac(实际上Mac就一部分)平台:
打开你的终端,输入:
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

或者使用tuna源来加速 参见 rustup 帮助:
export RUSTUP_DIST_SERVER=https://mirrors.tuna.edu.cn/rustup
export RUSTUP_UPDATE_ROOT=https://mirrors.tuna.edu.cn/rustup/rustup
curl https://sh.rustup.rs -sSf | sh

或者也可以通过在运行前设置命令行中的科学上网代理来实现:
# 具体情况具体分析,请结合自身实际情况输入:
export https_proxy=http://127.0.0.1:1080
export http_proxy=http://127.0.0.1:1080
export ftp_proxy=http://127.0.0.1:1080

安装完成后,我们可以重新打开一个终端来让之前设置的环境变量生效。我们也可以手动将环境变量设置应用到当前终端,只需要输入以下命令:
source $HOME/.cargo/env


接下来,我们需要确认一下我们正确安装了 Rust 工具链:
rustc --version


可以看到工具链的版本:
rustc 1.78.0-nightly (d18480b84 2024-03-04)

可通过如下命令安装 rustc 的 nightly 版本,并把该版本设置为 rustc 的缺省版本。
rustup install nightly
rustup default nightly


我们最好把软件包管理器 cargo 所用的软件包镜像地址 crates.io 也换成中国科学技术大学的镜像服务器来加速三方库的下载。我们打开(如果没有就新建) ~/.cargo/config 文件,并把内容修改为:

registry = "https://github.com/rust-lang/crates.io-index"
replace-with = 'ustc'

registry = "git://mirrors.ustc.edu.cn/crates.io-index"

同样,也可以使用tuna源 参见 crates.io 帮助:
replace-with = 'tuna'


registry = "https://mirrors.tuna.tsinghua.edu.cn/git/crates.io-index.git"


这下就算基本大功告成了。当然正常情况下只需要执行curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh就已经可以正常使用了。




接下来才是正题:写一个简单的猜数小游戏。


创建项目目录
$ mkdir ~/projects
$ cd ~/projects


准备一个新项目
$ cargo new guessing_game
$ cd guessing_game


接下来需要注意2个文件的修改:
1、Cargo.toml
注意需要编辑:

rand = "0.8.5"

2、./src/main.rs
这就是存放源代码的文件了。
我们直接放上最终代码:



use rand::Rng;
use std::cmp::Ordering;
use std::io;

fn main() {
    println!("Guess the number!");

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

    loop {
      println!("Please input your guess.");

      let mut guess = String::new();

      io::stdin()
            .read_line(&mut guess)
            .expect("Failed to read line");

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

      println!("You guessed: {guess}");

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

下面对代码进行解释:(懒得自己写了,直接由AI生成一份好了)

这段代码是一个简单的猜数字游戏,让用户猜一个随机生成的秘密数字。让我们逐行解释:

1. `use rand::Rng;`:这行代码导入了一个名为 `Rng` 的 trait,它定义了随机数生成器使用的方法。
2. `use std::cmp::Ordering;`:这行代码导入了一个用于比较的枚举 `Ordering`,它有三个可能的值:`Less`、`Greater` 和 `Equal`。
3. `use std::io;`:这行代码导入了标准库中的输入输出模块,使我们能够从用户那里获取输入。

接下来是 `main` 函数:

1. `println!("Guess the number!");`:输出一条提示消息,告诉用户这是一个猜数字的游戏。
2. `let secret_number = rand::thread_rng().gen_range(1..=100);`:使用 `rand` 库中的 `thread_rng()` 方法创建一个新的随机数生成器,并使用 `gen_range` 方法生成一个介于 1 和 100 之间的随机数,包括 1 和 100。
3. `loop { ... }`:开始一个循环,直到用户猜对了数字才会退出循环。

在循环内部:

1. `println!("Please input your guess.");`:提示用户输入猜测的数字。
2. `let mut guess = String::new();`:创建一个可变的空字符串来存储用户的输入。
3. `io::stdin().read_line(&mut guess).expect("Failed to read line");`:从标准输入中读取一行用户的输入,并将其存储在 `guess` 变量中。如果读取失败,则打印错误消息并继续循环。
4. `let guess: u32 = match guess.trim().parse() { ... }`:对用户输入的字符串进行处理,先使用 `trim()` 方法去除首尾空白,然后使用 `parse()` 方法将其转换为 `u32` 类型的数字。如果转换成功,将数字存储在 `guess` 变量中;如果转换失败,则继续下一次循环。
5. `println!("You guessed: {guess}");`:输出用户猜测的数字。
6. `match guess.cmp(&secret_number) { ... }`:使用 `match` 表达式比较用户猜测的数字与秘密数字。

    - 如果用户的猜测小于秘密数字,打印 `"Too small!"`。
    - 如果用户的猜测大于秘密数字,打印 `"Too big!"`。
    - 如果用户的猜测等于秘密数字,打印 `"You win!"` 并退出循环。

这样,程序就会一直循环直到用户猜对了数字。


接下来你只需要在终端输入cargo run , 就可以运行代码,来体验这个小游戏。






ATP 发表于 2024-3-5 17:25:48

运行起来就像这样:


jyssysz 发表于 2024-3-5 22:06:40

有趣的应用又多了一个,支持!

Integral 发表于 2024-7-25 00:21:59

看好 Rust,缺点就是不太适合作为第一门语言学 {:05:}
页: [1]
查看完整版本: 【新手练习】用Rust写一个猜数字游戏