在 if 语句中使用 'or' 运算符的更简单方法 (C#)
Easier way to 'or' operators in if statements (C#)
我正在 unity 中制作游戏,我有这个 'if statement' 每 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 statement' 不太好,通常它会一直持续到 waveCount == 100
,但我将其删除。必须有一种更简单或更清洁的方法来做到这一点:/但我无法绕过它:(
编辑 1:
谢谢,我对模不太了解,知道我知道我必须阅读的内容:)
您可以使用模运算:
if (waveCount % 5 == 0)
试试看
if (waveCount % 5 == 0 && waveCount <= 50)
使用 modulo-运算符:
if(waveCount % 5 == 0 && waveCount <= 100) ...
运算符计算 integer-divison 的余数。在您的情况下,语句应该 return 为零,表示您的数字除以 5
没有余数。
只是概括一下:如果您拥有的数据不匹配某个模式,您可以将所有要匹配的东西放在一个集合中,然后测试该集合的成员资格:
var thingsToMatch = Set(2, 5, 8, 14, 23, 80, 274...);
if (someNumber in thingsToMatch) {...}
只要您知道不会在每次调用该函数时都重新创建集合,事实证明这相当快。如果您的语言不会自动缓存该集合,您可以将其设为函数的静态变量。
您可以为此使用余数运算符:
if (waveCount % 5 == 0 && waveCount > 0 && waveCount <= 50)
{
//yield return new WaitForSeconds(shopWait);
shopPanel.SetActive(true);
}
是的,确实有更简单的方法可以做到这一点。如果你使用一点数学和逻辑,你可以解决这个问题。
由于要检查waveCount
的值是否是5的倍数,可以使用%
得到waveCount / 5
的提醒。如果该提醒为 0,则 waveCount
是 5 的倍数。
if (waveCount % 5 == 0 && waveCount <= 100)
我添加了 waveCount <= 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 波打开,你只需将数字添加到列表中,而无需修改如果声明。这提供了很大的灵活性。
你可以测试5除的余数是否为0,即能被5整除
if (waveCount % 5 == 0 && waveCount >= 5 && waveCount <= 50)
C# 对整数类型(int
、long
、uint
、...)执行 整数数学运算。
示例:
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) { ... }
if (waveCount % 5 == 0 && waveCount <= 50) {
//...code
}
如果您的“if”语句的正文仅包含 shopPanel.SetActive(true);
,您甚至可以不使用那样的“if”。
shopPanel.SetActive(waveCount % 5 == 0 && waveCount <= 50);
我正在 unity 中制作游戏,我有这个 'if statement' 每 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 statement' 不太好,通常它会一直持续到 waveCount == 100
,但我将其删除。必须有一种更简单或更清洁的方法来做到这一点:/但我无法绕过它:(
编辑 1:
谢谢,我对模不太了解,知道我知道我必须阅读的内容:)
您可以使用模运算:
if (waveCount % 5 == 0)
试试看
if (waveCount % 5 == 0 && waveCount <= 50)
使用 modulo-运算符:
if(waveCount % 5 == 0 && waveCount <= 100) ...
运算符计算 integer-divison 的余数。在您的情况下,语句应该 return 为零,表示您的数字除以 5
没有余数。
只是概括一下:如果您拥有的数据不匹配某个模式,您可以将所有要匹配的东西放在一个集合中,然后测试该集合的成员资格:
var thingsToMatch = Set(2, 5, 8, 14, 23, 80, 274...);
if (someNumber in thingsToMatch) {...}
只要您知道不会在每次调用该函数时都重新创建集合,事实证明这相当快。如果您的语言不会自动缓存该集合,您可以将其设为函数的静态变量。
您可以为此使用余数运算符:
if (waveCount % 5 == 0 && waveCount > 0 && waveCount <= 50)
{
//yield return new WaitForSeconds(shopWait);
shopPanel.SetActive(true);
}
是的,确实有更简单的方法可以做到这一点。如果你使用一点数学和逻辑,你可以解决这个问题。
由于要检查waveCount
的值是否是5的倍数,可以使用%
得到waveCount / 5
的提醒。如果该提醒为 0,则 waveCount
是 5 的倍数。
if (waveCount % 5 == 0 && waveCount <= 100)
我添加了 waveCount <= 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 波打开,你只需将数字添加到列表中,而无需修改如果声明。这提供了很大的灵活性。
你可以测试5除的余数是否为0,即能被5整除
if (waveCount % 5 == 0 && waveCount >= 5 && waveCount <= 50)
C# 对整数类型(int
、long
、uint
、...)执行 整数数学运算。
示例:
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) { ... }
if (waveCount % 5 == 0 && waveCount <= 50) {
//...code
}
如果您的“if”语句的正文仅包含 shopPanel.SetActive(true);
,您甚至可以不使用那样的“if”。
shopPanel.SetActive(waveCount % 5 == 0 && waveCount <= 50);