将字符串显示为下划线但保持值

时间:2011-10-20 09:51:58

标签: c# regex windows-phone-7

我正在写一个基本的刽子手游戏。我想将字符串Word存储为用户可以找到的单词。我的问题是我希望将这个单词显示为下划线(就像你在纸上做的那样),但保留它的字符串值。我的一位朋友说这可以通过Regex完成,但研究它似乎并没有帮助我。

5 个答案:

答案 0 :(得分:4)

正如Farinha所建议,但使用HashSet

一些重点:我们使用的是HashSet,因为最后这些字母可以有两种状态:已发现(存在于HS中)或未发现(不存在)。我们将HashSet作为参数StringComparer.InvariantCultureIgnoreCase初始化,因为我们认为Ll是相同的。要使用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();