我正在写一个基本的刽子手游戏。我想将字符串Word存储为用户可以找到的单词。我的问题是我希望将这个单词显示为下划线(就像你在纸上做的那样),但保留它的字符串值。我的一位朋友说这可以通过Regex完成,但研究它似乎并没有帮助我。
答案 0 :(得分:4)
正如Farinha所建议,但使用HashSet
一些重点:我们使用的是HashSet
,因为最后这些字母可以有两种状态:已发现(存在于HS中)或未发现(不存在)。我们将HashSet
作为参数StringComparer.InvariantCultureIgnoreCase
初始化,因为我们认为L
和l
是相同的。要使用StringComparer.InvariantCultureIgnoreCase
,我们必须使用HashSet<string>
(string
s的HS)而不是HashSet<char>
(char
的HS)。因此,在使用discovered.Contains()
时,我们必须使用c
char
中的string
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,但今天就足够了: - )
好的......我会在C#4.0中给你一个例子:
static string ConvertWord(string word, HashSet<string> discovered)
{
return string.Concat(word.Select(p => discovered.Contains(p.ToString()) ? p : '_'));
}
答案 1 :(得分: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() : "_";
}
答案 2 :(得分:1)
我不确定这是不是你想要的,但你可以看看它是否有用。
游戏由sed和echo模拟。当然,你可以使用变量作为秘密单词,而不是将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
答案 3 :(得分:0)
为什么不使用文本框并将其条目类型作为密码,然后将其密码字符设置为“下划线”
答案 4 :(得分: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();