2016-12-17 8 views
1

私はエリクシールでハングマンを実装しようとしていますが、正しく推測された文字(適切なインデックス)を使ってプレースホルダワードのダッシュをどのように置き換えるべきか混乱しています。私は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 

私も含まれていた(guess_word/2check_match/2を呼び出します。ここでは、ユーザが入力した文字が秘密の言葉である、と私はダッシュを含むプレースホルダにその文字を挿入しようとするところならば、私はチェック機能があります私のゲームロジック):

おそらく私は、プログラムの間違った部分でダッシュを置き換えようとしています。正しいインデックスでダッシュを置き換えるにはどうすればいいですか?

例えば、秘密の言葉がfooである:http://pastebin.com/JkSefm1S

答えて

1

見つけるために、文字列を検索する:

_ _ _

ユーザーはここf

f _ _

完全なコードを推測1つの手紙が使用される可能性がありますRegex.run/3および/またはRegex.scan/3return: :indexオプションがあります。

iex> word = "barbaz" 
iex> letter = "b" 
iex> Regex.scan ~r/#{letter}/, word, return: :index 
[[{0, 1}], [{3, 1}]] 

ものは{index, length}を表すタプルです:単語の文字の多くの出現があるかもしれないので、scanはここより良い候補であるように思われます。これで、ユーザーに表示する単語を変更できます。想像して、ユーザーがすでに"a"は開いていた、と彼女は今"r"を推測:もちろん

iex> guessed = "_a__a_" 
iex> letter = "r" 
iex> [[{idx, _}]] = Regex.scan ~r/#{letter}/, word, return: :index 
[[{2, 1}]] 

iex> String.slice(guessed, 0..idx-1) <> 
...>  letter <> 
...>  String.slice(guessed, idx+1..String.length(guessed)) 
"_ar_a_" 

、複数の発生を処理するために、更新されるために必要なコードを、しかし、主なアイデアは、私は願って、明らかです。

関連する問題