【问题标题】:Random Start Location For Balls, avoiding Collisions球的随机起始位置,避免碰撞
【发布时间】:2018-02-15 21:59:56
【问题描述】:

我知道存在一些与此类似的问题,但是我的代码略有不同,我觉得它快完成了我只需要稍作调整,但我不确定到底是什么。

我的目标是在 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 语句的内容,但这不起作用,并且在这种情况下,球似乎生成不正确。

谢谢:)

【问题讨论】:

  • 发生这种情况是因为 i(索引)仍在增加,要么增加数量,要么将其更改为 while 循环(最好更改)

标签: java swing random


【解决方案1】:

我设法解决了,感谢您的帮助:)

               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++;

                  }

【讨论】:

    【解决方案2】:

    改为while循环,即:

    startCounter = 8;
    balls = new ArrayList<>();
    int goodBalls=0;
    while (goodBalls<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
        balls.add(ball);
        goodBalls++;
      }
    }
    

    【讨论】:

    • 问题中的格式不佳并不是您答案格式不佳的借口。
    • @EdTaylor 我已经更正了启蒙,如果有帮助你能接受答案吗?
    【解决方案3】:

    For 循环具有在第一个循环之前确定的循环数量。更好的方法是将for (int i = 0; i &lt; amount; i++) 替换为 `while i

    代码应该是这样的 `startCounter = 8; 球 = 新的 ArrayList();

                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;
                }
    

    `

    【讨论】:

    • 这个方法会导致大bug,现在小球卡住了:S
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-03
    • 2019-04-03
    • 2012-11-27
    • 1970-01-01
    • 2015-08-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多