循环中的 40 个 If 语句,如何避免?
40 If-Statements in a Loop, How to Avoid?
我正在使用库 JInput 来检测 java 游戏中的控制器输入。但是,为了获得轴移动的方向,我使用这个:
gamePadContr.getComponent(Identifier.Axis.X).getPollData();
这给了我一个介于 -1 和 1 之间的小数,它告诉我方向。我希望玩家能够移动的不仅仅是上、下、左、右,所以我的游戏循环中有 40 个 if 语句来检查数字是否是一组特定的数字,并增加 x 和 y 坐标因此。这是一个例子:
if(x > .1 && x < .2 && y == 1){
// do stuff
} else
if(x > .2 && x < .3 && y == 1{
// do stuff
}
我必须检查每一个以确保大多数方向都被考虑在内。
我的观点是,40 个 if 语句滞后。 我可以做些什么来优化它吗?
一些编辑来回答问题:
不认为这是相关的,但是 .1 的增量有 40 个不同的 if 语句的原因是因为我正在检查操纵杆的 X 轴和 Y 轴。可能的组合是 (1, -1) (1, 1) (-1, 1) (-1, -1),给了我 40 种不同组合的负数和正数,增量为 .1。 (不知道说的对不对
//只是将玩家的 x 和 y 坐标增加一定数量。
您可以做的一件事是嵌套您的条件。而不是
if (x > .1 && x < .2 && y == 1){doStuff();}
else if (x > .2 && x < .3 && y == 1){doStuff();}
else if (x > .1 && x < .2 && y == 2){doStuff();}
else if (x > .2 && x < .3 && y == 2){doStuff();}
您可能要考虑:
if (y == 1){
if (x > .1 && x < .2){doStuff();}
else if (x > .2 && x < .3){doStuff();}
}
else if (y == 2)
{
if (x > .1 && x < .2){doStuff();}
else if (x > .2 && x < .3){doStuff();}
}
现在您的代码可以跳过所有它知道不正确的 if 检查。该程序不必检查多达 20*20 = 400 个 if 语句,而只需在任何给定循环中检查多达 20+20=40 个 if 语句。你仍然会有大量的 if 语句 - 事实上,你会比以前稍微多一些 - 但其中 90% 将被跳过,并且它们每个都会更短,所以程序将 运行更快。
您还可以通过巧妙的排序减少每个 if 语句中的检查次数。如果您已经检查了 x < .5
并且它是错误的,那么您已经知道 x < .4
是错误的。例如:
if (y == 1){
if (x > .9 ){doStuff();}
else if (x > .8){doStuff();} // no need to check if it's less than .9 since the previous line covered that case
}
最好的方法可能是发现一个规则,通过该规则您可以直接从操纵杆坐标直接计算玩家的坐标变化。为此,我们需要每个分支的 // do stuff
的详细信息。
另一种可能性(如果您没有简单的关系,这很好)是通过将 x
和 y
值转换为数组,将您的测试转换为 look-up指数
int xIndex = (int) (10 * x + 10); // an int between 0 and 20
int yIndex = (int) (10 * y + 10); // ditto
然后你可以在你提前计算过一次的二维数组中查看玩家的坐标变化。更一般地说,您可以有一个 Runnable
对象数组,根据索引查找适当的 Runnable
,然后 run()
它。
P.S。如果每个操纵杆坐标可以落入 20 个不同范围中的任何一个,那么你有 400 个案例,而不是 40 个。也就是说,除非你总是忽略一个或另一个轴。
我正在使用库 JInput 来检测 java 游戏中的控制器输入。但是,为了获得轴移动的方向,我使用这个:
gamePadContr.getComponent(Identifier.Axis.X).getPollData();
这给了我一个介于 -1 和 1 之间的小数,它告诉我方向。我希望玩家能够移动的不仅仅是上、下、左、右,所以我的游戏循环中有 40 个 if 语句来检查数字是否是一组特定的数字,并增加 x 和 y 坐标因此。这是一个例子:
if(x > .1 && x < .2 && y == 1){
// do stuff
} else
if(x > .2 && x < .3 && y == 1{
// do stuff
}
我必须检查每一个以确保大多数方向都被考虑在内。
我的观点是,40 个 if 语句滞后。 我可以做些什么来优化它吗?
一些编辑来回答问题:
不认为这是相关的,但是 .1 的增量有 40 个不同的 if 语句的原因是因为我正在检查操纵杆的 X 轴和 Y 轴。可能的组合是 (1, -1) (1, 1) (-1, 1) (-1, -1),给了我 40 种不同组合的负数和正数,增量为 .1。 (不知道说的对不对
//只是将玩家的 x 和 y 坐标增加一定数量。
您可以做的一件事是嵌套您的条件。而不是
if (x > .1 && x < .2 && y == 1){doStuff();}
else if (x > .2 && x < .3 && y == 1){doStuff();}
else if (x > .1 && x < .2 && y == 2){doStuff();}
else if (x > .2 && x < .3 && y == 2){doStuff();}
您可能要考虑:
if (y == 1){
if (x > .1 && x < .2){doStuff();}
else if (x > .2 && x < .3){doStuff();}
}
else if (y == 2)
{
if (x > .1 && x < .2){doStuff();}
else if (x > .2 && x < .3){doStuff();}
}
现在您的代码可以跳过所有它知道不正确的 if 检查。该程序不必检查多达 20*20 = 400 个 if 语句,而只需在任何给定循环中检查多达 20+20=40 个 if 语句。你仍然会有大量的 if 语句 - 事实上,你会比以前稍微多一些 - 但其中 90% 将被跳过,并且它们每个都会更短,所以程序将 运行更快。
您还可以通过巧妙的排序减少每个 if 语句中的检查次数。如果您已经检查了 x < .5
并且它是错误的,那么您已经知道 x < .4
是错误的。例如:
if (y == 1){
if (x > .9 ){doStuff();}
else if (x > .8){doStuff();} // no need to check if it's less than .9 since the previous line covered that case
}
最好的方法可能是发现一个规则,通过该规则您可以直接从操纵杆坐标直接计算玩家的坐标变化。为此,我们需要每个分支的 // do stuff
的详细信息。
另一种可能性(如果您没有简单的关系,这很好)是通过将 x
和 y
值转换为数组,将您的测试转换为 look-up指数
int xIndex = (int) (10 * x + 10); // an int between 0 and 20
int yIndex = (int) (10 * y + 10); // ditto
然后你可以在你提前计算过一次的二维数组中查看玩家的坐标变化。更一般地说,您可以有一个 Runnable
对象数组,根据索引查找适当的 Runnable
,然后 run()
它。
P.S。如果每个操纵杆坐标可以落入 20 个不同范围中的任何一个,那么你有 400 个案例,而不是 40 个。也就是说,除非你总是忽略一个或另一个轴。