【问题标题】:40 If-Statements in a Loop, How to Avoid?循环中的 40 个 if 语句,如何避免?
【发布时间】:2017-02-12 07:39:17
【问题描述】:

我正在使用库 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. 认为这无关紧要,但 .1 的增量有 40 个不同的 if 语句的原因是因为我正在检查操纵杆的 X 轴和 Y 轴。可能的组合是 (1, -1) (1, 1) (-1, 1) (-1, -1),以 0.1 的增量为我提供 40 种不同组合的负数和正数。 (我不知道这是否有意义。

  2. //do stuff 只是将玩家的 x 和 y 坐标增加一定数量。

【问题讨论】:

  • 向量、sin、cos、三角函数
  • 当您以 0.1 为增量划分范围时,-1 和 1 之间的小数如何给您 40 个案例?此外,您发布的代码仅对x &lt; .2x &gt; .2 有反应;在 x == .2 等处会发生什么?
  • 你能举个例子说明你在// do stuff做什么吗?如何移动播放器?你看到什么模式了吗?如何使用这些模式来消除 if 语句?
  • 我的主要问题是有哪些替代方案可以优化这一点?

标签: java jinput


【解决方案1】:

最好的方法可能是发现一个规则,您可以直接从操纵杆坐标计算玩家的坐标变化。为此,我们需要每个分支的 // do stuff 的详细信息。

如果您没有简单的关系,另一种可能性是通过将 xy 值转换为数组索引来将您的测试转换为查找

int xIndex = (int) (10 * x + 10); // an int between 0 and 20
int yIndex = (int) (10 * y + 10); // ditto

然后您可以在您提前计算一次的二维数组中查找玩家的坐标变化。更一般地说,您可以有一个 Runnable 对象数组,根据索引查找适当的 Runnable,然后 run() 它。

附:如果每个操纵杆坐标可以落入 20 个不同范围中的任何一个,那么您有 400 个案例,而不是 40 个。也就是说,除非您总是忽略其中一个轴。

【讨论】:

  • 很好的数组查找解决方案。 +1
  • 这不是 21 个不同的范围和 441 个案例吗?
  • @Turo - 是的,可能。这取决于您如何处理端点。
【解决方案2】:

您可以做的一件事是嵌套您的条件。而不是

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 &lt; .5 并且它是错误的,那么您已经知道x &lt; .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
}

【讨论】:

  • 如果 x 和 y 相互独立,也可以进行一些简化——你甚至不必嵌套条件;他们可以分开。尽管另一个答案中的数组查找可能更好。
猜你喜欢
  • 1970-01-01
  • 2013-05-28
  • 2020-11-16
  • 2020-09-19
  • 2021-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多