我试图想出一种方法来将两个数组过滤成一个基于猜测它们中的字母..所以基本上是刽子手。但如果我有
word_array = ["b", "u", "s", "b", "o", "i"]
hidden_array = Array.new(word_array.length, "-")
p hidden_array
如果“b”被猜到,我想打印到控制台[“b”,“ - ”,“ - ”,“b”,“ - ”,“ - ”]。什么是一个很好的初学者方式来创建这个将随时间变化的数组?它应该是哈希吗?谢谢!
答案 0 :(得分:6)
到目前为止,所有解决方案都围绕着数组,但不要忘记字符串基本上是一个字符数组。只需使用字符串:
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= n; j++) {
try {
a[i][j] = scanner.nextInt();
} catch (java.util.NoSuchElementException e) {
// e.printStackTrace();
}
}
}
String#tr
方法将第一个参数中的所有字母转换为第二个参数中的映射,因此您可以执行ROT13,简单加密等操作,或者在这种情况下使用否定功能{{1} }反转第一组并替换所有不匹配的字符。
答案 1 :(得分:3)
您可以跟踪数组中找到的字母,并制作一种方法来进行打印
word_array = ["b", "u", "s", "b", "o", "i"]
found_letters = []
def hangman_prompt(found_letters)
word_array.map do |char|
found_letters.include?(char) ? char : "-"
end.join(" ")
end
然后你可以在输入循环中使用它,如下所示:
loop do
puts hangman_prompt(found_letters)
puts "what is your guess?"
input = gets.chomp
if word_array.include? input
found_letters << input
end
end
我在这里使用Array#map
创建了一个相同长度的新数组。每个原始数组项都传递给块,这决定了如何将它们复制到新数组中。
答案 2 :(得分:2)
一种方法:
word_array = ["b", "u", "s", "b", "o", "i"]
word_array_i = word_array.map.with_index { |e,i| [e,i] }
#=> [["b", 0], ["u", 1], ["s", 2], ["b", 3], ["o", 4], ["i", 5]]
p hidden_array = Array.new(word_array.length, "_")
until hidden_array == word_array
puts 'make a guess'
guess = gets.chomp
if word_array.include? guess
puts 'correct guess'
ar = word_array_i.select { |arr| arr.first == guess }
.flatten.select { |e| e.class == Fixnum }
ar.each { |e| hidden_array[e] = guess }
else
puts 'incorrect guess'
end
p hidden_array
puts
end
puts 'game complete'
研究here Array#include?
,Enumerator#with_index
的主要方法。
答案 3 :(得分:2)
我不会使用数组,只是字符串。
<强>代码强>
def replace_underscores(word, hidden_word, guess)
word.scan(Regexp.new(guess)) { hidden_word[Regexp.last_match.begin(0)] = guess }
hidden_word
end
示例强>
word = "busboi"
hidden_word = "_" * word.length
#=> "______"
replace_underscores(word, hidden_word, "a") # guess "a"
#=> "______"
replace_underscores(word, hidden_word, "b") # guess "b"
#=> "b__b__"
replace_underscores(word, hidden_word, "r") # guess "r"
#=> "b__b__"
replace_underscores(word, hidden_word, "o") # guess "o"
#=> "b__bo_"
replace_underscores(word, hidden_word, "u") # guess "u"
#=> "bu_bo_"
replace_underscores(word, hidden_word, "s") # guess "s"
#=> "busbo_"
检查是否已猜到hidden_word:
def guessed?(hidden_word)
hidden_word.count('_').zero?
end
guessed?(hidden_word)
#=> false
让我们再猜一次。
replace_underscores(word, hidden_word, "i") # guess "i"
#=> "busboi"
guessed?(hidden_word)
#=> true
备注强>
我已经使用方法String#scan和每个匹配执行的块。在块中,使用类方法MatchData检索Regexp::last_match对象。 (或者,可以用全局变量$~
替换Regexp.last_match
。有关详细信息,请在Regexp搜索“特殊全局变量”。)方法MatchData.begin用于获取str
中字符的索引,将被猜到的字母替换。