Skip to content

实现猜数字游戏 ​

主要是为了快速体验 rust 的基本语法

1.创建项目 ​

sh
cargo new guess-number-game
cd guess-number-game

2.获取用户输入 ​

rust
use std::io;

fn main() {
    println!("=== 猜数字游戏 ===");
    println!("请输入一个数字: ");

    let mut input_str = String::new();
    io::stdin().read_line(&mut input_str).expect("fail to read");

    println!("your input is: {input_str}");
}

3.设置谜底数字,判断结果 ​

rust
// 导入标准库API
use std::cmp::Ordering;
use std::io;

fn main() {
    println!("=== 猜数字游戏 ===");
    println!("请输入一个数字: ");

    // 0.设置谜底(应该为随机数) 先写死,后续逻辑做完再修改为随机数
    let answer_num = 5;

    // 1.获取用户输入
    let mut input_str = String::new();
    io::stdin().read_line(&mut input_str).expect("fail to read");

    // 2.处理用户输入(字符串转数字才能比较大小)
    let input_num: u32 = input_str
        .trim()
        .parse()
        .expect("fail to parse input string to a u32 value");

    // 3.对比答案
    match input_num.cmp(&answer_num) {
        Ordering::Less => println!("你输入的数字太小了"),
        Ordering::Greater => println!("你输入的数字太大了"),
        Ordering::Equal => {
            println!("恭喜你,猜对了!");
        }
    }
}

4.控制猜测机会 ​

一次机会太难猜中了, 所以需要控制猜测机会

rust
use std::cmp::Ordering;
use std::io;

fn main() {
    println!("=== 猜数字游戏 ===");
    println!("请输入一个数字: ");

    // 谜底数字
    let answer_num = 5;

    // 猜测机会
    let mut chance = 3;

    loop {
        if chance == 0 {
            // 机会用完没猜对则结束(退出程序)
            println!("机会用完了,没有猜对,你输了");
            break;
        }

        let mut input_str = String::new();
        io::stdin().read_line(&mut input_str).expect("fail to read");
        let input_num: u32 = input_str
            .trim()
            .parse()
            .expect("fail to parse input string to a u32 value");

        match input_num.cmp(&answer_num) {
            Ordering::Less => println!("你输入的数字太小了"),
            Ordering::Greater => println!("你输入的数字太大了"),
            Ordering::Equal => {
                println!("恭喜你,猜对了!");
                break; // 赢了就直接退出游戏
            }
        }

        // 控制猜测机会变量
        chance -= 1;
    }
}

5.完善提示与随机数 ​

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

fn main() {
    // 0.输出提示 & 定义游戏设置
    println!("=== 猜数字游戏 ===");

    // 1.游戏设置变量
    // 答案最大值/最小值/猜测机会(机会用完没猜对则结束)
    let min: u32 = 1;
    let max: u32 = 11;
    let mut chance = 3;
    let is_debug = false; // 方便测试猜对/猜错结果是否符合预期

    // 2.生成谜底数字(随机数)
    let answer_num = rand::random_range(min..max); // 注意 rand 版本是 0.10.2

    if is_debug {
        println!("答案是:{}", answer_num);
    }

    loop {
        if chance == 0 {
            println!("机会用完,游戏结束,你输了,答案是:{}", answer_num);
            break;
        }

        // 3.获取用户输入并处理
        println!("请输入一个数字(范围:{}-{}):", min, max - 1);

        let mut input_str = String::new();
        io::stdin()
            .read_line(&mut input_str)
            .expect("fail to read line");

        let input_num: u32 = input_str
            .trim()
            .parse()
            .expect("fail to parse input string");

        // 4.对比结果
        match input_num.cmp(&answer_num) {
            Ordering::Less => println!("你输入的数字太小了"),
            Ordering::Greater => println!("你输入的数字太大了"),
            Ordering::Equal => {
                println!("恭喜你,猜对了!");
                break;
            }
        }

        // 5.更新猜测机会
        chance -= 1;
    }
}

6.运行测试 ​

sh
cargo run
# 按照提示输入数字

Released under the MIT License.