Skip to content

实现猜数字游戏

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

1.创建项目

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

2.获取用户输入

rust
fn main() {
    println!("=== 猜数字游戏 ===");

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

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

3.运行测试

sh
cargo run

4.控制输入次数

rust
fn main() {
    println!("=== 猜数字游戏 ===");

    let guess_times = 3; // 猜数字的次数

    println!("请输入(1-10)的数字, 你有{}次机会", guess_times);

    let mut i = 0;
    while i < 3 {
        let mut input_num = String::new();
        std::io::stdin().read_line(&mut input_num).expect("fail to read");

        println!("your input: {}", input_num);

        i += 1;
    }

}

5.设置谜底数字, 判断输入

rust
// 1. 谜底是一个数字
// 2. 用户的输入是一个字符串
// 3. 所以需要将用户输入的 字符串 转换为 数字
// 4. 对比两个数字大小并给出提示

use std::cmp::Ordering;

fn main() {
    println!("=== 猜数字游戏 ===");

    let secret_number = 5; // 谜底数字: 先写死, 之后再使用随机数
    let guess_times = 3;

    println!("请输入(1-10)的数字, 你有{}次机会", guess_times);

    let mut i = 0;
    while i < 3 {
        let mut input_num = String::new();
        std::io::stdin().read_line(&mut input_num).expect("fail to read");

        // 解析字符串为数字
        let input_num: i32 = input_num.trim().parse().expect("fail to parse");

        // 对比两个数字大小, 需要使用枚举: std::cmp::Ordering
        match input_num.cmp(&secret_number) {
            Ordering::Less    => println!("你猜的数字太小了"),
            Ordering::Greater => println!("你猜的数字太大了"),
            Ordering::Equal   => {
                println!("恭喜你猜对了, 你赢了");
                break;
            },
        }
        i += 1;
    }

}

使用随机数生成谜底数字

sh
# 安装生成随机数的 crate
cargo install rand
rust
use std::cmp::Ordering;
use rand::prelude::*; // 导入 crate

fn main() {
    println!("=== 猜数字游戏 ===");

    // 生成随机数(1-10)
    let mut rng = thread_rng();
    let secret_number = rng.gen_range(1..=10);

    let guess_times = 3;

    println!("请输入(1-10)的数字, 你有{}次机会", guess_times);

    let mut i = 0;
    while i < 3 {
        let mut input_num = String::new();
        std::io::stdin().read_line(&mut input_num).expect("fail to read");

        let input_num: i32 = input_num.trim().parse().expect("fail to parse");

        match input_num.cmp(&secret_number) {
            Ordering::Less    => println!("你猜的数字太小了"),
            Ordering::Greater => println!("你猜的数字太大了"),
            Ordering::Equal   => {
                println!("恭喜你猜对了, 你赢了");
                break;
            },
        }

        i += 1;
    }

}

完善提示

rust
use std::cmp::Ordering;
use rand::prelude::*;

fn main() {
    println!("=== 猜数字游戏 ===");

    let mut rng = thread_rng();
    let secret_number = rng.gen_range(1..=10);
    let guess_times = 3;

    println!("请输入(1-10)的数字, 你有{}次机会", guess_times);

    let mut i = 0;
    while i < 3 {
        let mut input_num = String::new();
        std::io::stdin().read_line(&mut input_num).expect("fail to read");

        let input_num: i32 = input_num.trim().parse().expect("fail to parse");

        match input_num.cmp(&secret_number) {
            Ordering::Less    => println!("你猜的数字太小了"),
            Ordering::Greater => println!("你猜的数字太大了"),
            Ordering::Equal   => {
                println!("恭喜你猜对了, 你赢了");
                break;
            },
        }

        // 完善提示
        if i == guess_times - 1  {
            println!("你的机会用完了, 你输了");
        }

        i += 1;
    }
}

在线测试

Released under the MIT License.