Ruby猜谜游戏第2、3轮逻辑错误求助:正确答题仍判失败
Ruby猜谜程序第2、3轮问题修复方案
问题根源
- 变量作用域不匹配:你在
answer_my_question函数里定义的out_of_guesses是局部变量,外部判断时用的是第一轮游戏中定义的同名变量,两者完全无关。不管第二轮、第三轮有没有猜对,外部判断的都是第一轮的状态,这就导致即使答对也会触发"用完次数"的逻辑。 - 大小写处理不完整:只有第一次输入用了
downcase转小写,第二次、第三次输入没有转,用户输入大写时还是会匹配失败。 - 函数无返回值:函数没有把内部的猜测结果传递给外部,外部无法获取真实的答题状态。
修复步骤
- 让
answer_my_question函数返回用户是否猜对,外部通过接收返回值来判断计分。 - 所有用户输入都添加
downcase,确保大小写完全不敏感。 - 外部调用函数时,用变量接收返回结果,替换原来的全局变量判断逻辑。
修正后的完整代码
points = 0 puts "欢迎来到我的猜谜游戏!本次游戏共有3轮题目。" puts "每轮在3次机会内答对可获得1分" puts "请按回车键继续" gets puts "第1轮" puts "我正在想一个1到100之间的随机数,你有3次机会猜对它" random_number = rand(1 .. 100) guess = "" guess_count = 0 out_of_guesses = false while guess != random_number and !out_of_guesses if guess_count == 0 puts "输入你的猜测:" guess = gets.chomp.to_i guess_count += 1 elsif guess_count == 1 if random_number > 50 puts "答错了!再试一次" puts "提示1:" puts "我的数比50大" elsif random_number < 50 puts "答错了!再试一次" puts "提示1:" puts "我的数比50小" end puts "输入你的第二次猜测:" guess = gets.chomp.to_i guess_count += 1 elsif guess_count == 2 if guess > random_number diff1 = guess - random_number puts "答错了!再试一次" puts "提示2:" puts "我的数和你的猜测相差#{diff1}" elsif guess < random_number diff2 = random_number - guess puts "答错了!再试一次" puts "提示2:" puts "我的数和你的猜测相差#{diff2}" end puts "输入你的最后一次猜测:" guess = gets.chomp.to_i guess_count += 1 else out_of_guesses = true end end if out_of_guesses puts "答错了!" puts "你已经用完了所有猜测机会,本轮得0分。" puts "我想的数是#{random_number}" else points += 1 puts "恭喜!你获得1分!" puts "你用了#{guess_count}次就猜对了我想的数#{random_number}。" end puts "请按回车键继续" gets # 修改后的函数:返回是否猜对 def answer_my_question(question, right_answer) answer = "" out_of_guesses = false guess_count = 0 guess_limit = 3 puts "你有3次机会回答这个问题,本轮没有提示" puts question while answer != right_answer.downcase and !out_of_guesses if guess_count == 0 puts "输入你的第一次回答" answer = gets.chomp.downcase guess_count += 1 elsif guess_count < guess_limit - 1 puts "答错了!再试一次" answer = gets.chomp.downcase guess_count += 1 else puts "输入你的最后一次回答" answer = gets.chomp.downcase guess_count += 1 out_of_guesses = true if answer != right_answer.downcase end end # 返回是否猜对 return !out_of_guesses end puts "第2轮" # 接收函数返回的结果 round2_correct = answer_my_question("西班牙的首都是哪里?", "madrid") if !round2_correct puts "答错了!" puts "你已经用完了所有猜测机会,本轮得0分" else points += 1 puts "恭喜!你获得1分!" puts "你答对了这个问题。" end puts "请按回车键继续" gets puts "第3轮" round3_correct = answer_my_question("牙买加属于哪个大洲?", "north america") if !round3_correct puts "答错了!" puts "你已经用完了所有猜测机会,本轮得0分" else points += 1 puts "恭喜!你获得1分!" puts "你答对了这个问题。" end puts "请按回车键继续" gets puts "游戏结束!你最终获得#{points}分"
额外说明
- 函数里调整了循环条件,原来的逻辑会让第三次输入直接进入"用完次数",现在改为先接收第三次输入再判断是否正确,更符合预期。
- 所有提示文本已翻译成中文,贴合使用习惯。
内容的提问来源于stack exchange,提问作者Ema
相关产品推荐
相关产品推荐

