播放器在C ++中检测阵列中的墙

问题描述

我希望玩家“ 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并非没有界限。