0

我的目标是创造一个刽子手游戏。我写了类似这样的代码:

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,然后显示隐藏在*s 后面的密码,只显示猜到的字母。但是当我运行程序时,结果总是一样的,它显示players_guess,然后给出 7 *。这里有什么问题?

4

2 回答 2

1

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

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

这使用该String#tr方法将除猜测之外的所有内容替换为*.

如果您键入,输出e将是e*****e.

于 2012-12-19T02:24:33.097 回答
0

你的如果/那么逻辑是错误的

您的代码如下:

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
    
于 2012-12-19T02:15:00.700 回答