【问题标题】:Easier way to 'or' operators in if statements (C#)在 if 语句中使用“或”运算符的更简单方法 (C#)
【发布时间】:2017-06-06 11:24:33
【问题描述】:

我正在统一制作游戏,并且我有这个“if 语句”,每 5 波我的商店菜单就会变得可见。代码确实有效,但我确定我做错了什么或者可以做得更好!

if (waveCount == 5 || waveCount == 10 || waveCount == 15 || waveCount == 20 || waveCount == 25 || waveCount == 30 || waveCount == 35 || waveCount == 40 || waveCount == 45 || waveCount == 50)
{
    // yield return new WaitForSeconds(shopWait);
    shopPanel.SetActive(true);
}

正如您所见,“if 语句”不太好,通常它会一直持续到 waveCount == 100,但我把它删掉了。必须有一种更简单或更清洁的方法来做到这一点:/但我就是无法理解它:(

编辑 1

谢谢,我对模数了解不多,知道我知道我必须阅读的内容:)

【问题讨论】:

标签: c# if-statement or-operator


【解决方案1】:

你可以使用模运算:

if (waveCount % 5 == 0)

【讨论】:

    【解决方案2】:

    是的,确实有更简单的方法可以做到这一点。如果你使用一点数学和逻辑,你就可以解决这个问题。

    由于要检查waveCount的值是否是5的倍数,可以使用%获取waveCount / 5的提醒。如果该提醒为 0,则waveCount 是 5 的倍数。

    if (waveCount % 5 == 0 && waveCount <= 100)
    

    我添加了waveCount &lt;= 100 以复制您的代码在waveCount 大于100 时的行为,即不进入if 语句。

    或者,您可以将所有值放入一个列表中:

    var list = new List<int>();
    for (int i = 1 ; i <= 20 ; i++) {
        list.Add(i * 5);
    }
    

    然后检查列表是否包含数字:

    if (list.Contains(waveNumber))
    

    这样做的好处是,如果您决定更改游戏的运行方式,并说商店菜单可以在第 9、52 和 77 波打开,您只需将数字添加到列表中,而无需修改 if 语句.这提供了很大的灵活性。

    【讨论】:

      【解决方案3】:
      if (waveCount % 5 == 0 && waveCount <= 50) {
          //...code
      }
      

      【讨论】:

        【解决方案4】:

        如果你的“if”语句的主体只包含shopPanel.SetActive(true);,你甚至可以不用像那样使用“if”。

        shopPanel.SetActive(waveCount % 5 == 0 && waveCount <= 50);
        

        【讨论】:

          【解决方案5】:

          试试看

          if (waveCount % 5 == 0 && waveCount <= 50)
          

          【讨论】:

            【解决方案6】:

            使用modulo-运算符:

            if(waveCount % 5 == 0 && waveCount <= 100) ...
            

            运算符计算整数除法的余数。在您的情况下,该语句应返回零,表示您的数字除以 5 没有余数。

            【讨论】:

              【解决方案7】:

              只是概括一下:如果您拥有的数据与模式不匹配,您可以将所有要匹配的东西放在一个集合中,然后测试该集合的成员资格:

              var thingsToMatch = Set(2, 5, 8, 14, 23, 80, 274...);
              if (someNumber in thingsToMatch) {...} 
              

              只要您知道每次调用函数时都不会重新创建集合,这已被证明是相当快的。如果您的语言不自动缓存该集合,您可以将其设为函数的静态变量。

              【讨论】:

                【解决方案8】:

                您可以为此使用余数运算符:

                if (waveCount % 5 == 0 && waveCount > 0 && waveCount <= 50)
                {
                    //yield return new WaitForSeconds(shopWait);
                    shopPanel.SetActive(true);
                }
                

                【讨论】:

                  【解决方案9】:

                  你可以测试被5除的余数是否为0,即能被5整除。

                  if (waveCount % 5 == 0 && waveCount >= 5 && waveCount <= 50)
                  

                  C# 对整数类型(intlonguint、...)执行整数数学。 示例:

                  13 / 5 = 2
                  

                  即你永远不会得到小数部分。互补运算是模运算。它为您提供了该除法的其余部分:

                  13 % 5 = 3
                  

                  即 13 / 5 是 2 加上余数 3。除法和模运算一起可以执行相反的运算。

                  (5 * (13 / 5)) + (13 % 5) =  
                  (5 *     2   ) + (   3  ) =  13
                  

                  如果你有不规则的数字,完全不同的方法是使用switch 声明:

                  switch (waveCount) {
                      case 5:
                      case 10:
                      case 15:
                      case 20:
                      case 25:
                      case 30:
                      case 35:
                      case 40:
                      case 45:
                      case 50:
                          shopPanel.SetActive(true);
                          break;
                  }
                  

                  或一个允许值的数组:

                  private static readonly int[] AllowedValues =
                      new int[] { 5, 10, 15, 20, 25, 30, 35, 40, 45, 50 };
                  
                  if(Array.IndexOf(AllowedValues, waveCount) >= 0) { ... }
                  

                  【讨论】:

                    猜你喜欢
                    • 2012-09-20
                    • 1970-01-01
                    • 2013-04-30
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多