-3

私はbouncingBallのようなプログラムを書こうとしています。しかし、私は画面にN個の障害物を生成しました。ボールが障害物に触れるたびに、障害物は消え、別のランダムな場所に現れます。2次元配列を使用して、ランダムに生成された障害物のポイント(x、y)を格納しようとしています。

今、N> 50と入力すると、アウトオブバウンドになります。しかし、私が欲しいのは、(0,0)から(50,50)までのポイントを格納することです。2次元配列でこれを達成するにはどうすればよいですか?

ありがとう!

import java.util.ArrayList;

public class BouncingBall { 

    public static void main(String[] args) {

        if (args.length < 1) {
            System.out.println("Usage: java BouncingBall N");
            System.exit(0);
        }

        int N = Integer.parseInt(args[0]); 
        if (N > 2500) {
            System.out.println("Usage: java BouncingBall N<=2500");
            System.exit(0);
        }
        double[][] myArray = new double[50][50];

        // set the scale of the coordinate system
        StdDraw.setXscale(-1.0, 1.0);
        StdDraw.setYscale(-1.0, 1.0);

        // initial values
        double rx = 0.480, ry = 0.860;     // position
        double vx = 0.015, vy = 0.023;     // velocity
        double radius = 0.02;              // radius       
        double x;
        double y;
        double a[] = new double[2];

        StdDraw.setPenColor(StdDraw.WHITE);
        StdDraw.filledSquare(0, 0, 1.0);
        StdDraw.setPenColor(StdDraw.BLACK); 
        for(int i=0; i <= N; i++){
            x = 2.0*(double)Math.random()-1.0;
            y = 2.0*(double)Math.random()-1.0;
            for   (int  t=0;t <50;t++){ 
                for   (int   j=0;j <50;j++){ 
                      myArray[t][j]= x; 
                      myArray[j][t]= y; 
                } 
            } 
            StdDraw.filledSquare(x, y, 0.02);
            }

        // main animation loop
        while (true)  { 

            // bounce off wall according to law of elastic collision
            if (Math.abs(rx + vx) > 1.0 - radius) vx = -vx;
            if (Math.abs(ry + vy) > 1.0 - radius) vy = -vy;
            // clear the background   
            StdDraw.setPenColor(StdDraw.WHITE);
            StdDraw.filledSquare(0, 0, 1.0); 
            StdDraw.clear(); 

       StdDraw.setPenColor(StdDraw.BLACK);  

       for(int t=0; t <= N; t++){
           for   (int   j=0;j <50;j++){ 
                 x = myArray[t][j]; 
                 y = myArray[j][t]; 
           } 
        if ((Math.abs(rx + vx) > x - radius)||(Math.abs(ry + vy) > y - radius))
        {  //if the ball touch the square
            vx = -vx;
            vy = -vy;
            if (args.length == 2 && args[1].equals("-d")){
            x = 2.0*(double)Math.random()-1.0;  //new random x
            y = 2.0*(double)Math.random()-1.0;  //new random y
            }else{
                ;
            }
            StdDraw.filledSquare(x, y, 0.02);
            }
        else{
            StdDraw.filledSquare(x, y, 0.02); //if not touched, keep it.
            }
        }

       rx = rx + vx; 
       ry = ry + vy;

       StdDraw.filledCircle(rx, ry, radius); 
            // display and pause for 20 ms
        StdDraw.show(20); 
        }
    }  
}
4

3 に答える 3

1

ユーザーがNに-1を入力すると、ループ本体が実行されないため、xとyは値を取得しないと想像してください。

簡単な回避策:デフォルト値をxとyに割り当てます(たとえば0)

double x = 0;
double y = 0;
于 2012-09-26T21:20:50.110 に答える
0

ローカル変数を初期化する必要があります。ローカル変数はデフォルト値を取得しません

   int double x=0.0;
   int double y=0.0;

コンパイラエラーを解決します。

if N>50
  for   (int  t=0;t <50;t++){ 
                for   (int   j=0;j <50;j++){ 
                      myArray[t][j]= x; // ArrayIndexOutOfBound Exection occurs here 
                      myArray[j][t]= y; 
                } 
            } 
于 2012-09-26T21:23:43.600 に答える
0

との両方を初期化する必要がありxますy

double x = 0;
double y = 0;

ArrayIndexOutOfBoundsException配列を 50x50 に定義するだけであるため、発生しています

double[][] myArray = new double[50][50];

を使用してそれより大きいインデックスにアクセスしますt

x = myArray[t][j]; 
于 2012-09-26T21:20:59.890 に答える