我正在制作一个游戏,当你向下移动屏幕时,你可以避开由'X'组成的墙壁,如果你击中X,你将失去一个盾牌并继续掠过X而不会再失去任何盾牌,直到你弹出一个没有X的字符空间。
然而,当运行下面的代码以及其他一些不必要的代码时,如果我在Visual Studio中停止了它,那么它就会完美地运行,但是当我在代码运行时开始撞到'X'墙并且墙壁移动得非常快时不能正常工作,你最终会进行耕作,但你失去了过程中的所有盾牌,当你“犁过”它们时,X不会消失。
以下是代码:
char coll; // the buffer for the collided char
if (theScreen.check_collision(player, xMove, yMove, coll) != true) {
// no collision
// get rid of old player placing
theScreen.Insert(' ', player.get_location()[0], player.get_location()[1]);
// put in new charater placing
player.move(xMove, yMove);
theScreen.Insert(player);
numb_coll = 0;
} else {
// collision
if (coll == 'X' && player.get_shield() > 0) {
for (int I = 0; I < numb_coll && numb_coll < player.get_location()[1]; I++) {
theScreen.Insert(' ', player.get_location()[0],
player.get_location()[1] - (I + 1));
}
if (numb_coll == 0)
player.set_shield(player.get_shield() - 1);
numb_coll++;
theScreen.Insert(player);
}
if (coll == 'X' && player.get_shield() <= 0)
dead = true;
};
答案 0 :(得分:6)
我建议对代码进行彻底的重新组织。此例程似乎与绘制屏幕上的播放器以及更改播放器的盾牌评级有关。我相信如果您将播放器的显示与播放器的修改分开,您的代码将更易于阅读和维护。
考虑一下:
theScreen.check_collision(player, xMove, yMove, coll) {
/* your current check_collision code, which I hope is correct */
if (collision)
player.destroy_a_shield();
return collision;
}
在player
对象中:
player.destroy_a_shield() {
self.shield--;
if (self.shield == 0)
player.dead = true;
}
然后这段代码看起来更像是:
if (theScreen.check_collision(player, xMove, yMove, coll) {
if (player.dead)
theScreen.insert("Ooops. Game over. Better luck next life.");
else {
for (int I = 0; I < numb_coll && numb_coll < player.get_location()[1]; I++) {
theScreen.Insert(' ', player.get_location()[0],
player.get_location()[1] - (I + 1));
}
numb_coll++;
theScreen.Insert(player);
}
} else {
theScreen.Insert(' ', player.get_location()[0], player.get_location()[1]);
player.move(xMove, yMove);
theScreen.Insert(player);
}
这些修改的想法(以伪代码呈现,因为我很懒,因为我不知道你的代码的其余部分是什么样子)是将屏幕分开 display 来自游戏 mechanics 。 (您之前可能已经听过“模型 - 视图 - 控制器”一词 - 此模式准确地描述了我的建议。将业务规则移出视图。 )