List [i]. Замена в цикле for не возвращает строку - PullRequest
0 голосов
/ 28 января 2019

Попытка сделать палача (я все еще новичок), и программа выбирает случайное слово из слова текстового файла ==>, превращенного в массивы.И я должен поместить это в ярлык, в то время как текстовая метка изменена на то, что в letterlist.Дело в том, что на этикетке не отображается что-либо , и я не могу понять, почему.

Так что цикл for является модификатором, и когда он модифицировал каждую строкув списке должно возвращаться слово с правильной буквой или "_".

Сначала я попробовал выполнить: letterlist[i] = Letter или letterlist[i] = "_", но произойдет, если я наберу правильную буквуэто покажет только это письмо.

Например: word = "pen".Если я набрал «p», это привело бы к «ppp».

letterlist = new List<string>();

char[] wordarray = woord.GetWordcharArray(); //word in charArrays
string newwordstring = new string(wordarray);

for (int i = 0; i < wordarray.Length; i++)
{
    letterlist.Add(" "); //adds empty strings in list with the length of the word 
}

/*
 * For-loop for every string in List to check and modify if it's correct or not 
 */
for (int i = 0; i < letterlist.Count; i++)
{
    if (letterlist[i].Contains(Letter) && newwordstring.Contains(Letter)) //right answer: letter[i] = Letter
    {
        letterlist[i].Replace(Letter, Letter);
    }
    else if (letterlist[i].Contains(" ") && newwordstring.Contains(Letter)) //right answer: letter[i] = "" 
    {
        letterlist[i].Replace(" ", Letter);
    }
    else if (letterlist[i].Contains("_") && newwordstring.Contains(Letter)) //right answer: letter[i] = "_"
    {
        letterlist[i].Replace("_", Letter);
    }
    else if (letterlist[i].Contains(" ") && !newwordstring.Contains(Letter)) //wrong answer: letter[i] = "" 
    {
        letterlist[i].Replace(" ", "_");
    }
    else if (letterlist[i].Contains("_") && !newwordstring.Contains(Letter)) //wrong answer: letter[i] = "_"
    {
        letterlist[i].Replace(" ", "_");
    }
}

/*
 * empty += every modified letterlist[i]-string
 */
string empty = "";
foreach (string letter in letterlist)
{
    empty += letter;
}
return empty;

Новый код, но он показывает только «___» («_» столько раз, сколько букв имеет слово):

char[] wordarray = woord.GetWordcharArray(); //word in charArrays
string newwordstring = new string(wordarray); //actual word
string GuessedWord = new string('_', newwordstring.Length);//word that shows in form

bool GuessLetter(char letterguess)
{
   bool guessedright = false;

   StringBuilder builder = new StringBuilder(GuessedWord);

   for(int i = 0; i < GuessedWord.Length; i++)
   {
        if(char.ToLower(wordarray[i]) == Convert.ToChar(Letter))
        {
            builder[i] = wordarray[i];
            guessedright = true;
        }
    }

    GuessedWord = builder.ToString();
    return guessedright;
}

return GuessedWord;

1 Ответ

0 голосов
/ 28 января 2019

Прежде всего, обратите внимание, что строка C # является неизменяемой, что означает, что letterlist[i].Replace(" ", "_") не заменяет пробелы подчеркиванием.Он возвращает a новую строку, в которой пробелы были заменены подчеркиванием.
Поэтому вам следует переназначить этот результат:

letterlist[i] = letterlist[i].Replace(" ", "_");

Second, Replace(Letter, Letter) не будет много.

В-третьих, в вашем первом цикле for вы устанавливаете каждый элемент в letterlist на " ".
Тогда я не понимаю, почему вы ожидаете (вваш второй for цикл) letterlist[i].Contains("_") до когда-либо be true.

Наконец, я оставлю здесь кое-что, что вы могли бы найти интересным (особенно использование StringBuilder):

class Hangman
{
    static void Main()
    {
        Hangman item = new Hangman();
        item.Init();

        Console.WriteLine(item.Guessed); // ____

        item.GuessLetter('t'); // true
        Console.WriteLine(item.Guessed); // T__t

        item.GuessLetter('a'); // false
        Console.WriteLine(item.Guessed); // T__t

        item.GuessLetter('e'); // true
        Console.WriteLine(item.Guessed); // Te_t
    }

    string Word {get;set;}
    string Guessed {get;set;}

    void Init()
    {
        Word = "Test";
        Guessed = new string('_',Word.Length);
    }

    bool GuessLetter(char letter)
    {
        bool guessed = false;

        // use a stringbuilder so you can change any character
        var sb = new StringBuilder(Guessed);

        // for each character of Word, we check if it is the one we claimed
        for(int i=0; i<Word.Length; i++)
        {
            // Let's put both characters to lower case so we can compare them right
            if(Char.ToLower(Word[i]) == Char.ToLower(letter)) // have we found it?
            {
                // Yeah! So we put it in the stringbuilder at the same place
                sb[i] = Word[i];
                guessed = true;
            }
        }

        // reassign the stringbuilder's representation to Guessed
        Guessed = sb.ToString();

        // tell if you guessed right
        return guessed;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...