用Elixir中的刽子手游戏中的字母替换破折号

时间:2016-12-17 01:15:50

标签: elixir

我正在尝试在Elixir中实现hangman,我对如何用正确猜到的字母(适当的索引)替换占位符字中的短划线感到困惑。我试图使用slice/3replace/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

1 个答案:

答案 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"

当然,要处理多次出现,代码需要更新,但我希望主要的想法是明确的。