You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rust猜数字游戏:显式break语句无法终止循环问题

猜数字游戏重玩逻辑异常的修复

问题原因

当前代码在用户选择重玩时使用了break game();,这会递归调用game()函数。当新的游戏实例结束(用户选no),程序会回到上一层game()的game_loop循环中继续执行,导致出现额外的“Input your guess:”提示,无法正常退出程序。场景1的异常输出就是因为递归调用后,上层循环未终止导致的。

修复方案

移除递归调用,改为让game()函数返回布尔值表示用户是否想继续玩,然后在main()函数中通过循环控制游戏的重启。

修改后的代码

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

// 修改函数返回值:true表示重玩,false表示退出
fn game() -> bool {
    println!("GUESS THE NUMBER!");

    let secret_number = rand::thread_rng().gen_range(1..=100);
    println!("{secret_number}");

    'game_loop: loop {
        println!("Input your guess: ");
        let mut user_guess = String::new();
        io::stdin()
            .read_line(&mut user_guess)
            .expect("Failed to read line");
        let user_guess: u32 = match user_guess.trim().parse() {
            Ok(num) => num,
            Err(_) => {
                println!("Please type a number!");
                continue;
            }
        };

        match user_guess.cmp(&secret_number) {
            Ordering::Less => println!("To small!"),
            Ordering::Greater => println!("To big!"),
            Ordering::Equal => {
                println!("You win!");
                println!("Would you like to play again? (Y/N)");

                loop {
                    let mut user_answer = String::new();
                    io::stdin()
                        .read_line(&mut user_answer)
                        .expect("Failed to read line");
                    let user_answer = user_answer.trim().to_lowercase();
                    if user_answer == "n" || user_answer == "no" {
                        return false;
                    } else if user_answer == "y" || user_answer == "yes" {
                        return true;
                    } else {
                        println!("Please enter a valid answer.");
                        println!("Would you like to play again? (Y/N)");
                        continue;
                    }
                }
            }
        }
    }
}

fn main() {
    // 主循环控制游戏重启
    loop {
        let play_again = game();
        if !play_again {
            break;
        }
    }
}

修改说明

  1. 将game()函数改为返回bool类型,用返回值明确用户的重玩意愿
  2. 重玩逻辑中移除递归调用,直接通过返回值告知main()是否需要重启游戏
  3. main()函数添加循环,根据game()的返回值决定是否启动新的游戏实例

修改后无论是否输入过无效指令,用户选择“no”时都会直接终止所有循环,正常退出程序。

内容的提问来源于stack exchange,提问作者Ruben Villalvazo Manríquez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 19:07:32