球的随机起始位置,避免碰撞

时间:2017-09-07 08:37:07

标签: java swing random

我知道现有一些类似的问题,但我的代码略有不同,我觉得它差不多完成了我只需要稍微调整一下,但我不确定是什么。

我的目标是在900x600画布中生成圆圈,而不是它们最初碰撞。球的数量由用户指定,最多为100个。

到目前为止我的方法:

startCounter = 8;

balls = new ArrayList<>();

for (int i = 0; i < amount; i++) {
    diameter = random.nextInt(30) + 10 + diameterRange; //generate diameter value for ball
    startCounter += diameter + 25; //stop balls from spawning on top of each other

    BouncingBall ball = makeBall(startCounter, diameter, i);
    if (Physics.Collision(ball, balls)
      || ball.getXPosition() > 850 || ball.getYPosition() > 550)
    {
        continue; //avoid starting collisions
    }

    balls.add(ball);
}

目前这几乎完美无缺,除非它们在if语句失败时不会创建球,导致球数少于用户指定的数量。

我尝试添加i--;对于if语句的内容,但是这不起作用,并且在这种情况下球看起来似乎不正确。

感谢:)

3 个答案:

答案 0 :(得分:2)

将其更改为while循环,即:

test1 : 0 
test2 : 0 
undefined
test1 : 0 
test2 : 1 
test1 : 0 
test2 : 2 
test1 : 0 
test2 : 3 
test1 : 0 
test2 : 4 
test1 : 0 
test2 : 5

答案 1 :(得分:1)

For循环具有在第一个循环之前确定的循环量。更好的方法是将for (int i = 0; i < amount; i++)替换为`而i&lt;如果条件满足,则只增加i计数(因为while循环通过内存位置验证每个循环开始时的条件。

代码应如下所示 `startCounter = 8;                 balls = new ArrayList&lt;&gt;();

            while (i < amount) {
                diameter = random.nextInt(30) + 10 + diameterRange;//generate diameter value for ball
                startCounter += diameter + 25;//stop balls from spawning on top of eachother
                BouncingBall ball = makeBall(startCounter, diameter, i);
                if (Physics.Collision(ball, balls)||ball.getXPosition()> 850||ball.getYPosition()>550){//avoid starting collisions

                    continue;
                }

                balls.add(ball);
                i+=1;
            }

`

答案 2 :(得分:0)

我设法解决了这个问题,谢谢你们的帮助:)

               startCounter = 8;
                balls = new ArrayList<>();

             while (balls.size()<amount){
                 int i = 0;

                    diameter = random.nextInt(30) + 10 + 
                diameterRange;//generate diameter value for ball

                    startCounter = random.nextInt(800) + 100;
                    startCounterY = random.nextInt(400) +100;
                    BouncingBall ball = makeBall(startCounter, 
                   startCounterY, diameter, i);
                    if (Physics.Collision(ball, balls)||ball.getXPosition()> 
                    850||ball.getYPosition()>550){

                        continue;
                    }

                    balls.add(ball);
                    i++;

                  }