gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 20:27:09 25 4
gpt4 key购买 nike

我的子弹数组出现超出范围的错误,但我不知道为什么。我让它从 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com