• Rust实战 | 用 RustRover 开发猜数字游戏


    #1、概述

    从这期开始,我会以实际项目的形式,分享个人学习 Rust 语言的过程。期间,我不会讲太多语法知识,需要各位看官自行查阅文档😄。

    开始前,需具备 Rust 环境(我用的是当前最新版本1.77.2),可看上一篇文章:Rust 安装与版本更新

    #2、前期准备

    #2.1、安装 RustRover

    笔者 IDE 使用的是 JetBrains 出品的 RustRover,除了吃内存,没有什么缺点🙂。通常,我们可以用以下方式安装 RustRover:

    1. 在官网下载对应平台的安装包,傻瓜式安装
    2. 安装 JetBrains Toolbox,在工具里面点击安装

    #2.2、新建项目

    我们的项目名称为rust-journey,使用 monorepo 结构进行项目开发,Cargo Workspaces 对此提供良好的支持。


    项目创建后,我们需要修改自动生成的Cargo.toml内容,删除原有配置,并键入如下信息:

    [workspace]
    resolver = "2"
    members = []
    
    • 1
    • 2
    • 3

    如果使用默认配置,会报no targets specified in the manifest的错误。

    至此,我们的工作空间就创建成功,下一步,需要新建子项目(包)。本文的项目是一个简单的猜数字游戏,取名为j01_number_game,Rust 建议使用下划线小写字母的组合😄。

    熟悉 CLI (命令行界面)的朋友,可以直接在根目录,执行cargo new j01_number_game。或者在 IDE 中右键项目,选择New->Cargo Crate,在弹出对话框键入包名即可。


    工程结构如下:

    #2.3、配置 Git

    仓库地址:https://github.com/0604hx/rust-journey,同时配置.gitignore文件:

    # Generated by Cargo
    # will have compiled files and executables
    debug/
    target/
    
    # Remove Cargo.lock from gitignore if creating an executable, leave it for libraries
    # More information here https://doc.rust-lang.org/cargo/guide/cargo-toml-vs-cargo-lock.html
    Cargo.lock
    
    # These are backup files generated by rustfmt
    **/*.rs.bk
    
    # MSVC Windows builds of rustc generate these, which store debugging information
    *.pdb
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    #3、项目实施

    j01_number_game实现一个经典的新手编程问题,猜猜看游戏:程序将会随机生成一个 1 到 100 之间的随机整数;接着它会请玩家猜一个数并输入,然后提示猜测是大了还是小了;如果猜对了,它会打印祝贺信息并退出;共有 5 次猜测机会。

    #3.1、程序流程

    #3.2、核心代码

    use std::cmp::Ordering;
    use std::io;
    use rand::Rng;
    
    fn main() {
        println!("欢迎来到 Rust 版猜数字游戏");
        //创建随机数
        let secret = rand::thread_rng().gen_range(1..=100);
        let mut limit = 5;
    
        println!("游戏开始(可尝试 {limit} 次),请输入你猜测的数字:");
        loop {
            let mut guess = String::new();
    
            io::stdin().read_line(&mut guess).expect("读取用户输入失败");
    
            let guess:u32 = match  guess.trim().parse() {
                Ok(num)=> num,
                Err(e)=> {
                    println!("数值转换出错 {:?}", e);
                    continue
                }
            };
    
            match secret.cmp(&guess).reverse() {
                Ordering::Less => { println!("你猜的是 {guess} ,小了点噢,再猜下:") }
                Ordering::Greater => { println!("你猜的是 {guess} ,大了点噢,再猜下:") }
                Ordering::Equal => {
                    println!("恭喜,猜对了 O(∩_∩)O");
                    break
                }
            }
    
            limit -= 1;
            if limit <= 0 {
                println!("没有可用次数,游戏结束,你没有获得胜利 =.=");
                break
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40

    程序运行效果

    #4、小结

    对于习惯了 Java、JavaScript 这类语言的我,刚刚开始接触 Rust 语法,着实有点犯怵,觉得哪哪都别扭😂,需要一定的适应时间。

    目前算是入门了🎉,下一步将进行 IO 操作。

  • 相关阅读:
    Lagging issues of Ubuntu 20.04 on VMWare Player(卡顿问题)
    SpringBoot上传文件-本地存储
    ROS OpenCV 级联分类器
    【unity】关于技能释放shader.CreateGPUProgram造成卡顿,优化和定位方法。
    分布式代理IP的优势及用途有哪些?
    每日三题 9.19
    乘积数量(冬季每日一题 14)
    2.Android高仿网易云音乐-引导界面和广告界面实现
    如何将C/C++代码转成webassembly(Linux环境)
    HikariCP与Spring Boot的完美集成,让您的应用更高效、更可靠!
  • 原文地址:https://blog.csdn.net/ssrc0604hx/article/details/137893785