萝卜头IT论坛

搜索
查看: 129|回复: 2
收起左侧

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

[复制链接]
发表于 2024-3-5 17:23:26 | 显示全部楼层 |阅读模式
众所周知,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 编译器、库和脚本)。
工具快捷下载:
rustup-init 1.exe (8.2 MB, 下载次数: 16)
vs_BuildTools.exe (3.81 MB, 下载次数: 14)

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




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


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


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


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



接下来,我们需要确认一下我们正确安装了 Rust 工具链:
  1. rustc --version
复制代码



可以看到工具链的版本:
  1. rustc 1.78.0-nightly (d18480b84 2024-03-04)
复制代码


可通过如下命令安装 rustc 的 nightly 版本,并把该版本设置为 rustc 的缺省版本。
  1. rustup install nightly
  2. rustup default nightly
复制代码


我们最好把软件包管理器 cargo 所用的软件包镜像地址 crates.io 也换成中国科学技术大学的镜像服务器来加速三方库的下载。我们打开(如果没有就新建) ~/.cargo/config 文件,并把内容修改为:
  1. [source.crates-io]
  2. registry = "https://github.com/rust-lang/crates.io-index"
  3. replace-with = 'ustc'
  4. [source.ustc]
  5. registry = "git://mirrors.ustc.edu.cn/crates.io-index"
复制代码


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

  3. [source.tuna]
  4. registry = "https://mirrors.tuna.tsinghua.edu.cn/git/crates.io-index.git"
复制代码



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




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


创建项目目录
  1. $ mkdir ~/projects
  2. $ cd ~/projects
复制代码


准备一个新项目
  1. $ cargo new guessing_game
  2. $ cd guessing_game
复制代码



接下来需要注意2个文件的修改:
1、Cargo.toml
注意需要编辑:
  1. [dependencies]
  2. 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 , 就可以运行代码,来体验这个小游戏。






回复

使用道具 举报

 楼主| 发表于 2024-3-5 17:25:48 | 显示全部楼层
运行起来就像这样:

image.png
回复

使用道具 举报

发表于 2024-3-5 22:06:40 | 显示全部楼层
有趣的应用又多了一个,支持!
回复

使用道具 举报

联系我们(Contact)|手机版|萝卜头IT论坛 ( 苏ICP备15050961号-1 )

GMT+8, 2024-4-28 16:00 , Processed in 0.095599 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表