问题描述
我希望玩家“ P”能够在地图上移动,但不能移动到墙壁上或从墙壁上过去。在执行一个if语句检查墙壁之前,代码将正常工作。
我这样做的想法是,如果玩家朝某个方向移动,请首先检查该方向是否有墙。如果有一堵墙,请告知玩家。 当我这样做时,发生了许多问题。玩家有时可以检测到墙壁,有时则不能。例如,如果我先运行程序并移至右侧的“ e”,它会告诉我有一堵墙,但是一旦我移至左侧的“ w”并移回右侧,它就会消失到墙上。 同样,将“ n”和“ s”上下移动也是一个问题,因为它会上升两次,而不是一次。
为什么要这样做,我该如何解决?
bool running = true;
int px = 2;
int py = 7;
char player = 'P';
//map
char map[8][8] = {
{ '#','#','#' },{ '#',' ','#' }
};
// print map
void printMap() {
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 8; j++) {
if (j == px && i == py) {
cout << 'P';
}
else {
cout << map[i][j] << " ";
}
}
cout << endl;
}
}
// player movement
void playerMove() {
char move;
cin >> move;
if (move == 'e') {
if (map[py][++px] == '#') {
cout << "there's a wall here!";
}
else {
map[py][px] = ' ';
map[py][++px] = player;
system("cls");
printMap();
}
}
if (move == 'w') {
if (map[py][--px] == '#') {
cout << "there's a wall here!";
}
else {
map[py][px] = ' ';
map[py][--px] = player;
system("cls");
printMap();
}
}
if (move == 'n') {
if (map[--py][px] == '#') {
cout << "there's a wall here!";
}
else {
map[py][px] = ' ';
map[--py][px] = player;
system("cls");
printMap();
}
}
if (move == 's') {
if (map[++py][px] == '#') {
cout << "there's a wall here!";
}
else {
map[py][px] = ' ';
map[++py][px] = player;
system("cls");
printMap();
}
}
}
解决方法
问题很可能是您检查壁生细菌的情况。
例如,如果我们查看map[py][++px] == '#'
,就会看到您修改了px
,因此即使该位置是一堵墙,玩家的位置也会被修改。
这也会导致else
部分出现问题,因为您随后“清除”玩家不在的位置,并再次修改px
。
通过使用加法来解决它:map[py][px + 1] == '#'
。
正如我已经提到的,添加边界检查以确保例如px + 1
并非没有界限。