Расширение в игре «Угадай ржавчину» показывает странное поведение - PullRequest
0 голосов
/ 07 ноября 2018

Так что я расширяю игру в угадайку, чтобы спросить пользователя, хотят ли они снова играть. Если они наберут y, программа вернется в основной игровой цикл, а если они введут n, она просто выйдет из текущего цикла и программа завершится. Если они вводят что-то еще, теоретически это должно просто перейти на вершину цикла play_again и переназначить переменную yae_or_nay как то, что игрок вводит следующим. Но он этого не делает или, по крайней мере, выглядит так, как будто перезаписывает его неправильно. Я переназначаю переменную неправильно? Вот код (обратите внимание, что первая половина программы почти такая же, как в учебнике, но, поскольку программа такая короткая, я просто решил включить все это):

extern crate rand;

use std::io;
use std::cmp::Ordering;
use rand::Rng; // random number generation library from rand 

fn main() {
println!("Guessing game!\n");

let mut answer = rand::thread_rng().gen_range(1,101); 
'gameloop: loop {
    println!("Please print your guess:");

    let mut yae_or_nay = String::new();
    let mut guess = String::new();

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

    let guess : u32 = match guess.trim().parse() {
        Ok(num) => num,
        Err(_) => {
            println!("Not a number!");
            continue;
        }
    };

    match guess.cmp(&answer) {
        Ordering::Less => println!("Higher!"),
        Ordering::Greater => println!("Lower!"),
        Ordering::Equal => {
            println!("Correct! Would you like to play again? (y/n)");
            'play_again: loop {
                io::stdin().read_line(&mut yae_or_nay)
                    .expect("Failed to read line.");

                match yae_or_nay.trim() { // match against a string
                    "y" => {
                        answer = rand::thread_rng().gen_range(1,101);
                        println!("Playing again...");
                        continue 'gameloop;
                    },
                    "n" => {
                        println!("Thanks for playing! Exiting now.");
                        break
                    },
                    _ => {
                        println!("what? You entered {}", &yae_or_nay);
                        continue 'play_again
                    }
                };
            }
        }
    }
}
}

А вот фрагмент вывода консоли:

46
Correct! Would you like to play again? (y/n)
i
what? You entered i

y
what? You entered i
y

n
what? You entered i
y
n

 . // period here for formatting sake, not actually in console

Как видите, способ переназначения моей программы yae_or_nay кажется довольно странным. Кто-нибудь знает, что происходит? Заранее спасибо за любую помощь.

1 Ответ

0 голосов
/ 07 ноября 2018

Проблема в том, что вы никогда не очищаете yae_or_nay, и io::stdin().read_line(&mut yae_or_nay) будет добавлять к строке, а не заменять ее содержимое.

Чтение всех байтов, пока не будет достигнут символ новой строки (байт 0xA), и добавьте их в предоставленный буфер.

Либо вы должны сделать

yae_or_nay.clear();

прежде чем вы прочитаете в него, или, вероятно, лучше было бы переместить объявление в

'play_again: loop {
    let mut yae_or_nay = String::new();
    io::stdin().read_line(&mut yae_or_nay)
        .expect("Failed to read line.");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...