for-if循环中有关布尔逻辑的困惑

时间:2018-12-24 01:23:01

标签: javascript boolean

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

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

我期望的结果是,如果新对象干扰列表中已有的任何对象,则该函数将输出'false',并且仅当该对象出现时,它才会输出'true'不会干扰任何元素。但是,我不认为我的代码正在执行我在此描述的操作。 if是否取第一个结果“ true”或“ false”?如果所有结果都为真,则仅输出“真”。我认为这是我问题的症结(我可能会误会)。

可能有一种更有效的方法(如果可以,请通知我!),但是现在我实际上正在使用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
    }
  }
}

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

1 个答案:

答案 0 :(得分:1)

return true移动到for循环之外。

然后,只有在循环结束而没有先找到结果的情况下,它才会返回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;
}