Отображать строку как подчеркивание, но сохраняя значение - PullRequest
3 голосов
/ 20 октября 2011

Я пишу основную игру палача.Я хочу сохранить строку Word как слово, которое будет найдено пользователем.Моя проблема в том, что я хочу отображать это слово в виде подчеркивания (как вы это делаете в бумажном палаче), но сохраняйте его строковое значение.Мой друг сказал, что это можно сделать с помощью Regex, но его исследование, похоже, мне не поможет.

Ответы [ 5 ]

4 голосов
/ 20 октября 2011

По предложению Фаринхи, но с использованием HashSet

Некоторые важные моменты: мы используем HashSet, потому что в конце буквы могут иметь два состояния: обнаружено (присутствует в HS) или не обнаружено (не присутствует) Мы инициализируем передачу HashSet в качестве параметра StringComparer.InvariantCultureIgnoreCase, поскольку считаем, что L и l - это одно и то же. Чтобы использовать StringComparer.InvariantCultureIgnoreCase, мы должны использовать HashSet<string> (HS string с) вместо HashSet<char> (HS char с). Так что при использовании 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 голос
/ 20 октября 2011

Использование регулярных выражений не кажется хорошим подходом.Вместо этого я бы взял слово, разбил его на символы и построил 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() : "_";
}
1 голос
/ 20 октября 2011

Я не уверен, что это именно то, что вы хотите, но вы можете посмотреть, если это полезно.

Игра была смоделирована 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
0 голосов
/ 20 октября 2011

Я бы не стал беспокоиться о регулярном выражении - вы можете написать довольно простую функцию, чтобы взять массив символов, которые представляют сделанные предположения, и вернуть представление слова по мере необходимости:

    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();
0 голосов
/ 20 октября 2011

Почему бы не использовать текстовое поле и ввести его тип записи в качестве пароля, а затем установить его символ пароля как 'подчеркивание'

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...