我正在尝试在Elixir中实现hangman,我对如何用正确猜到的字母(适当的索引)替换占位符字中的短划线感到困惑。我试图使用slice/3
和replace/4
函数而没有太多运气。这是一个函数,我检查用户输入的字母是否在密码中,并且我尝试将该字母插入包含破折号的占位符:
def check_match(word, guess) do
len = String.length(word)
str = String.duplicate("_ ", len)
if String.contains? word, guess do
{index, length} = :binary.match(word, guess)
#String.slice(str, index, len) <> guess <> String.slice(str, index+1, len)
IO.puts String.replace(str, " ", guess)
else
IO.puts str
end
end
我在check_match/2
内调用guess_word/2
(其中也包含我的游戏逻辑):
def guess_word(word, duration) do
gs = IO.gets("enter letter: ")
guess = String.trim(gs)
put(duration, guess)
update_letters()
check_match(word, guess)
if duration > 0 && !check_win(word, guess) do
guess_word(word, duration - 1)
end
end
也许我正在尝试替换程序错误部分的破折号。我如何在正确的索引处更换破折号?
例如,秘密词是foo:
_ _ _
用户猜测f
f _ _
此处的完整代码:http://pastebin.com/JkSefm1S
答案 0 :(得分:1)
要搜索字符串以查找字母,可以使用Regex.run/3
和/或Regex.scan/3
Object.equals
选项。由于单词中可能出现很多字母,return: :index
似乎是更好的候选人:
scan
这些是元组,代表iex> word = "barbaz"
iex> letter = "b"
iex> Regex.scan ~r/#{letter}/, word, return: :index
[[{0, 1}], [{3, 1}]]
。现在我们可以修改单词以显示给用户。想象一下,用户已经打开了{index, length}
,现在她猜到了"a"
:
"r"
当然,要处理多次出现,代码需要更新,但我希望主要的想法是明确的。