【问题标题】:C# Hangman IndexOf LoopC# Hangman IndexOf 循环
【发布时间】:2014-02-27 18:14:38
【问题描述】:

我是 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 循环多个字母的方法?

【问题讨论】:

标签: c# indexof


【解决方案1】:

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;

【讨论】:

    【解决方案2】:

    你可以用这个:

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

    【讨论】:

    • 我尝试了你的解决方案,它在我为 ex 时有效。在 DATA 中选择字母“A”,但如果我随后尝试选择字母 T,_A_A 会变成 _TTA,所以它也会删除“早期”索引?
    【解决方案3】:

    这是一个很长的解决方案,可能过于笼统。

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-03-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-28
        • 2018-11-15
        相关资源
        最近更新 更多