java - 为什么子弹射程大于1000

标签 java arrays

我的子弹数组出现超出范围的错误,但我不知道为什么。我让它从 0 - 1000 迭代 i,但它说它超出了范围。我也将数组设置为 1000。我不明白为什么 i 大于 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)) {
            }

        }

    }
}

最佳答案

例如,您有一个条件:

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) {

关于java - 为什么子弹射程大于1000,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43723746/

相关文章:

java.lang.IllegalArgumentException : Property 'transactionManager' is required 异常

javascript - 对多个数组排序后返回数据

arrays - perl qw() 函数分配行而不是单词

arrays - 如何使用另一个类的变量打印一个类的元素?

Java,以下哪种方法更能实现更快的响应和内存管理? 100 个类的对象或 1 个带有 arrayList 的对象

java - 使用 Apache Camel 的 JMS/JNP 连接

java - 使用 Protocol Buffer 和 Netty 4.1.6

用于编译和执行Java程序的Java代码

java - ObjectMapper.readTree 不会在无效输入时抛出 IOException

c# - 创建一个全为-1的数组;