for循环和数组比较问题

时间:2013-09-22 22:30:19

标签: java arrays processing

我正在进行一项小练习,我必须初始化一系列以随机速度在屏幕上移动的球对象。我需要球在相互碰撞时反转速度。问题是我只能将每个球与自身进行比较,以便它们不断“交叉”并来回晃动。我很好地感觉问题是在if下面的if语句中,因为我将ball [i]与ball [i]进行比较,其中“i”同时是相同的数字。当我通过交叉函数传递球[i]时,我需要将每个元素与除自身之外的所有其他元素进行比较。我尝试了一些方法,但它们没有用,而且是多余的。

// for draw()

中的循环
   for(int i = 0; i < balls.length; i++){
    //balls[i].drawBalls();
    //balls[i].moveBalls();
    ***if (balls[i].intersect(balls[i])) {
        balls[i].moveIntersectingBalls();
    }***
  }

//球交叉方法

boolean intersect(Ball b) {
    float distance = dist(bXpos,bYpos,b.bXpos,b.bYpos);

    if (distance < bRadius + b.bRadius) {
      return true;
    } else {
      return false;
    }
  }

//如果相交方法球移动

void moveIntersectingBalls(){
    bXspd *= -1;
    bYspd *= -1;
  }

3 个答案:

答案 0 :(得分:1)

要将每个球与所有其他球进行比较,您需要两个for循环:

for (int i = 0; i < balls.length; i++)
{
    for (int j = 0; j < balls.length; j++)
    {
        // Check first that you are not comparing a ball to itself.
        if (i != j)
            if (balls[i].intersect(balls[j]))
                balls[i].moveIntersectingBalls();
    }
}

答案 1 :(得分:0)

我的意思是,这段代码似乎没有多大意义:

if (balls[i].intersect(balls[i])) {
    balls[i].moveIntersectingBalls();
}

但是我想你自己指出了这一点。

您正在寻找类似的东西:

for(int i = 0; i < balls.length; i++){
    for(int j = (i+1); j < balls.length; j++){
        if (balls[i].intersect(balls[j])) {
            balls[i].moveIntersectingBalls();
            // Maybe also add:
            balls[j].moveIntersectingBalls();
        }
    }
}

你可以在i而不是0开始内循环,因为你已经“检查过”那些。

事实上,如果你从0开始,你将检查每个球对两次(例如(1,3)和(3,1)再次)可能导致你抽搐'我描述过。

答案 2 :(得分:-1)

这里你需要的是一个双循环:

        for(int i = 0; i < balls.length; i++){
        for(int j = 0; j < balls.length; j++){
            if (balls[i].intersect(balls[j]) && i != j) {
                balls[i].moveIntersectingBalls();
            }
        }
    }

使用双循环将每个球(第一个循环)与所有其他球(第二个循环)进行比较,如果你击中一个,则调用moveIntersecingBalls();第一球。

这个算法可能会被优化,因为当两个球碰撞时再次检查它们是没用的,但这是一个好的开始。