我的目标是制作一个刽子手游戏。我写了类似的代码:
c = []
players_guess = gets
b = "example"
b.scan(/./) {|letter| c << letter}
c.each do |letter|
if letter == players_guess
puts letter
else
puts "*"
end
end
代码检查玩家是否从隐藏在变量c
中的密码中猜出了正确的字母,然后显示隐藏在*
后面的密码,并且只显示猜测的字母。但是当我运行程序时,结果始终相同,显示players_guess
,然后给出7 *
。这有什么不对?
答案 0 :(得分:1)
这是一个简单的方法来做你想要的事情:
word = "example"
puts "Type a letter: "
guess = gets.chomp
puts word.tr("^#{guess}", "*")
这使用String#tr
方法将猜测替换为*
。
如果您输入e
,则输出为e*****e
。
答案 1 :(得分:0)
您的代码如下:
c.each do |letter|
if letter == players_guess
puts letter
else
puts "*"
end
end
条件通常是错误的,因为没有一个字母可能与gets
检索到的整行相匹配。因此,您会在 c 中为每个字母打印一个星号。
你可以在这里做几件事。
如果字符串相等,只显示字符串。
puts players_guess if b == players_guess.chomp
在循环中使用计数器索引数组或字符串。
将两个字符串拆分成一个数组,并比较数组,打印匹配的字母或不匹配的星号。
c.each_with_index do |char, idx|
puts char == players_guess.scan(/./)[idx] ? char : '*'
end