我知道现有一些类似的问题,但我的代码略有不同,我觉得它差不多完成了我只需要稍微调整一下,但我不确定是什么。
我的目标是在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语句的内容,但是这不起作用,并且在这种情况下球看起来似乎不正确。
感谢:)
答案 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++;
}