我的子弹阵列出现超出范围错误,我不知道为什么。我让它从0到1000迭代i,但它说它超出了范围。我也将数组设置为1000。我不明白为什么我大于1000.谢谢!
import java.awt.event.KeyEvent;
public class VideoGame {
public static void main(String[] args) {
while (true) {
StdDraw.enableDoubleBuffering();
int score = 0;
// background variable
double backX = .5;
double backY = .5;
double backWidth = 1.25;
double backLength = 1.25;
// draw player coordinates
double playerX = .5;
double playerY = .2;
double playWidth = .1;
double playLength = .1;
// bullets array
double[] bulletsX = new double[1000];
double[] bulletsY = new double[1000];
double[] bulletsDX = new double[1000];
double[] bulletsDY = new double[1000];
boolean[] visible = new boolean[1000];
int lastBullet = 0;
boolean mouseWasPressed = false;
double bWidth = 0.05;
double bLength = .05;
// meteors array
double[] meteorsX = new double[10000];
double[] meteorsY = new double[10000];
double[] meteorsDX = new double[10000];
double[] meteorsDY = new double[10000];
boolean[] meteorsVisible = new boolean[10000];
int lastMeteor = 0;
double meteorWidth = .15;
double meteorLength = .15;
/* double[] meteorsRightX = new double[10000];
double[] meteorsRightY = new double[10000];
double[] meteorsRightDX = new double[10000];
double[] meteorsRightDY = new double[10000];
boolean[] meteorsRightVisible = new boolean[10000];
int lastRightMeteor = 0;
double rightMeteorWidth = .08;
double rightMeteorLength = .08;*/
for (int i = 0; i < 5000; i++) {
meteorsX[i] = Math.random() * (-0.1 - -0.2) + -0.2;
meteorsY[i] = Math.random() * (1.0 - 0.5) + 0.5;
meteorsDX[i] = Math.random() * (0.01 - -0.01) + -0.01;
meteorsDY[i] = Math.random() * (0.0005 - -0.002) + -0.002;
}
for (int i = 5000; i < 10000; i++) {
meteorsX[i] = Math.random() * (1.2 - 1.1) + 1.1;
meteorsY[i] = Math.random() * (1.0 - 0.5) + 0.5;
meteorsDX[i] = Math.random() * (-0.01 - -0.01) - 0.01;
meteorsDY[i] = Math.random() * (0.0008 - 0.002) + -0.002;
}
//StdDraw.picture(backX, backY, "GameBackground.png");
boolean gameOver = false;
while (gameOver == false) {
StdDraw.clear();
// draw background
StdDraw.picture(backX, backY, "GameBackground.png", backWidth, backLength);
StdDraw.picture(playerX, playerY, "GamePlayer.png", playWidth, playLength);
// keep score
//move character
if (StdDraw.isKeyPressed(KeyEvent.VK_W)) {
playerY += .005;
} else if (StdDraw.isKeyPressed(KeyEvent.VK_S)) {
playerY -= .005;
} else if (StdDraw.isKeyPressed(KeyEvent.VK_A)) {
playerX -= .005;
} else if (StdDraw.isKeyPressed(KeyEvent.VK_D)) {
playerX += .005;
}
if (StdDraw.mousePressed() && !mouseWasPressed) {
mouseWasPressed = true;
visible[lastBullet] = true;
meteorsVisible[lastMeteor] = true;
StdAudio.play("shoot.wav");
bulletsX[lastBullet] = playerX;
bulletsY[lastBullet] = playerY;
bulletsDX[lastBullet] = 0;
bulletsDY[lastBullet] = .02;
lastBullet++;
lastMeteor++;
if (lastBullet >= 1000) {
StdDraw.text(.5, .5, "You lost, because you ran out of ammo. Press space to play again!");
gameOver = true;
}
}
if (!StdDraw.mousePressed()) {
mouseWasPressed = false;
}
//draw the bullets
for (int i = 0; i < bulletsX.length; i++) {
if (visible[i]) {
StdDraw.picture(bulletsX[i], bulletsY[i] + .09, "lazer.png", bWidth, bLength);
bulletsX[i] += bulletsDX[i];
bulletsY[i] += bulletsDY[i];
}
}
for (int i = 0; i < bulletsX.length; i++) {
for (int j = 0; j < meteorsX.length; i++) {
//draw the meteors
if (meteorsVisible[j] == true) {
StdDraw.picture(meteorsX[j], meteorsY[j], "meteor.png", meteorLength, meteorWidth);
// StdDraw.picture(meteorsX[5000 + j], meteorsY[5000 +j],"meteor.png", meteorLength, meteorWidth);
meteorsX[j] += meteorsDX[j];
meteorsY[j] += meteorsDY[j];
meteorsX[5000 + j] += meteorsDX[j];
meteorsY[5000 + j] += meteorsDY[j];
}
/* if(meteorsVisible[i])
{
StdDraw.picture(meteorsX[i], meteorsY[i],"meteor.png", meteorLength, meteorWidth);
meteorsX[i] += meteorsDX[i];
meteorsY[i] += meteorsDY[i];
}*/
// collision detection
double xDiff = playerX - meteorsX[j];
double yDiff = playerY - meteorsY[j];
double xDiffBullets = bulletsX[i] - meteorsX[j];
double yDiffBullets = bulletsY[i] - meteorsY[j];
double xDiff2 = playerX - meteorsX[5000 + j];
double yDiff2 = playerY - meteorsY[5000 + j];
double xDiffBullets2 = bulletsX[i] - meteorsX[5000 + j];
double yDiffBullets2 = bulletsY[i] - meteorsY[5000 + j];
double meteorRadius = .02;
double playerRadius = .03;
double bulletRadius = .42;
double distance = Math.sqrt(xDiff * xDiff + yDiff * yDiff);
double distanceB = Math.sqrt(xDiffBullets * xDiffBullets + yDiffBullets * yDiffBullets);
double distance2 = Math.sqrt(xDiff2 * xDiff2 + yDiff2 * yDiff2);
double distanceB2 = Math.sqrt(xDiffBullets2 * xDiffBullets2 + yDiffBullets2 * yDiffBullets2);
if (distance < (playerRadius + meteorRadius) || distance2 < (playerRadius + meteorRadius)) {
StdDraw.setPenColor(StdDraw.WHITE);
StdDraw.picture(playerX, playerY, "explosion.png", .3, .3);
StdDraw.text(0.5, 0.85, "You lose. Pess space to play again!");
StdAudio.play("shipExplosion.wav");
StdDraw.show();
gameOver = true;
}
if (distanceB < (bulletRadius + meteorRadius) || distanceB2 < (bulletRadius + meteorRadius)) {
score++;
meteorsVisible[i] = false;
}
StdDraw.setPenColor(StdDraw.WHITE);
StdDraw.text(.85, .95, "Score:");
StdDraw.text(.95, .95, String.valueOf(score));
}
}
StdDraw.show();
StdDraw.pause(1000 / 60);
}
while (!StdDraw.isKeyPressed(KeyEvent.VK_SPACE)) {
}
}
}
}
答案 0 :(得分:1)
例如,您有条件:
lastBullet++;
lastMeteor++;
if (lastBullet >= 1000) {
StdDraw.text(.5, .5, "You lost, because you ran out of ammo. Press space to play again!");
gameOver = true;
}
这里只检查lastBullet,它可以更多,尝试这样做,例如:
if (lastBullet >= 999) {
答案 1 :(得分:1)
从0-10开始计算数字。你最终会得到11,而不是你想象中的10。同样,您的数组需要创建为:
double[] bulletsX = new double[1001];
如果你想要它达到1000,因为数组从0向上编入索引。
或者,如果您希望您的项目符号为1000(更好的数字),那么您可以将您的条件更改为:
if(lastBullet==999)
{
StdDraw.text(.5,.5,"You lost, because you ran out of ammo. Press space to play again!");
gameOver = true;
}
这样,你的阵列从0开始并进入999,此时已经消耗了1000个子弹并且游戏结束了。
答案 2 :(得分:1)
如果您收到异常,那么查看它会很有帮助 - 例外通常总是会显示导致它们的代码行。
我假设你在这个循环中的某个地方得到ArrayOutOfBoundsException
:
for (int i = 0; i < bulletsX.length; i++) {
for (int j = 0; j < meteorsX.length; i++) {
...
}
}
因为内部循环增加i
而不是j
。这导致内部循环永远不会正常终止,因为j
没有递增,i
将大于bulletsX.length
导致循环内bulletsX[i]
处的异常。
换句话说,将内循环更改为
for (int j = 0; j < meteorsX.length; j++) {
注意:当你得到一个异常时总是'读'它 - 它应该指出导致异常的代码行,这对解决错误很有帮助。 (并发布例外以帮助获得帮助)