为什么子弹的射程大于1000

时间:2017-05-01 17:47:02

标签: java arrays

我的子弹阵列出现超出范围错误,我不知道为什么。我让它从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)) {
            }

        }

    }
}

3 个答案:

答案 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++) {

注意:当你得到一个异常时总是'读'它 - 它应该指出导致异常的代码行,这对解决错误很有帮助。 (并发布例外以帮助获得帮助)