【问题标题】:Tried fixing the loop尝试修复循环
【发布时间】:2013-02-08 11:20:52
【问题描述】:

我一直在为我的高级 RAP 项目开发一款游戏,直到最近我才开始使用这个循环。当玩家或敌人的生命值等于 0 时,我需要一种方法来迭代它。我希望它们都等于 0,这两个示例都这样做。我已经尝试过几种方式重写它,但它不起作用。感谢所有为此提供帮助的人。

while (!(enemyHealth == 0 || playerHealth == 0)
{ //START WHILE
    Console.WriteLine("[System:] Here are the list of moves that you can do:\n1)Punch\n2)Kick\n3)Round House Kick");
    Console.WriteLine();
    decision = Console.ReadLine();
    Console.WriteLine();
    decisionNumber = int.Parse(decision);
    if (decisionNumber < 1 || decisionNumber > 3)
    { //STARTS IF
        throw new Exception();
    } //ENDS IF
    else
    { //STARTS ELSE
        enemyHealth = enemyHealth - attackNumber;
        playerHealth = playerHealth - enemyAttackNumber;
        Console.WriteLine();
        Console.WriteLine("[System:] Enemy Health: " + enemyHealth + "\nYour Health: " + playerHealth);
     } //ENDS ELSE
} //ENDS WHILE



while (enemyHealth > 0 || playerHealth > 0)
                    { //START WHILE
                        Console.WriteLine("[System:] Here are the list of moves that you can do:\n1)Punch\n2)Kick\n3)Round House Kick");
                        Console.WriteLine();
                        decision = Console.ReadLine();
                        Console.WriteLine();
                        decisionNumber = int.Parse(decision);
                        if (decisionNumber < 1 || decisionNumber > 3)
                        { //STARTS IF
                            throw new Exception();
                        } //ENDS IF
                        else
                        { //STARTS ELSE
                            enemyHealth = enemyHealth - attackNumber;
                            playerHealth = playerHealth - enemyAttackNumber;
                            Console.WriteLine();
                            Console.WriteLine("[System:] Enemy Health: " + enemyHealth + "\nYour Health: " + playerHealth);
                        } //ENDS ELSE
                    } //ENDS WHILE

任何人都可以解决这个问题,因为我遇到了重大问题。

【问题讨论】:

  • 请不要只要求我们为您解决问题。向我们展示如何尝试自己解决问题,然后向我们确切地展示结果是什么,并告诉我们您为什么觉得它不起作用。请参阅“What Have You Tried?”了解您真正需要阅读的优秀文章。
  • problems 你有什么用?它有什么作用以及它应该做什么?
  • @John Saunders 我有。我已经尝试了从部分分解到重写循环的所有方法。没有任何效果。理论上是应该工作的。我对此感到沮丧,所以我可能应该给它取个更好的名字,但我想不出任何令人沮丧的东西。几乎把我的电脑扔在地上。
  • 您的 WriteLine 是否曾经将健康值之一显示为零?
  • 也许这是我可怜的 engrish 但是,在我看来,您在代码中所做的与您所说的完全相反:)

标签: c# loops while-loop project


【解决方案1】:

条件可以简化为,负健康水平是!= 0,这会产生逻辑故障,我们还需要保持循环处于活动状态,直到enemyplayer 的健康状况为&gt; 0

while ((enemyHealth > 0 && playerHealth > 0))

看起来,问题是你的循环编码,

throw new Exception(); 似乎是一个糟糕的逻辑,我的建议是丢弃忽略错误的输入。

可以像这样实现

while ((enemyHealth > 0 || playerHealth > 0))
{ 
    Console.WriteLine("[System:] Here are the list of moves that you can do:\n1)Punch\n2)Kick\n3)Round House Kick");
    Console.WriteLine();
    decision = Console.ReadLine();
    Console.WriteLine();
    decisionNumber = int.Parse(decision);
    if (decisionNumber >= 1 && decisionNumber <= 3)
    {

        enemyHealth = enemyHealth - attackNumber;
        playerHealth = playerHealth - enemyAttackNumber;
        Console.WriteLine();
        Console.WriteLine("[System:] Enemy Health: " + enemyHealth + "\nYour Health: " + playerHealth);
    } 
    else
    {
        Console.WriteLine("Invalid Input : press enter to input again");
        Console.ReadKey();
    }

}

【讨论】:

  • 而且,仅供参考,(!(enemyHealth == 0) || !(playerHealth == 0))((enemyHealth == 0) &amp;&amp; (playerHealth == 0)) 相同
  • @radarbob - 是的,它是一样的,但这就是 OP 在逻辑上做错了!
  • 拒绝投票者 - 您正在使用 ||代替 &&。即使其中一名战士死亡,战斗仍将继续。活着的玩家会永远继续从死去的玩家身上踢出垃圾吗?
  • @Steve - 谢谢!生病修复那部分!
【解决方案2】:

问题是你这样做

while (!(enemyHealth == 0) || !(playerHealth == 0))

enemyHealth = enemyHealth - attackNumber;

playerHealth = playerHealth - enemyAttackNumber;

如果敌人的生命值是……假设是 20,攻击数是 21,你得到 -1。它永远不会达到 0。你需要检查他们的健康是否大于 0。

while (enemyHealth &gt; 0 &amp;&amp; playerHealth &gt; 0)

使用 && 因为如果其中一个死了,你希望战斗结束。

【讨论】:

  • 在 || 时 && 不代表“和”代表“或”
【解决方案3】:

为什么不这样做

bool loop = true;
while(loop)
{
//change loop to false when it loop should stop
}

或使用break 关键字

【讨论】:

  • 你不需要布尔值。你可以简单地做 while(true) { ... if(something) { break; } }
  • 我提供了两种不同的方式:)
【解决方案4】:

我会将条件更改为:

while (enemyHealth > 0 && playerHealth > 0)

如果敌人或玩家的生命值降至零或更少,这将停止循环。在运行状况降至零以下(负数)的情况下,使用大于或小于比较而不是精确的零比较更安全。

【讨论】:

    【解决方案5】:

    您的语言有点混乱。当你说

    我需要一种方法来在玩家或敌人健康时重申这一点 等于 0。

    我认为你的意思是当玩家或敌人的生命值等于 0 时,你想要“停止重复”(即,离开循环)。要做到这一点,你需要 &amp;&amp; 而不是 @987654323 @:

    while (!(enemyHealth == 0) && !(playerHealth == 0))
    

    这意味着只要敌方玩家的生命值都不是零,就继续运行循环。但是,如果健康有可能变为负数(并跳过0),这还不够好。你想使用:

    while (enemyHealth > 0 && playerHealth > 0)
    

    【讨论】:

    • 在编程中&&不代表“和”吗?
    • @DustinKoeller 它在 C# 中实现
    • 是的,没错。问题是这是一个while 循环,而不是stop when 循环。因此,您描述的是 staying 在循环中的条件,而不是 leaving 循环的条件。所以逻辑会倒过来。您想要的是“在enemyHealth == 0 || playerHealth == 0 时离开循环”,这意味着“在enemyHealth != 0 &amp;&amp; playerHealth != 0 时保持在循环中”。 (请参阅De Morgan's Laws 了解我的意思)
    猜你喜欢
    • 1970-01-01
    • 2019-07-21
    • 1970-01-01
    • 1970-01-01
    • 2017-08-10
    • 2013-04-02
    • 2012-02-25
    • 2013-12-15
    • 1970-01-01
    相关资源
    最近更新 更多