Rust猜数字之循环

循环

loop关键字给我们一个无限循环。让我们添加它:

     extern crate rand;

     use std::io;
     use std::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)
                 .ok()
                 .expect("failed to read line");

             let guess: u32 = guess.trim().parse()
                 .ok()
                 .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!"),
             }
         }
     }

试一下。但是等等,我们不是仅仅添加了一个死循环吗?是的,但是记住我们讨论的parse()了吗?如果我们给一个非数字答案,我们就爱那个会返回并推出。观察:

     $ cargo run
        Compiling guessing_game v0.0.1 (file:///home/you/projects/guessing_game)
          Running `target/guessing_game`
     Guess the number!
     The secret number is: 59
     Please input your guess.
     45
     You guessed: 45
     Too small!
     Please input your guess.
     60
     You guessed: 60
     Too big!
     Please input your guess.
     59
     You guessed: 59
     You win!
     Please input your guess.
     quit
     thread '<main>' panicked at 'Please type a number!'

哈!quit确实退出了。首先,当你赢的时候实现真正的退出。

     extern crate rand;

     use std::io;
     use std::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)
                 .ok()
                 .expect("failed to read line");

             let guess: u32 = guess.trim().parse()
                 .ok()
                 .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;
                 }
             }
         }
     }

通过在You win!后面添加break,当我们胜利时将会退出循环。退出循环也意味着退出程序,因为它是main()中最后的事情。我们还要做一个修正:当有人输入的是非数字的时候,我们不想退出,我们只想忽略它。我们可以这样做:

     extern crate rand;

     use std::io;
     use std::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)
                 .ok()
                 .expect("failed to read line");

             let guess: u32 = match guess.trim().parse() {
                 Ok(num) => num,
                 Err(_) => continue,
             };

             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;
                 }
             }
         }
     }

这些是改变的行:

     let guess: u32 = match guess.trim().parse() {
           Ok(num) => num,
           Err(_) => continue,
     };

这是你通常从‘遇到错误退出’变成‘实际处理错误’,通过从ok().expect()转换成一个match声明。通过parse()返回的Result是一个枚举类型类似于Ordering,但是在这种情况下,每一中变化都有一些数据与之关联:Ok是成功,Err是失败。每个包含更多信息:正确解析整数或者一个错误类型。在这种情况下,我们匹配Ok(num),将Ok的内部值设置成num,并且我们仅仅在右边返回它即可。在Err的情况下,我们不关心是什么样的错误,所以我们使用_代替一个名字。忽略错误,continue将会进入下一次循环迭代。

现在应该是好使的!让我们试试:

     $ cargo run
        Compiling guessing_game v0.0.1 (file:///home/you/projects/guessing_game)
          Running `target/guessing_game`
     Guess the number!
     The secret number is: 61
     Please input your guess.
     10
     You guessed: 10
     Too small!
     Please input your guess.
     99
     You guessed: 99
     Too big!
     Please input your guess.
     foo
     Please input your guess.
     61
     You guessed: 61
     You win!

非常了不起!还有一处需要修正,我们已经完成了猜数字的游戏。你能想出这一处是什么吗?对的,我们不想打印出神秘数字。对于测试它是好的,但是它毁掉了游戏。这是我们的最终代码:

     extern crate rand;

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

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

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

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

             let mut guess = String::new();

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

             let guess: u32 = match guess.trim().parse() {
                 Ok(num) => num,
                 Err(_) => continue,
             };

             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;
                 }
             }
         }
     }

结束语

到这里,你已经成功构建了猜数字游戏!恭喜!

第一个项目展示了很多东西:let、match、方法、关联函数、使用外部crate等等。我们下一个项目将会展示更多。

时间: 2024-10-11 08:37:05

Rust猜数字之循环的相关文章

Rust猜数字之比较

