如何屏蔽与预期不符的字母?

时间:2012-12-19 01:48:11

标签: ruby restrictions

我的目标是制作一个刽子手游戏。我写了类似的代码:

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 *。这有什么不对?

2 个答案:

答案 0 :(得分:1)

这是一个简单的方法来做你想要的事情:

word = "example"
puts "Type a letter: "
guess = gets.chomp
puts word.tr("^#{guess}", "*")

这使用String#tr方法将猜测替换为*

如果您输入e,则输出为e*****e

答案 1 :(得分:0)

您的If / Then逻辑错误

您的代码如下:

c.each do |letter|
  if letter == players_guess
    puts letter
  else
    puts "*"
  end
end

条件通常是错误的,因为没有一个字母可能与gets检索到的整行相匹配。因此,您会在 c 中为每个字母打印一个星号。

修复代码的一些选项

你可以在这里做几件事。

  1. 如果字符串相等,只显示字符串。

    puts players_guess if b == players_guess.chomp
    
  2. 在循环中使用计数器索引数组或字符串。

  3. 将两个字符串拆分成一个数组,并比较数组,打印匹配的字母或不匹配的星号。

    c.each_with_index do |char, idx|
      puts char == players_guess.scan(/./)[idx] ? char : '*'
    end