C# 猜词游戏 IndexOf 循环

3

我是一名C#初学者,正在尝试制作“猜词游戏”。在玩家猜测字母的过程中,我遇到了困难。

例如,如果单词是DATA,应用程序只会得到DATA中的第一个A。我知道我必须循环单词来获取所有的A,但我在让它正常工作方面遇到了问题!

以下是我的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;  
}

我一直在尝试谷歌这个问题, 但由于我是一个初学者,我不理解人们提供的建议。希望能找到一种使用IndexOf循环超过一个字母的方法?


你的代码似乎没有完全粘贴。 - dirkk
myGuess函数的目的是什么? - Thomas Taylor
可能是重复问题:如何在字符串中找到特定句子的所有出现?(https://dev59.com/gmfWa4cB1Zd3GeqPlu_2) - Bob.
4个回答

1

IndexOf返回字符串中第一个字符的索引。如果使用substring操作字符串,会使它变得比需要的更加复杂。相反,你可以使用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;

1
你可以使用这个:
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;
    }

我尝试了你的解决方案,当我选择DATA中的字母“A”时,它可以工作。但是,如果我尝试选择字母“T”,那么_A_A会变成_TTA,这样就删除了“先前”的索引? - Cartho12

1

这是一个可能过于通用的长解决方案。

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

0
一个简单的 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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接