2011-10-20 6 views
3

私は基本的なハングマンゲームを書いています。私は、文字列Wordをユーザーが見つける単語として保存したい。私の問題は、この単語をアンダースコア(あなたが紙掛け人のように)で表示したいが、文字列の値を保持したいということです。私の友人は、これはRegexを介して行うことができると述べたが、それを研究することは私を助けてくれないようだ。文字列をアンダースコアで表示しますが、値を保持する

答えて

4
Farinhaによって示唆されるように

が、HashSet

一部importangポイントを使用している、と言います状態:発見された(HS内に存在する)、発見されない(存在しない)。パラメータStringComparer.InvariantCultureIgnoreCaseとしてHashSetを渡すと、Llが同じものとみなされるため、初期化します。 StringComparer.InvariantCultureIgnoreCaseを使用するには、HashSet<char>(HSはchars)の代わりにHashSet<string>(HSはstrings)を使用する必要があります。 discovered.Contains()を使用している場合だから我々はToString

static string ConvertWord(string word, HashSet<string> discovered) 
{ 
    StringBuilder sb = new StringBuilder(word.Length); 

    foreach (char c in word) 
    { 
     if (discovered.Contains(c.ToString())) 
     { 
      sb.Append(c); 
     } 
     else 
     { 
      sb.Append('_'); 
     } 
    } 

    return sb.ToString(); 
} 

HashSet<string> discovered = new HashSet<string>(StringComparer.InvariantCultureIgnoreCase); 

// The "secret" word 
string word = "Hello world"; 

// How to add letters to the ones discovered 
discovered.Add("l"); 

// The word ready to be shown 
string convertWord = ConvertWord(word, discovered); 
我々ははるかに少ない文字数でConvertWordを行っている可能性

stringccharを変換する必要がありますが、今日はそれは十分:-)

大丈夫です。 ..私はC#4.0で、あなたの例をあげる:

static string ConvertWord(string word, HashSet<string> discovered) 
{ 
    return string.Concat(word.Select(p => discovered.Contains(p.ToString()) ? p : '_')); 
} 
+0

あなたの答えを試してみると、HashSetに 'タイプ/ NSが見つかりません'というエラーが表示されています。私はsys.collections.genericを参照しています。 – MaxWillmo

+0

@MaxWillmoどのバージョンのC#を使用していますか?これはC#/。NET> = 3.5用であり、 'System.Core'参照に追加する必要があります。 – xanatos

+0

@MaxWillmo Test here http://ideone.com/Mc2oM – xanatos

0

なぜ正規表現を使用した「アンダースコア」として

+0

良いアイデアを、私は「_を変更したいとき、それは動作しません。 "発見された手紙のために。 – MaxWillmo

+0

@MaxWillmo - 私は今、ウルポイントを取得します。 Windowsアプリケーションですか? – Boomer

+0

WP7アプリ。 Farinhaは強い答えを与えて、私はそれを使用するつもりです。ありがとうございます。 – MaxWillmo

1

を自分のパスワード文字を設定し、その後、テキストボックスを使用し、パスワードとしてそのエントリタイプを持っていないことは良いアプローチのように見えるしていません。私は代わりに単語をつかみ、それを文字に分解してDictionary<char,bool>を作ります。boolは文字がまだ発見されているかどうかを示します。その後、Dictionaryの見た目と、各項目の文字が見つかった場合はchar、そうでない場合はアンダースコアが表示されます。

+0

華麗な私はそれを与えるだろう。どうもありがとう。 – MaxWillmo

+1

'HashSet 'を使うこともできます。ここで、セット内の文字の存在は、それが発見されたかどうかを示します。 – Sven

1

これがまさにあなたが望むものなのかどうかはわかりませんが、参考にしてください。

ゲームはsedとechoによってシミュレートされました。もちろん、秘密の言葉に変数を使うことができ、平文としてエコーすることはできません。最後に文字が2を持つことができるので、我々はHashSetを使用している:

は私の秘密の言葉は、「メモリ」

#user gives a letter "a" 

kent$ echo "memory"|sed 's/[^a]/_/g' 
______ 

#user gives a letter "r" 
kent$ echo "memory"|sed 's/[^ar]/_/g' 
____r_ 

#user gives a letter "m" 
kent$ echo "memory"|sed 's/[^arm]/_/g' 
m_m_r_ 

#user gives a letter "o" 
kent$ echo "memory"|sed 's/[^armo]/_/g' 
m_mor_ 

#user gives a letter "x" 
kent$ echo "memory"|sed 's/[^armox]/_/g' 
m_mor_ 

#user gives a letter "y" then "e" 
kent$ echo "memory"|sed 's/[^armoxy]/_/g' 
m_mory 

kent$ echo "memory"|sed 's/[^armoxye]/_/g' 
memory 
0

を私は正規表現を気にしないだろう - あなたは表現する文字の配列を取るためにかなり単純な関数を書くことができます推測がなされ、必要に応じて単語の表現を返します。

string word = "AMBULANCE"; 
    public string Hangman(char[] guesses) 
    { 
     char[] output = new char[word.Length]; 
     for (int i = 0; i < word.Length; i++) 
     { 
      if (guesses.Contains(word[i])) 
      { 
       output[i] = word[i]; 
      } 
     } 
     return new String(output).Replace('\0','_'); 
    } 

、その後のようなもの使用してそれを呼び出す:

 char[] guesses = new char[] { 'A', 'E' }; 
     Console.WriteLine(Hangman(guesses)); 
     Console.ReadLine(); 
関連する問題