2011-10-20 32 views
3

我正在写一个基本的hang子手游戏。我想存储一个字符串Word作为用户找到的单词。我的问题是,我想显示这个词作为下划线(就像你在一个纸hang子手中做的),但保持它的字符串值。我的一个朋友说这可以通过Regex完成,但研究它似乎并不能帮助我。显示字符串作为下划线但保持价值

回答

4

至于建议的Farinha,但使用HashSet

一些importang点:我们使用的是HashSet因为最终的字母可以有两个状态:发现(存在于HS中)或未发现(不存在)。我们将HashSet初始化为参数StringComparer.InvariantCultureIgnoreCase,因为我们认为Ll是同一件事。要使用StringComparer.InvariantCultureIgnoreCase,我们必须使用HashSet<string>(HS的string s)而不是HashSet<char>(HS的char s)。因此,使用discovered.Contains()当我们到cchar转换的stringToString

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在更短的字符,但今天它足够:-)

确定。 ..我给你举个例子,在C#4.0:

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

在尝试你的答案时,我得到了'无法找到类型/ NS'HashSet错误。我引用了sys.collections.generic。 – MaxWillmo

+0

@MaxWillmo您正在使用什么版本的C#?这是为C#/ .NET> = 3.5而且你必须添加到引用'System.Core' – xanatos

+0

@MaxWillmo测试在这里http://ideone.com/Mc2oM – xanatos

0

为什么不使用文本框,并有其条目类型的密码,然后将他的密码字符为“下划线”

+0

好主意,但是当我想改变它不会工作“_ “找到一封信。 – MaxWillmo

+0

@MaxWillmo - 我现在得到你的观点。是一个Windows应用程序? – Boomer

+0

WP7应用程序。 Farinha给出了一个强有力的答案,我将使用它。谢谢你的时间。 – MaxWillmo

1

使用正则表达式似乎不是一个好方法。相反,我会抓住这个词,把它分解成字符,然后构建一个Dictionary<char,bool>,其中bool表示该字母是否已被发现。然后你看看Dictionary,如果发现了这封信,每个项目都会显示char,如果没有,则显示下划线。

// build the Dictionary 
string originalWord = "Stack Overflow"; 
Dictionary<char, bool> dict = new Dictionary<char, bool>(); 
for(int i = 0; i < originalWord.Length; i++) 
    dict.Add(originalWord[i], false); 

// output the current state 
string current = ""; 
foreach(KeyValuePair<char, bool> pair in dict) 
{ 
    current += pair.Value ? pair.Key.ToString() : "_"; 
} 
+0

辉煌我会给你一个去。非常感谢。 – MaxWillmo

+1

你也可以使用'HashSet '这个集合中存在一个字符来表示它是否被发现。 – Sven

1

我不知道如果这正是你想要的,但如果它是有帮助的,你可以去看看。

游戏是由sed和echo模拟的。当然,你可以使用变量作为秘密词,而不是以纯文本形式回显。

说,我的秘密字是“记忆”

#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(); 
相关问题