2017-09-07 9 views
1

私はこのコードに若干の相違がありますが、私のコードは少し違っていると思いますが、ほとんど終了していると感じています。ランダムな開始位置ボールのために衝突を避ける

私の目標は、最初に衝突することなく、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); 
} 

は現在、これはほとんど、完璧に動作しますその結果、ユーザーが指定するよりもボールが少なくなります。

私はi--を追加しようとしました。 if文の内容と同じですが、これはうまくいかず、ボールはこの場合誤って生成されるようです。

感謝:) whileループに

+0

私は(索引)がまだ増加しているために、量を増やすか、またはwhileループに変更する方が良いでしょう。 – IddoE

答えて

2

変更して、すなわち:ループの場合

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

質問に書式が不十分な場合は、 – Michael

+0

goodBallsをどこにどこで初期化すればよいですか? –

+0

@EdTaylor私は開始を訂正しました。それが助けられたら答えを受け入れることができますか? – yossico

1

は、最初のループの前に決定されたループの量を持っています。より良い方法は、whileループがメモリ位置を介してすべてのループの開始時に条件を検証するので、for (int i = 0; i < amount; i++)を `while i < amount 'に置き換え、条件が満たされた場合にのみカウントを増やすことです。

コード ボールは=新しいArrayListを<>();; = 8この `STARTCOUNTERのようになります

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

`

+0

この方法は大きなバグを引き起こし、ボールはちょうど立ち往生します:S –

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

        } 
関連する問題