【问题标题】:"No" option not working properly in my Do While loop“否”选项在我的 Do While 循环中无法正常工作
【发布时间】:2018-10-22 23:57:50
【问题描述】:

所以我目前正在玩一款类似RPG的文字游戏,在经历了一次攻击和反击之后,会出现一个对话框询问你是否要离开,但问题是,“是”和否”都导致它离开循环,如果你的HP和敌人的HP高于0,点击“否”它应该留在循环中。我认为它工作正常,直到我稍后在程序中添加代码但我可能是错的:

DialogResult dialogResult;

do
{
    count++;
    if (enemyHP > 0)
    {
        Random rand = new Random();
        int chance = rand.Next(1, 101);

        MessageBox.Show("You see another enemy...);
        MessageBox.Show("Its HP is 10...2/5");
        MessageBox.Show("His current HP is " + enemyHP + ");
        if (chance <= 5)
        {
            MessageBox.Show("Miss");
        }
        else
        {
            MessageBox.Show("You dealt 5 damage to it.);
            enemyHP -= 5;
        }

        if (enemyHP > 0)
            MessageBox.Show("He also dealt 5 damage to you.);
        playerHP -= 5;
    }

    if (enemyHP <= 0)
    {
        MessageBox.Show("Enemy has been defeated!");
        dialogResult = (0);
    }
    else
     if (playerHP > 0)
    {
        dialogResult = MessageBox.Show("Do you want to leave?", "Message box", MessageBoxButtons.YesNo);
    }
} while (DialogResult == DialogResult.No && enemyHP > 0); 

【问题讨论】:

  • 我认为这行} while (DialogResult == DialogResult.No &amp;&amp; enemyHP &gt; 0); 有错字,是您过早退出的原因。也许它应该是} while (dialogResult == DialogResult.No &amp;&amp; enemyHP &gt; 0); - 注意小写的'dialogResult'
  • 另外Random rand = new Random();会给你带来麻烦,每个应用程序初始化一次
  • @JayV 感谢您的回答!当我更改它时,有一条红色下划线并显示“使用未分配的局部变量”
  • @TheGeneral 感谢您的回答!我应该把它改成什么?
  • 把它作为类变量放在你的主类中private static readonly Random _rand = new Random();

标签: c# loops while-loop


【解决方案1】:

问题出在以下几行:

  1. DialogResult dialogResult;
    
  2. if (playerHP > 0)
    {
        dialogResult = MessageBox.Show("Do you want to leave?", "Message box", MessageBoxButtons.YesNo);
    }
    
  3. } while (DialogResult == DialogResult.No && enemyHP > 0); 
    

正如@JayV 所说,第 3 行有错字,应该是:

} while (dialogResult == DialogResult.No && enemyHP > 0); 

但是,dialogResult 可能在满足该条件时尚未初始化,因为分配发生在 if 分支内。
因此,修改第一行以提供默认值,即DialogResult.No

DialogResult dialogResult = DialogResult.No;

你这里还有点小问题:

if (enemyHP > 0)
    MessageBox.Show("He also dealt 5 damage to you.);
playerHP -= 5;

MessageBox.Show 行在 if 分支内运行,但由于您没有添加括号,您可能没有意识到以下行始终运行。
这就是为什么:

始终使用括号!

if (enemyHP > 0)
{
    MessageBox.Show("He also dealt 5 damage to you.);
    playerHP -= 5;
}

【讨论】:

  • 我还是这个网站的新手,所以对于这个评论,我会将发布“评论”的人和给出“答案”的人视为两个独立的东西,这样我就不会混淆任何人!感谢提交“答案”的人,它起作用了!我看不到你的名字,所以我知道你是谁哈哈。还要感谢所有发表“评论”的人!
  • 好的,但现在有一个新问题:所以如果你或敌人在点击“是”或“否”后还没有被击败,那么你先攻击但它说“你已经被打败了“尽管那次攻击击败了敌人哈哈。它仍然说你在它之后击败了敌人。我该怎么做才能让程序知道敌人已被击败,从而循环结束并且敌人不再对你造成伤害?
  • @Kris 我已经更新了回答这个问题的答案
  • 感谢您的回答,但我得到了它的工作。当在“if 语句”中满足条件时,我在“if 语句”中使用了“break”来停止循环
猜你喜欢
  • 2021-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-07
  • 1970-01-01
  • 2015-01-06
相关资源
最近更新 更多