我认为学习计算机语言,应该先用后学,这一节,我们来实现一个猜数字的小游戏。



先简单介绍一个这个游戏的内容:游戏先生成一个1到100之间的任意一个数字,然后我们输入自己猜测的数字,游戏会告诉我们输入的数字太大还是太小,然后我们重新输入新的数字,直到猜到游戏生成的数字,然后游戏结束。

创建项目

制作游戏的第一步先创建项目,创建方法和上一节一样,使用 cargo 来创建一个名为 guessing_game 的项目。

cargo new guessing_game && cd guessing_game

项目创建完成,可以运行一下,如果程序打印出 Hello, World! 则证明程序创建完成,运行命令如下:

cargo run 

读取猜测的数字

正式写游戏的第一步,让游戏先读取我们猜测的数字。我们可以先把打印语句换成提示我们输入数字的提示语句。

use std::io;  fn main() {     println!("猜测数字游戏,请输入您猜测的数字。");      let mut guess = String::new();      io::stdin().read_line(&mut guess).expect("读取数字失败!");      println!("您猜测的数字是:{}", guess); } 

这段代码包含了大量的信息,我们一行一行地过一遍。
1.因为我们需要读取用户的输入,然后把它作为结果打印出来,所以需要把 标准库(被称作 std )中的 io 依赖引入当前作用域。
2.在主函数中写方法体,首先是打印提示语,不说了。
3.然后创建一个用于保存即将输入的字符串的 String 类型的变量 guess。
4.把控制台输入的数字读取到变量 guess 中,如果读取失败,则打印 “读取数字失败!” 的字符串。
5.把读取的数字再打印到控制台。

注:这段程序的细节暂时先不深究了,后续文章会一一解释清楚。


测试一下这段程序:

cargo run                                        Compiling guessing_game v0.1.0 (/Users/shanpengfei/work/rust-work-space/study/guessing_game)     Finished dev [unoptimized + debuginfo] target(s) in 1.01s      Running `target/debug/guessing_game` 猜测数字游戏,请输入您猜测的数字。 2 您猜测的数字是:2

生成随机数

我们的游戏需要创建一个随机数,供我们去猜测,这个数字要求每次启动游戏时都是不相同的,这样游戏才更加有意思。接下来我们在游戏中生成一个1到100的随机数。但是 rust 没有在它的标准库中提供生成随机数的方法,不过没关系,它提供了生成随机数的名为 rand 的 crate。我们来引入一下生成随机数的 crate,修改 Cargo.toml 文件:

[dependencies]  rand = "^0.3.14"

只需要在 [dependencies] 下面添加需要的 crate 即可。这次添加的 crate 名字是 rand,版本号 0.3.14, 而 ^ 的意思是兼容 0.3.14 版本的任何版本都可以。然后我们编译一下程序,就会自动下载引入的依赖:

cargo build                                           Updating crates.io index    Compiling libc v0.2.65    Compiling rand v0.4.6    Compiling rand v0.3.23    Compiling guessing_game v0.1.0 (/Users/shanpengfei/work/rust-work-space/study/guessing_game)     Finished dev [unoptimized + debuginfo] target(s) in 1m 13s

引入了生成随机数和 crate 后,我们来生成一下需要的 crate,代码如下:

use std::io; use rand::Rng;  fn main() {     let secret_number = rand::thread_rng().gen_range(1, 101);      println!("生成的随机数字是:{}", secret_number);      println!("猜测数字游戏,请输入您猜测的数字。");      let mut guess = String::new();      io::stdin()