游戏结束错误由于if语句条件



使用的语言被称为" Processo ",这是我们学校使用的一种较弱且更简单的Processing版本,以可视化的方式介绍Java语法。整体目的类似于过马路,但当玩家避开汽车时,汽车会沿着屏幕向下移动。玩家只能水平移动,而敌人只能垂直移动。使用if语句,一旦敌人汽车到达用户可以看到的屏幕下方,敌人汽车的y变量将被重置为-1000到-100(屏幕上方)之间的随机y坐标。

起初程序运行良好,但很快就遇到了一个bug,导致"游戏结束";屏幕,尽管玩家没有与敌人发生碰撞。我认为问题在于碰撞条件(gamesscreen函数中的最后三个if语句)。

size (300, 400);
double playerX = mouseX-20;
double playerY = 320;
double playerWidth = 40;
double playerHeight = 40;
double enemy1X = 10;
double enemy1Y = random(-1000, -100);
double enemy1Width = 80;
double enemy1Height = 80;
double enemy2X = 110;
double enemy2Y = random(-1000, -100);
double enemy2Width = 80;
double enemy2Height = 80;
double enemy3X = 210;
double enemy3Y = random(-1000, -100);
double enemy3Width = 80;
double enemy3Height = 80;
int gamePage = 0;
void player() {
noStroke();
fill(rgb(0, 255, 0));
rect(mouseX-20, 320, 40, 40);
}
void enemy1() {
fill(rgb(255, 0, 0));
rect(enemy1X, enemy1Y, enemy1Width, enemy1Height);
}
void enemy2() {
rect(enemy2X, enemy2Y, enemy2Width, enemy2Height);
}
void enemy3() {
rect(enemy3X, enemy3Y, enemy3Width, enemy3Height);
}
void initalScreen() {
background(rgb(0, 0, 0));
text("Click to start", width/2, height/2);
}
void gameScreen() {
background(rgb(255, 255, 255));

if(enemy1Y >= 400) {
enemy1Y = random(-1000, -100);
} else {
enemy1Y += 5;
}
if(enemy2Y >= 400) {
enemy2Y = random(-1000, -100);
} else {
enemy2Y += 5;
}
if(enemy3Y >= 400) {
enemy3Y = random(-1000, -100);
} else {
enemy3Y += 5;
}
//collision
if (playerX + playerWidth > enemy1X && playerX < enemy1X + enemy1Width && playerY + playerHeight > enemy1Y && playerY < enemy1Y + enemy1Height) {
gamePage = 2;
} 
if (playerX + playerWidth > enemy2X && playerX < enemy2X + enemy2Width && playerY + playerHeight > enemy2Y && playerY < enemy2Y + enemy2Height) {
gamePage = 2;
} 
if (playerX + playerWidth > enemy3X && playerX < enemy3X + enemy3Width && playerY + playerHeight > enemy3Y && playerY < enemy3Y + enemy3Height) {
gamePage = 2;
} 

player();
enemy1();
enemy2();
enemy3();
}
void gameOverScreen() {
background(rgb(0, 0, 0));
textSize(30);
text("Game Over", width/2, height/2);
}
void startGame() {
gamePage = 1;
}

void mousePressed() {
if(gamePage == 0) {
startGame();
}
}
void draw() {
background(rgb(226, 225, 225));
if (gamePage == 0) {
initalScreen();
} else if (gamePage == 1) {
gameScreen();
} else if (gamePage == 2) {
gameOverScreen();
}
}

所以问题是

double playerX = mouseX-20;

并没有被循环更新,相反,你实际上只是调用它一次,使程序认为它仍然在同一个地方。你可以通过将上面的代码移动到gameScreen()方法中来解决这个问题,这样当你下次移动玩家时,它的位置就会更新。它应该是这样的

void gameScreen() {
background(rgb(255, 255, 255));
double playerX = mouseX-20; // Moved Variable
if(enemy1Y >= 400) {
enemy1Y = random(-1000, -100);
} else {
enemy1Y += 5;
}
if(enemy2Y >= 400) {
enemy2Y = random(-1000, -100);
} else {
enemy2Y += 5;
}
if(enemy3Y >= 400) {
enemy3Y = random(-1000, -100);
} else {
enemy3Y += 5;
}
//collision
if (playerX + playerWidth > enemy1X && playerX < enemy1X + enemy1Width && playerY + playerHeight > enemy1Y && playerY < enemy1Y + enemy1Height) {
gamePage = 2;
} 
if (playerX + playerWidth > enemy2X && playerX < enemy2X + enemy2Width && playerY + playerHeight > enemy2Y && playerY < enemy2Y + enemy2Height) {
gamePage = 2;
} 
if (playerX + playerWidth > enemy3X && playerX < enemy3X + enemy3Width && playerY + playerHeight > enemy3Y && playerY < enemy3Y + enemy3Height) {
gamePage = 2;
} 
player();
enemy1();
enemy2();
enemy3();
}

然后从顶部删除变量,这样就不会有两个相同的变量。希望这对你有帮助!

最新更新