Цикл IndexOf C# Hangman

Я новичок в С#, и я пытаюсь сделать игру "палач". Я застрял в процессе, когда игрок угадывает букву.

Например, если слово DATA, приложение получает только первую букву A в DATA. Я понимаю, что мне нужно зациклить слово, чтобы получить все пятерки, но у меня проблемы с тем, чтобы заставить его работать!

вот мой код для метода myGuess:

public void myGuess(String letter)
{
        int plats = 0;

        string wordToGuess = label4.Text;

        plats = wordToGuess.IndexOf(letter);

        string wordToShow = label5.Text;
        //ersätt "_" med bokstaven på alla positioner bokstaven dyker upp

        wordToShow = wordToShow.Substring(0, wordToGuess.IndexOf(letter)) + letter +
                     wordToShow.Substring(plats + 1, wordToShow.Length - (plats + 1));

        label5.Text = wordToShow;  
}

Я пытался найти его в Google, но, поскольку я новичок, я не понимаю предложений, которые дают люди. Надеюсь, это способ зациклить более одной буквы с помощью IndexOf?


person Cartho12    schedule 27.02.2014    source источник
comment
Ваш код кажется не полностью вставленным.   -  person dirkk    schedule 27.02.2014
comment
какова цель функции myGuess?   -  person Thomas Taylor    schedule 27.02.2014
comment
возможный дубликат Как мне найти все вхождения определенного предложения в строку?   -  person Bob.    schedule 27.02.2014


Ответы (4)


IndexOf возвращает индекс первого экземпляра символа в строке. Вы можете манипулировать своей строкой, используя подстроку, но вы сделаете ее более сложной, чем вам нужно. Вместо этого вы можете просто перебирать каждый из символов строки с помощью цикла for:

for (int i = 0; i < wordToGuess.Length; i++ )
{
    if (WordToGuess[i] == letter)
    {
         //Update the correctly guessed letters, (using value of i to determine which letter to make visible.)
    }
}
label5.Text = wordToShow;
person tdoan    schedule 27.02.2014

Вы можете использовать это:

label4(wordToGuess): DATA
label5(wordToShow):  ****

Когда вы вызываете myGuess('A')

label4(wordToGuess): DATA
label5(wordToShow):  *A*A

Когда вы вызываете myGuess('T')

label4(wordToGuess): DATA
label5(wordToShow):  *ATA

...

public void myGuess(char letter)
    {
        string wordToGuess = label4.Text;
        string wordToShow = label5.Text;

        if (wordToShow.Length == 0)
        {
            for (int i = 0; i < wordToGuess.Length; i++)
                wordToShow += "*";
        }

        for (int i = 0; i < wordToGuess.Length; i++)
        {
            if (wordToGuess[i] == letter || wordToGuess[i] == wordToShow[i])
                wordToShow = wordToShow.Remove(i,1).Insert(i, Char.ToString(letter));
        }

        label5.Text = wordToShow;
    }
person Hadi Sharifi    schedule 27.02.2014
comment
Я попробовал ваше решение, оно работает, когда я, например. выбрать букву «A» в DATA, но если я затем попытаюсь выбрать букву T, _A_A превратится в _TTA, поэтому он также удалит предыдущий индекс? - person Cartho12; 28.02.2014

Вот длинное решение, которое, вероятно, слишком общее.

List<int> findIndexes(string myStr, char letter)
{
    var foundIndexes = new List<int>();
    for (int i = 0; i < myStr.Length; i++)
    {
        if (myStr[i] == letter)
        foundIndexes.Add(i);
    }
    return foundIndexes;
}
string ReplaceIndex(string s, int index, char letter){
    return s.Substring(0, index ) 
    + letter 
    + s.Substring(index + 1, s.Length - (index + 1));
}
void Main()
{
    string s= "data";
    string wordToShow = "____";
    var letter = 'a';
    var indexes = findIndexes(s, letter);
    foreach (var index in indexes)
    {
        wordToShow = ReplaceIndex(wordToShow, index, letter);
    }
    Console.WriteLine (wordToShow);
}
person DLeh    schedule 27.02.2014

Простой цикл for должен справиться с этим.

for (int i = 0; i < wordToGuess.Length; i++)
{
    if (wordToGuess[i].ToString().Equals(letter.ToString(), System.StringComparison.InvariantCultureIgnoreCase))
    {
        wordToShow = string.Format("{0}{1}{2}", wordToShow.Substring(0, i), letter, wordToShow.Substring(i, wordToShow.Length - (i + 1)));
    }
}

Вот скрипка: http://dotnetfiddle.net/UATeVJ

person McAden    schedule 27.02.2014