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

本文关键字:保留 下划线 字符串 显示 | 更新日期: 2023-09-27 18:11:53

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

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

按照Farinha的建议,使用HashSet

一些重要的观点:我们使用HashSet是因为最后字母可以有两种状态:发现(存在于HS中)或未发现(不存在)。我们将HashSet初始化为参数StringComparer.InvariantCultureIgnoreCase,因为我们认为Ll是相同的东西。要使用StringComparer.InvariantCultureIgnoreCase,我们必须使用HashSet<string> (string s的HS)而不是HashSet<char> (char s的HS)。因此,当使用discovered.Contains()时,我们必须将c char转换为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 : '_'));
}

我不确定这是否正是你想要的,但你可以看看,如果它是有帮助的。

采用sed和echo对游戏进行模拟。当然,您可以使用variable作为秘密字,而不是使用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

使用Regex似乎不是一个好方法。相反,我会抓取单词,将其分解为字符,并构建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() : "_";
}

为什么不使用文本框并将其输入类型设置为password,然后将其密码字符设置为'underscore'

我就不使用regex了—您可以编写一个相当简单的函数来获取代表猜测的字符数组,并根据需要返回单词的表示形式:

    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();