7

質問が明確でない場合は申し訳ありませんが、別の言い方が思いつきませんでした。

これは、BlueJ で今週末ずっと取り組んでいるクラスの課題です。ユーザーがバウンドするボールの数を選択できるように、メソッド (バウンス) を変更する必要があります。

その他の要件は次のとおりです。ボールはさまざまなサイズにする必要があり、バウンドする前に画面の上部に沿って一列に表示する必要があります。

これを行うには、コレクション (ArrayList、HashMap、HashSet) を使用する必要があります。これまでのところ、HashMap を使用して、画面の上半分のランダムな位置に配置されるランダムなサイズの「ボール」をユーザーに選択させることができました。

画面上部の位置から各ボールをバウンドさせようとすると、右側で終了してスタックしてしまいます。ユーザーが選択した数のボールがループするまで、コードに 1 つのボールを描画させ、それをバウンスさせてから別のボールを描画させ、バウンスさせることができます。

他に 2 つのクラスがあります。1 つはキャンバスを描画するクラス、もう 1 つはボールを描画して移動するクラスです。どちらも私が触れることはできません。

私が間違ったやり方をしていることはおそらく私の目の前にありますが、私はこのコードを長い間見つめていたので、質問したいと思いました.

私の現在のバージョンのコードは次のようになります。

import java.awt.Color;
import java.util.HashMap;
import java.util.Random;
import java.util.Iterator;

public class BallDemo   
{
    private Canvas myCanvas;

    private HashMap<Integer, BouncingBall> ballMap;

    private int n;

    private int j;

    private BouncingBall ball;

    /**
     * Create a BallDemo object. Creates a fresh canvas and makes it visible.
     */
    public BallDemo()
    {
        myCanvas = new Canvas("Ball Demo", 600, 500);
    }

そして、ボールをバウンスするために編集する必要があるメソッド:

 public void bounce(int numBalls)
    {
        ballMap = new HashMap<Integer, BouncingBall>();
        int ground = 400;   // position of the ground line
        Random randomD1 = new Random();
        Random xpos = new Random();


        myCanvas.setVisible(true);

        // draw the ground
        myCanvas.drawLine(50, ground, 550, ground);

        // add balls to HashMap
           for(n = 0; n < numBalls; n++) {
         ballMap.put(numBalls, (ball = new BouncingBall(xpos.nextInt(300), 50, randomD1.nextInt(200), Color.BLUE, ground, myCanvas)));
         //
            for(j= 0; j < ballMap.size(); j++) {
                ball.draw();
                boolean finished =  false;
                   while(!finished) {
                     myCanvas.wait(50);           // small delay
                     ball.move(); // bounce the ball

                        // stop once ball has travelled a certain distance on x axis
                          if(ball.getXPosition() >= 550) {
                                    finished = true;
                                }



                        }
            }






        }
       }
}

私は HashMap を使用して正しい行にいますか? キーと値の組み合わせが最善の方法のように思えました。コレクションに配置されたアイテムを何らかの方法で反復処理して、move() メソッドを使用してバウンスさせる必要があると思います。しかし、最初に、ユーザーが定義したボールの数に関係なく、ボールが画面の上部に一列に並んでいる必要があります。

私はプログラミングが初めてで、困惑しています。

助けてくれてありがとう!

4

1 に答える 1

3

@16dots は部分的に正しいですが、変更されないためballMap.put(numBalls, ball);、毎回ハッシュ マップに同じ値を上書きします...numBalls

キーは一意である必要があります。

それは読むべきです...

for (int n; n < numBalls; n++) {
    BouncingBall ball = new BouncingBall(xpos.nextInt(300), 50,
            randomD1.
            nextInt(200), Color.BLUE, ground, myCanvas);
    ballMap.put(n, ball);
}

boolean finished = false;
while (!finished) {
    finished = true;
    for (int j = 0; j < ballMap.size(); j++) {
        BouncingBall selectedBall = ballMap.get(j);
        selectedBall.draw();
        // Only move the ball if it hasn't finished...
        if (selectedBall.getXPosition() < 550) {
            selectedBall.move(); // bounce the ball

            // stop once ball has travelled a certain distance on x axis
            if (selectedBall.getXPosition() < 550) {
                finished = false;
            }
        }
    }
    myCanvas.wait(50);           // small delay
}
于 2012-10-29T19:28:58.007 に答える