-3

我正在尝试编写一个类似 bouncingBall 的程序。但我在屏幕上生成了 N 个障碍物。每次球碰到障碍物时,障碍物就会消失并出现在另一个随机位置。我正在尝试使用二维数组来存储随机生成的障碍点(x,y)。

现在,如果我输入 N>50,它会让我出站。但我想要的是存储从(0,0)到(50,50)的点......我应该用二维数组做什么来实现这一点?

谢谢!

导入 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

您需要同时初始化xy

double x = 0;
double y = 0;

ArrayIndexOutOfBoundsException正在发生,因为您仅将数组定义为 50x50

双[][] myArray = 新双[50][50];

然而访问一个大于使用的索引t

x = myArray[t][j]; 
于 2012-09-26T21:20:59.890 回答
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 回答