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

C++ 播放器在C+中检测阵列中的墙+;,c++,arrays,multidimensional-array,C++,Arrays,Multidimensional Array,我希望我的播放器“p”能够在地图上移动,但不能移动到墙上或越过墙。在我实现一个if语句来检查墙之前,代码将正常工作 我的思考过程是,如果玩家朝某个方向移动,首先检查该方向是否有墙。如果有墙,那么让玩家知道。 当我这样做的时候,出现了很多问题。玩家有时能探测到墙,有时却不能。例如,如果我首先运行程序并移到右边的“e”,它会让我知道有一堵墙,但一旦我移到左边的“w”并移回右边,它就会移到墙上。 同样,向上移动“n”和向下移动“s”也是一个问题,因为它会向上移动两次,而不是一次 它为什么会这样做?我如

我希望我的播放器“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();
        }
    }
}


bool running=true;
int-px=2;
int-py=7;
charplayer='P';
//地图
字符映射[8][8]={
{ '#','#','#','#','#','#','#','#' },
{ '#',' ',' ',' ','#',' ',' ','#' },
{ '#',' ',' ',' ','#',' ',' ','#' },
{ '#','#','#',' ','#',' ',' ','#' },
{ '#',' ',' ',' ','#',' ',' ','#' },
{ '#',' ','#','#','#',' ',' ','#' },
{ '#',' ',' ',' ',' ',' ',' ','#' },
{ '#','#',' ','#','#','#','#','#' }
};
//打印地图
void printMap(){
对于(int i=0;i<8;i++){
对于(int j=0;j<8;j++){
如果(j==px&&i==py){

cout问题很可能是如何检查壁粘连

例如,如果我们查看
map[py][++px]='#'
,我们会看到您修改了
px
,因此即使该位置是一面墙,也会修改播放器的位置

这也会导致
else
部分出现问题,因为您随后会“清除”播放机不在的位置,并再次修改
px

用加法来解决它:
map[py][px+1]='#'


正如我已经提到的,添加边界检查以确保例如
px+1
没有超出边界。

if(map[py][++px]…
您不希望这样。尝试
px+1
。您的
playerMove()
函数没有任何边界检查。您的打印地图可以明智地显示没有播放器的播放器(或“空”)正在写入地图。所以,不要。你是对的,但有趣的是,一旦墙检查被修复,边界检查只需要在地图下边缘的墙间隙处进行。