Logo
Section 1 / 7

索取更多字母

学习如何在 Ruby 中使用循环和嵌套语句。

检查点

索取更多字母

学习如何在 Ruby 中使用循环和嵌套语句。

我们将扩展游戏,使其完成以下功能:

  • 请求输入一个字母。
  • 对输入的字母给出反馈。
  • 再次请求输入一个字母。
  • 重复这些步骤,直到玩家输入“stop”。
1hidden_word = "hello" 2 3puts "_ _ _ _ _" 4puts 5 6loop do 7 8 print "请输入一个字母: " 9 10 answer = gets 11 answer = answer.chomp.downcase 12 13 if answer == 'stop' 14 exit 15 end 16 17 if answer.length > 1 18 puts "你只能输入一个字母!" 19 elsif answer.empty? 20 # 忽略空输入 21 elsif hidden_word.include?(answer) 22 puts "这个字母在隐藏单词中" 23 else 24 puts "无效的字母" 25 end 26 27end

循环实现

我们在第6行添加了 loop do,并在第25行添加了 end。

do 和 end 是 Ruby 识别的关键字,它们包围一段称为 代码块 的指令序列。
loop 的作用是无限重复执行代码块中的所有指令,永远不会停止。下图展示了一个简单的代码片段,它会无限显示 hello。

...
循环流程图

箭头表示代码块从 do 开始,到 end 结束,同时也展示了 loop 导致的无限重复。

循环终止

为了防止游戏永远运行下去,我们还添加了第13至15行的代码。

在检查输入是否有效之前,程序先判断玩家是否输入了 stop。如果是,则执行 exit 命令,指示代码解释器停止整个程序运行。

第13行展示了 Ruby 编写代码的简洁性。双等号 == 是发送给变量 answer 的消息。answer 是一个字符串,该消息的作用是检查其内容是否与等号右边的值(此处为 stop)相同。因此,我们可以写成 answer == 'stop',而无需写成 answer.== 'stop'。

测试我们的实现

点击“运行”按钮来执行代码。

No configuration found for ID: c3426f677dc3f71da52fe84e3c31f88d76232b8f057109048327aaeb172df2b2

程序将产生如下输出:

1root@educative:/usercode# ruby hangman.rb 2_ _ _ _ _ 3 4请输入一个字母: h 5这个字母在隐藏单词中 6请输入一个字母: e 7这个字母在隐藏单词中 8请输入一个字母: stop

程序确实提示我们输入字母,我们依次输入了 h、e 和 stop。输入 stop 后游戏按预期结束。

但如果我们在输入时什么也不输入就按回车键,会发生什么?

1root@educative:/usercode# ruby hangman.rb 2_ _ _ _ _ 3 4请输入一个字母: stop

奇怪的是,当我们什么也不输入时,却得到了正面反馈。这显然不合逻辑。

为什么会这样?我们应该如何处理这种情况?

原因如下:

  1. 第17行的检查(拒绝多于一个字母的输入)会接受空输入,因为零个字母少于两个字母。
  2. 第19行的检查(判断输入字母是否在隐藏词中)也会接受空输入。可以这样理解:问题是“没有任何内容是否属于这个词?”答案是“是的,没有内容当然属于这个词”。

正确的行为应该是强制要求输入且仅输入一个字母。

忽略空输入

如果我们希望忽略空输入,必须在检查字母是否存在于单词中之前进行处理。

1hidden_word = "hello" 2 3puts "_ _ _ _ _" 4puts 5 6loop do 7 8 print "请输入一个字母: " 9 10 answer = gets 11 answer = answer.chomp.downcase 12 13 if answer == 'stop' 14 exit 15 end 16 17 if answer.length > 1 18 puts "你只能输入一个字母!" 19 elsif answer.empty? 20 # 忽略空输入 21 elsif hidden_word.include?(answer) 22 puts "这个字母在隐藏单词中" 23 else 24 puts "无效的字母" 25 end 26 27end

我们在第19行新增了一个条件:answer.empty?。

这段代码的意思是:“向 answer(包含输入内容的字符串)发送 empty? 消息”。字符串理解这个消息,表示检查其内容是否为空(即是否不包含任何字符)。当字符串为空时,由于第19和20行之间没有其他代码,因此不会执行任何操作。

尝试运行

点击“运行”按钮来执行代码。

No configuration found for ID: 5ea7df299553d57ae74149d072989a8df4b5f8889468a78da6460b6a89e77b2d

现在程序的行为如下:

1root@educative:/usercode# ruby hangman.rb 2_ _ _ _ _ 3 4请输入一个字母: 5请输入一个字母: 6请输入一个字母: 7请输入一个字母: stop

我们得到了期望的行为:第一次输入时什么也没输入,系统立即再次询问。我们没有继续推进,只是测试了这一行为,最终通过输入 stop 停止了游戏。

Quiz

单选题

在 Ruby 中,我们可以用来多次重复执行某段代码的写法是什么?

1 / 4

入门

挑战:字符计数器