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; } } }
修改说明
- 将
game()函数改为返回bool类型,用返回值明确用户的重玩意愿 - 重玩逻辑中移除递归调用,直接通过返回值告知
main()是否需要重启游戏 main()函数添加循环,根据game()的返回值决定是否启动新的游戏实例
修改后无论是否输入过无效指令,用户选择“no”时都会直接终止所有循环,正常退出程序。
内容的提问来源于stack exchange,提问作者Ruben Villalvazo Manríquez
相关产品推荐
相关产品推荐

