农企新闻网

rust游戏多少钱(Rust头铁之路)

发布者:王阳远
导读2022年03月11日 日更 73 / 100 天创建新项目cargo new guessing_gamecd guessing_game // 进入创建的项目目录code . // 使用 vscod

Rust头铁之路 | 编写猜数字游戏

2022年03月11日 日更 73 / 100 天

创建新项目

cargo new guessing_game
cd guessing_game // 进入创建的项目目录
code . // 使用 vscode 打开项目

上述命令自动在 src 目录下创建了一个 main.rs 文件

处理一次猜测

获取用户输入的数字,并打印出来

use std::io; // 这种语句不用手动敲,可以使用编辑器的提示,选择引入

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

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

    let mut guess = String::new(); // <-- 可变变量;使用 :: 调用函数

    io::stdin()
        .read_line(&mut guess)
        .expect("Failed to read line"); // <-- 错误处理代码

    println!("You guessed:{}", guess); // {} 是变量占位符
}

测试代码

cargo run

生成秘密数字

•引入 rand 包

在 Cargo.toml 文件中声明引入的包

...
[dependencies]
rand = "0.8.5"

编辑器可能有大量报错,看不懂没事。关闭编辑器。执行以下命令

cargo build // 这条命令可以把引入包下载过来

重新打开项目,可以看到一切正常了。

生成一个随机数

use std::io;

use rand::Rng;

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

    let secret_number = rand::thread_rng().gen_range(1..101); // 生成随机数的方法

    println!("The secret number is : {}", secret_number);

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

    let mut guess = String::new();

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

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

比较猜测的数字和秘密数字

use std::{io, cmp::Ordering};

use rand::Rng;

fn main() {
    // 省略代码同上

    let mut guess= String::new();

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

    // 变量遮蔽把 guess 的类型变成 数字类型
    let guess: u32 = guess.trim().parse().expect("Please type a number!");

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

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

使用循环来允许多次猜测

use std::{io, cmp::Ordering};

use rand::Rng;

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

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

    println!("The secret number is : {}", secret_number);

    // 引入循环语句处理
    loop {
        println!("Please input your guess.");

        let mut guess= String::new();
    
        io::stdin().read_line(&mut guess).expect("Failed to read line");
    
        // 变量遮蔽把 guess 的类型变成 数字类型
        let guess: u32 = guess.trim().parse().expect("Please type a number!");
    
        println!("You guessed:{}", guess);
    
        match guess.cmp(&secret_number) {
            Ordering::Less => println!("Too small !"),
            Ordering::Greater => println!("Too big!"), 
            Ordering::Equal => println!("You win!"),
        }

    }
}

猜测正确后退出

use std::{io, cmp::Ordering};

use rand::Rng;

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

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

    println!("The secret number is : {}", secret_number);

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

        let mut guess= String::new();
    
        io::stdin().read_line(&mut guess).expect("Failed to read line");
    
        // 变量遮蔽把 guess 的类型变成 数字类型
        let guess: u32 = guess.trim().parse().expect("Please type a number!");
    
        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;  // 这里使用 break 退出循环
            }
        }

    }
}

处理无效输入

防止用户输入不是数字的时候,导致程序崩溃。

use std::{io, cmp::Ordering, num};

use rand::Rng;

fn main() {
        // 省略代码同上

        // 现在这里变成 match 匹配错误处理
        let guess: u32 = match guess.trim().parse() {
            Ok(num) => num,
            Err(_) => continue,
        };
    
        println!("You guessed:{}", guess);
    
        // 以下代码同上

    }
}

总结

通过这个猜数游戏,正好复习了一个项目,从初始创建,到引入第三方包。程序语法上用到,变量、循环、match匹配。