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  

このコードは、プレーヤーが variable に隠されているパスワードから正しい文字を推測したかどうかをチェックし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

If/Then ロジックが間違っている

コードは次のとおりです。

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

によって取得された行全体に一致する文字は 1 つもないため、通常、条件は false になります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 に答える