比较 既然我们获得了用户的输入,让我们把猜测的数据跟神秘数字做比较.这是我们的下一步,尽管它还不能真正工作: extern crate rand; use std::io; use std::cmp::Ordering; use rand::Rng; fn main() { println!("Guess the number!"); let secret_number = rand::thread_rng().gen_range(1, 101); println!("The

Python学习_2_通过猜数字学习循环,其中三段不同实现代码

lucky_number = 57 def first_way(): """这是第一种方式: 1.用while循环: 2.有循环计数变量: 3.在while语句外定义guess_number变量. """ global lucky_number guess_number = int("0") loop_count = 0 while guess_number != lucky_number and loop_count <

Rust猜数字之产生神秘数字

产生一个神秘数字 接下来,我们需要产生一个神秘数字.Rust在它的标准库中还没有包括随机数函数.然而,Rust团队确实提供了一个一个rand crate.'crate'是Rust代码的一个包.我们已经构建了一个二进制crate,是可执行的.rand是一个库crate'library crate',包括可以被其他程序使用的代码. 使用外部crate是Cargo真正的闪光点.在我们可以使用rand写代码之前,我们需要修改我们的Cargo.toml.打开该文件,并在底部添加下列代码: [depende

*循环-20. 猜数字游戏

1 /* 2 * Main.c 3 * C20-循环-20. 猜数字游戏 4 * Created on: 2014年8月18日 5 * Author: Boomkeeper 6 *********测试部分通过********* 7 */ 8 9 #include <stdio.h> 10 11 int main(void){ 12 13 int random = 0,N = 0;//系统输入的随机数和最大猜测次数 14 int in = 0;//每次输入的猜测 15 int count = 0

循环-20. 猜数字游戏(15)

1 #include<iostream> 2 using namespace std; 3 int main(){ 4 int a,n,g,i=1; 5 cin>>a>>n; 6 while(cin>>g){ 7 if(i>n||g<0){ 8 cout<<"Game Over"<<endl; 9 break; 10 } 11 else{ 12 if(g>a) 13 cout<<&qu

「Linux学习」之for循环if判断猜数字小游戏

vim /root/ip.sh #! /bin/bash read -p '请输入您要测试的ip: ' ip ping -c 2 $ip &> /dev/null if [ $? -eq 0 ];then echo 可以通信 else echo 不可以通信 创建猜数字小游戏 vim /root/num.sh #! /bin/bash num1=$[$RANDOM%10] read -p ' 请您输入一个0~9之间的数字 :' if [ $num1 -eq $num2 ];then echo

Python3基础学习-while循环实例- 猜数字游戏

需求: 猜数字游戏, 要求如下: 给个数字, 比如是66. 让用户一直猜,直到猜对退出. 中间输入q或Q也能退出 如果猜大了,提示用户猜小一点; 如果猜小了,提示用户猜大一点; likely = 66 while True: guest_num = input("请输入你猜测的数字[q|Q退出]: ") if guest_num.upper() == "Q": break elif int(guest_num) > likely: print("你猜

第一个c语言实现的猜数字游戏

#include <stdio.h> #include <Windows.h> #include <stdlib.h> #include <stdio.h> #include <Windows.h> #include <stdlib.h> #include <time.h> void output() { printf("*********************  欢迎玩猜数字游戏   ************

通过游戏学python 3.6 第一季 第三章 实例项目 猜数字游戏--核心代码--猜测次数--随机函数和屏蔽错误代码--优化代码及注释 可复制直接使用 娱乐 可封装 函数

1 #猜数字--核心代码--猜测次数--随机函数和屏蔽错误代码---优化代码及注释 2 3 import random 4 number = random.randint(1,99)#设定答案(可以假设成年龄吧) 5 amount = random.randint(3,8) #设定猜测次数 6 print('本次游戏次数为',amount,'次') 7 8 count = 0 #设定初始次数 9 while count <= amount: #条件成立无限循环 10 try: 11 guess