将字符串显示为下划线,但保留值
本文关键字:保留 下划线 字符串 显示 | 更新日期: 2023-09-27 18:11:53
我正在编写一个基本的绞刑游戏。我想存储一个字符串Word作为要被用户找到的单词。我的问题是,我想显示这个词作为下划线(就像你在纸绞刑),但保持它的字符串值。我的一个朋友说这可以通过Regex完成,但研究它似乎没有帮助我。
按照Farinha的建议,使用HashSet
一些重要的观点:我们使用HashSet
是因为最后字母可以有两种状态:发现(存在于HS中)或未发现(不存在)。我们将HashSet
初始化为参数StringComparer.InvariantCultureIgnoreCase
,因为我们认为L
和l
是相同的东西。要使用StringComparer.InvariantCultureIgnoreCase
,我们必须使用HashSet<string>
(string
s的HS)而不是HashSet<char>
(char
s的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 : '_'));
}
我不确定这是否正是你想要的,但你可以看看,如果它是有帮助的。
采用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();