Rust语言——猜数游戏

  • 目标

生成一个1~100间的随机数

提示玩家输入一个猜测

输入后程序提示猜测是大了还是小了

如果正确了,打印出一个庆祝信息,程序退出

  • 首先我们做一个单次猜测
use std::io;
use rand::Rng;
use std::cmp::Ordering;//枚举类型 分别是小于大于和等于
fn main() {
    println!("猜数!! ");

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

    println!("神秘数字为:{}", secret_number);

    println!("猜测一个数: ");

    //let foo = 1;//let为定义值操作

    //let bar = foo;

    //foo = 2;//报错 因为rust中被定义的变量不能改变类似java中的"常量"

    let mut guess = String::new();//let mut所定义的变量就可以改变值

    io::stdin().read_line(&mut guess).expect("无法读取行");//方法的参数是用引用进行传递的
    //read_line()具有返回值 OK||Err  expect函数若read_line()返回值为Err就输出内部字符串 OK就赋值给guess
    let guess: u32 = guess.trim().parse().expect("Please type a number!");
    //前面guess是新定义的整数类型 后面guess是就定义的字符串类型 trim是去掉两边空白 parse把字符串变为数值类型
    println!("你猜的数是:{}", guess);
    //String 和 io 均为库 ::代表库下的函数
    match guess.cmp(&secret_number){//cmp返回的是Ordering类型
        Ordering::Less => println!("Too small!"),
        Ordering::Greater => println!("Too big!"),
        Ordering::Equal => println!("You win!"),
    }
}

 这里需要注意的有几点:

1.cargo.toml必须要添加rand包的依赖

2.引入rand::Rng 和 std::cmp::Ordering

3.rust中允许在一个变量之后使用相同名字定义另一个变量,但两个变量需要进行赋值连接

4.match 配合 Ordering类型进行匹配(类似java中的switch)

  • 接下来我们要实现可以连续猜测的代码(直到猜对才停止)
use std::io;
use rand::Rng;
use std::cmp::Ordering;//枚举类型 分别是小于大于和等于
fn main() {
    println!("猜数!! ");

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

    //println!("神秘数字为:{}", secret_number);
    //使用loop进行无限循环
    loop {
        println!("猜测一个数: ");

        //let foo = 1;//let为定义值操作

        //let bar = foo;

        //foo = 2;//报错 因为rust中被定义的变量不能改变类似java中的"常量"

        let mut guess = String::new();//let mut所定义的变量就可以改变值

        io::stdin().read_line(&mut guess).expect("无法读取行");//方法的参数是用引用进行传递的
        //read_line()具有返回值 OK||Err  expect函数若read_line()返回值为Err就输出内部字符串 OK就赋值给guess
        let guess: u32 = match guess.trim().parse(){//使用match来处理错误
            Ok(num)=>num,
            Err(_)=>continue,
        };
        //前面guess是新定义的整数类型 后面guess是就定义的字符串类型 trim是去掉两边空白 parse把字符串变为数值类型
        println!("你猜的数是:{}", guess);
        //String 和 io 均为库 ::代表库下的函数
        match guess.cmp(&secret_number){//cmp返回的是Ordering类型
            Ordering::Less => println!("Too small!"),
            Ordering::Greater => println!("Too big!"),
            Ordering::Equal => {
                println!("You win!");
                break;
            },
        }
    }
}

这里需要注意的是:

1.loop{} 进行无线循环

2.rust语言和其他语言一样break;跳出循环 continue;直接执行下一次循环

3.rust中处理错误一般使用match

你可能感兴趣的:(rust,游戏,开发语言)