首页 > 解决方案 > 关于 for-if 循环中的布尔逻辑的混淆

问题描述

我有一个对象列表,如果它们不干扰列表中已包含的对象,我将向该列表添加新对象(有点像碰撞检测)。我正在尝试创建一个可以检测这种干扰的函数。

我设计它的方式是如果发生碰撞(不直观)输出“false”,如果没有碰撞则输出“true”,因为我稍后将在 if 语句中使用这个结果,我希望它在发生碰撞的情况下执行该语句。该列表称为顶点。可能有很多错误,但我最困惑的是布尔函数的逻辑以及它是如何通过 if 和 for 循环进行的。

我想要的结果是,如果新对象干扰了列表中已有的任何对象,则该函数将输出“false”,并且当且仅当该对象不干扰任何元素时,它才会输出“true”。但是,我不认为我的代码在做我在这里描述的事情。if 是否采用第一个结果,“真”或“假”?如果所有结果都为真,它是否只输出“真”。我认为这是我问题的症结所在(我可能弄错了)。

可能有一种更有效的方法来做到这一点(如果是这样,请通知我!),但现在我实际上正在使用 for 循环遍历列表中的每个元素,然后使用 if 语句编写碰撞测试. 我的代码如下:

function test(x, y, len) {
  var k;
  for (k=0; k < vertices.length; k++) {
    if (((y + len) < (vertices[k][1])) || (y > (vertices[k][1] + vertices[k][2])) || ((x + len) < vertices[k][0]) || (x > (vertices[k][0] + vertices[k][2])))
    {
      return false
    } else 
    {
      return true
    }
  }
}

可能是碰撞条件本身有问题(“...或...或...”),但我认为情况并非如此。我认为我上面描述的逻辑有问题。如果有人能给我一些可以澄清问题的解释,将不胜感激。如您所知,我对此很陌生。谢谢!

标签: javascriptboolean

解决方案


移出return truefor 循环。

然后它只会在循环结束而没有先找到结果的情况下返回 true。

function test(x, y, len) {
  var k;
  for (k=0; k < vertices.length; k++) {
    if (((y + len) < (vertices[k][1])) || (y > (vertices[k][1] + vertices[k][2])) || ((x + len) < vertices[k][0]) || (x > (vertices[k][0] + vertices[k][2])))
    {
      return false
    } 
  }
 return true;
}

推荐阅读