2017-05-01 11 views
0

Ich bekomme einen Fehler außerhalb der Reichweite für meine Kugeln Array und ich weiß nicht warum. Ich habe es i von 0 bis 1000 durchlaufen, aber es sagt, es ist außerhalb der Reichweite. Ich habe das Array auch auf 1000 eingestellt. Ich verstehe nicht, warum ich größer als 1000 bin. Danke!Warum ist der Bereich der Kugeln größer als 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)) { 
      } 

     } 

    } 
} 
+1

Müssen Sie uns wirklich so viel Code zeigen? Sie sollten wissen, in welcher Zeile der Fehler auftritt. –

+0

Es wird nicht der gesamte Code benötigt, wenn Sie keine anderen Klassen wie "StdDraw" oder "StdAudio" anzeigen. –

+0

'double [] bulletsX = new double [1000];' – matt

Antwort

1

Zum Beispiel haben Sie eine Bedingung:

lastBullet++; 
lastMeteor++; 

if (lastBullet >= 1000) { 
    StdDraw.text(.5, .5, "You lost, because you ran out of ammo. Press space to play again!"); 
    gameOver = true; 
} 

hier nur lastBullet überprüfen und es kann mehr sein, versuchen Sie es tun, zum Beispiel:

if (lastBullet >= 999) { 
1

Zähle die Anzahl der Zahlen von 0-10. Sie werden mit 11 enden, nicht 10, wie Sie vielleicht erwarten. In gleicher Weise muss Ihr Array als geschaffen werden:

double[] bulletsX = new double[1001]; 

wenn Sie es wollen bis 1000 gehen, da Arrays von 0 aufwärts indiziert sind.

Alternativ, wenn Sie Ihre Kugeln wollen 1000 sein (eine schönere Zahl), dann können Sie Ihren Zustand ändern zu sein:

if(lastBullet==999) 
        { 
         StdDraw.text(.5,.5,"You lost, because you ran out of ammo. Press space to play again!"); 
         gameOver = true; 
        } 

Auf diese Weise beginnt Ihr Array bei 0 und geht bis 999, bei welcher Punkt 1000 Kugeln wurden verbraucht und das Spiel ist vorbei.

1

Wenn Sie eine Ausnahme erhalten, wäre es hilfreich, sie zu sehen - Ausnahmen zeigen normalerweise immer an, welche Codezeile sie verursacht.

Ich gehe davon aus, dass Sie ein ArrayOutOfBoundsException irgendwo in dieser Schleife bekommen:

for (int i = 0; i < bulletsX.length; i++) { 
     for (int j = 0; j < meteorsX.length; i++) { 
      ... 
     } 
    } 

, weil die inneren Schleife Schritte i statt j. Dies führt dazu, dass die innere Schleife niemals normal endet, da nicht inkrementiert wird und i größer als bulletsX.length ist, was die Ausnahme bei bulletsX[i] innerhalb der Schleife verursacht.

Mit anderen Worten, ändern die innere Schleife zu

 for (int j = 0; j < meteorsX.length; j++) { 

Hinweis: Wenn Sie eine Ausnahme immer bekommen, ‚lesen‘ - es in dem Codezeile angeben, sollte die Ausnahme verursacht wird, was sehr hilfreich ist um den Fehler zu beheben. (und poste die Ausnahme, um Hilfe zu bekommen)

Verwandte Themen