使用二维数组java存储点(x,y)
我想写一个像bouncingBall这样的程序。但我在屏幕上制造了N个障碍。每次球碰到障碍物时,障碍物就会消失并出现在另一个随机位置。我尝试使用二维数组来存储随机生成的障碍物点(x,y) 现在,如果我输入N>50,它会让我失去绑定。 但我想要的是存储从(0,0)到(50,50)的点…我应该如何使用二维数组来实现这一点 谢谢 导入java.util.ArrayList使用二维数组java存储点(x,y),java,arrays,Java,Arrays,我想写一个像bouncingBall这样的程序。但我在屏幕上制造了N个障碍。每次球碰到障碍物时,障碍物就会消失并出现在另一个随机位置。我尝试使用二维数组来存储随机生成的障碍物点(x,y) 现在,如果我输入N>50,它会让我失去绑定。 但我想要的是存储从(0,0)到(50,50)的点…我应该如何使用二维数组来实现这一点 谢谢 导入java.util.ArrayList public class BouncingBall { public static void main(String[
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);
}
}
}
公共类弹跳球{
公共静态void main(字符串[]args){
如果(参数长度<1){
System.out.println(“用法:javabouncingball N”);
系统出口(0);
}
int N=Integer.parseInt(args[0]);
如果(N>2500){
println(“用法:javabouncingball N假设用户输入-1表示N,那么x和y不会得到值,因为循环体不会运行
简单解决方法:为x和y指定默认值(例如0)
您需要同时初始化x
和y
:
double x = 0;
double y = 0;
发生ArrayIndexOutOfBoundsException
,因为您只将数组定义为50x50
double[]myArray=新的double[50][50]
然而,使用t
访问大于该索引的索引:
x = myArray[t][j];
你必须初始化你的局部变量,局部变量得不到默认值
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;
}
}
如果N>50
对于(int t=0;t)什么行会导致错误?请显示错误消息的完整文本。能否包含整个编译器错误。同样,为什么不向我们显示错误消息的文本?我更改了它,但仍然不起作用。这次它在line@jzhong5你能把stacktrace贴出来吗我们一直向@jzhong询问错误消息,但出于某种原因,他一直拒绝显示这些消息。@jzhong5气垫船的意思是一个正确的编译错误或异常消息,它给出了问题的详细解释、行号等。如果您仔细阅读这些消息,您将获得解决问题所需的所有信息你自己解释。@jzhong:你在解释错误,并没有像编译器给你的那样向我们显示消息本身。如果你不这样做,你就让我们猜测错误是什么,这不是一件好事。特别是因为你解释错了。谢谢,但这给了我另一个关于x行BoundIndex的问题=myArray[t][j];@jzhong5我想原因是N>=50(t循环从0到N).你是对的。我修改了它。但是。在这个例子中,我想要的是将点从0,0存储到50,50,这样总共有2500个点…我该怎么办?我想我使用二维数组的方式是错误的。将t从0循环到50,你将得到2500个点-我不确定我是否理解你的要求。@jzhong5,因为你最初的问题是现在解决了,我建议您花一点时间使用调试器,尝试了解哪些地方没有按预期工作。非常感谢。但是,在这个示例中,我想要的是存储0,0到50,50的点,因此总共有2500个点…我应该怎么做?我猜我使用二维数组的方式是错误的。现在,如果我得到n>50,它会给我带来错误bound@jzhong5显然,如果n>50,它会抛出绑定异常,因为数组的大小为50
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;
}
}