【问题标题】:How to change goto statement to improve code?如何更改 goto 语句以改进代码?
【发布时间】:2021-07-10 14:06:45
【问题描述】:

我正在编写一个 C# Windows 窗体应用程序。我有一个带有随机单词的标签,例如“电脑”。用户看到被覆盖的单词,在这个例子中:“--------”。用户必须通过逐字母猜测来猜测这个词是什么。我创建了按钮提示。该按钮负责显示一个随机字母。这是我创建的代码:

private void btnHint_Click(object sender, EventArgs e)
{
    repeat:
    Random rnd = new Random(); 
    int rand = rnd.Next(corrArr.Length); 
    char letter = corrArr[rand]; 

    if (letters.Contains(letter.ToString())) //check if the random letter is already used
    {
        goto repeat; 
    }
    else
    {
        word.Text = "";

        var idx = correct.IndexOf(letter);
        wordArr[idx] = Convert.ToChar(letter);

        foreach (var item in wordArr)
        {
            word.Text += item.ToString();
        }
        count++;
        
        if (wordLen == count)
        {
            this.BackColor = Color.LimeGreen; 
            result.Text = "Win!!";
            tb.Enabled = false; 
            btnClick.Visible = false; 
        }
    }
    letters.Add(letter.ToString());
}

通过goto 声明,如果前一个字母已被使用,我可以再次绘制一个字母。

我听说我不应该像在代码开头那样使用goto 语句,但程序运行良好。如何改进代码?

【问题讨论】:

  • 使用 Goto 的理由很少,但循环不是。 (跳出一组深度嵌套的循环是)。 - 请阅读 101 教程!

标签: c# goto


【解决方案1】:

离开 if/else 语句并使用 Do While 循环

tutorialsteacher

Random rnd = new Random(); 
char letter;
do
{
      int rand = rnd.Next(corrArr.Length); 
      letter = corrArr[rand]; 
} while (letters.Contains(letter.ToString()));

 word.Text = "";

 var idx = correct.IndexOf(letter);

 wordArr[idx] = Convert.ToChar(letter);

当然还有更多需要改进的地方... ;)

【讨论】:

  • 这不会编译,因为letter 只在循环体内有效
  • @derpirscher char letter;do 之前,它可以工作
  • @keyboardNoob 我知道。但是,如果将某些内容作为答案发布,它应该是正确的......
  • @derpirscher 你是对的。我认为这是一个“架构”查询,而不是错误修复。我没有测试过。我的错。
  • @benuto 我只是想要一个想法,所以你帮了我很多
【解决方案2】:

在你的随机字母仍然包含在已使用的字母中时,围绕你检查并重复它。

private void btnHint_Click(object sender, EventArgs e) {
    Random rnd = new Random();
    char letter;
    while (letters.Contains((letter = corrArr[rnd.Next(corrArr.Length)]).ToString()))
      ; //the loops body is left empty intentionally

    ...
}

更好的方法是,拥有一组可用字母,并且每次随机选择一个,将其从可用字母集合中删除。这样,您就不必进行任何检查或循环

var availLetters = "abcdef....";

int rand = rnd.Next(availLetters.Length);
char letter = availLetters[rand];
availLetters = availLetters.Substring(0, rand) + availLetters.Substring(rand+1);

... 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-30
    • 1970-01-01
    • 1970-01-01
    • 2019-10-14
    相关资源
    最近更新 更多