1

在下面的代码中,我试图获取数组中出现的字母guesssecret_word索引,将索引存储在数组中indices,然后使用indices将相同的字母插入另一个数组user_word,而不会干扰可能已经存在的其他字母user_word

if secret_word.include?(guess) #secret_word is an array of chars. guess is a char.
  indices = Array.new
  indices<< secret_word.each_index.select{ |letter| secret_word[letter] == guess } #verified that this array fills correctly
  indices.each do |e|
    user_word[e] = guess
  end
end

错误消息暗示索引的每个元素都是一个数组,而不是预期的 fixnum。它不会让我使用索引中的元素来索引user_word. 帮助?

4

2 回答 2

2

.select返回一个您尝试添加为元素indices的数组,因此您拥有一个包含一个元素的数组数组,正确的方法:

indices = secret_word.each_index.select{ |letter| secret_word[letter] == guess }

或者

indices += ...

但我会做这样的事情:

user_word =
  user_word.split("") 
    .zip(secret_word)
    .map { |u, s| s == guess ? s : u }
    .join
于 2013-09-30T03:37:02.427 回答
0

游戏时间!

DOSRW="g ooxdenql9qdc9uhkdobjq sdcnmj9xdnqbghcdsnrs9qdrsxkhrsdbg hqdataak9dbyqdghbbtodonmxs hkdlsy"

def guess_the_word
  words = ''
  DOSRW.each_byte {|b| words += b.succ.chr}
  words = words.gsub('e',' ').gsub(':','e').split
  @sw = words[rand(words.size)].chars
  fini = 2**@sw.size - 1
  so_far(v=0)
  loop do
    print 'Guess a letter: '
    letter = gets.chomp.downcase
    b = @sw.inject('') {|w,c| w + (c == letter ? '1' : '0')}.to_i(2)
    b > 0 ? (puts "#{b.to_s(2).chars.map(&:to_i).inject(&:+)} of those!") : (puts "Sorry")
    v |= b
    so_far(v)
    break if v == fini 
  end  
  puts "Congratulations!"  
end

def so_far(v)
  s = v.to_s(2)
  s = ((?0 * (@sw.size-s.size)) + s).chars   
  puts "#{@sw.zip(s).inject('') {|m,e| m + (e.last=='1' ? e.first : '-')}}"
end

请注意,为了跟踪当前选择的b字母y(游戏继续进行,直到所有y位都等于 1:break if v == fini

于 2013-09-30T07:35:58.050 回答