【问题标题】:How to reset X back into its original position within the arrays?如何将 X 重置回其在数组中的原始位置?
【发布时间】:2017-04-14 20:16:27
【问题描述】:

过去几周我一直在制作迷宫游戏,并在 3 天前完成了编码。我一直在测试游戏的任何错误,一切似乎都很好,但是我遇到的一个主要问题是,如果我想在一次游戏中玩相同的关卡,游戏就会崩溃。例如,我玩关卡 1 和 2,如果我在主菜单上再次选择其中任何一个,游戏就会出现空白屏幕并崩溃。 我已将错误归入我的三个函数,它们如下:

void position(int lvl) {
    int x, y;
    if (lvl == 1) {
        x = startingPointX(lvl, y);
        lvl1[x][y] = me;
    }
    if (lvl == 2) {
        x = startingPointX(lvl, y);
        lvl2[x][y] = me;
    }
    if (lvl == 3) {
        x = startingPointX(lvl, y);
        lvl3[x][y] = me;
    }
    if (lvl == 4) {
        x = startingPointX(lvl, y);
        lvl4[x][y] = me;
    }
    if (lvl == 5) {
        x = startingPointX(lvl, y);
        lvl5[x][y] = me;
    }
    if (lvl == 6) {
        x = startingPointX(lvl, y);
        lvl6[x][y] = me;
    }
}

这是第二个功能:

int positionFinder(int lvl, int &y) {
    int xCoord;
    if (lvl == 1) {
        /*This is for level 1*/
        for (int i = 0; i != 20; ++i) {
            for (int j = 0; j != 20; ++j) {
                if (lvl1[i][j] == '@') {
                    xCoord = i;
                    y = j;
                    return xCoord;
                }
            }
        }
    }
    if (lvl == 2) {
        /*This is for level 2*/
        for (int i = 0; i != 20; ++i) {
            for (int j = 0; j != 20; ++j) {
                if (lvl2[i][j] == '@') {
                    xCoord = i;
                    y = j;
                    return xCoord;
                }
            }
        }
    }
    if (lvl == 3) {
        /*This is for level 3*/
        for (int i = 0; i != 20; ++i) {
            for (int j = 0; j != 20; ++j) {
                if (lvl3[i][j] == '@') {
                    xCoord = i;
                    y = j;
                    return xCoord;
                }
            }
        }
    }
    if (lvl == 4) {
        /*This is for the solution of level 1*/
        for (int i = 0; i != 20; ++i) {
            for (int j = 0; j != 20; ++j) {
                if (lvl4[i][j] == '@') {
                    xCoord = i;
                    y = j;
                    return xCoord;
                }
            }
        }
    }
    if (lvl == 5) {
        /*This is for the solution of level 2*/
        for (int i = 0; i != 20; ++i) {
            for (int j = 0; j != 20; ++j) {
                if (lvl5[i][j] == '@') {
                    xCoord = i;
                    y = j;
                    return xCoord;
                }
            }
        }
    }
    if (lvl == 6) {
        /*This is for the solution of level 3*/
        for (int i = 0; i != 20; ++i) {
            for (int j = 0; j != 20; ++j) {
                if (lvl6[i][j] == '@') {
                    xCoord = i;
                    y = j;
                    return xCoord;
                }
            }
        }
    }
    return 0;
}

第三个函数是这样的:

int startingPointX(int lvl, int &y) {
    int xCoord;
    if (lvl == 1) {
        /*This is for level 1*/
        for (int i = 0; i != 20; ++i) {
            for (int j = 0; j != 20; ++j) {
                if (lvl1[i][j] == 'X') {
                    xCoord = i;
                    y = j;
                    return xCoord;
                }
            }
        }
    }
    if (lvl == 2) {
        /*This is for level 2*/
        for (int i = 0; i != 20; ++i) {
            for (int j = 0; j != 20; ++j) {
                if (lvl2[i][j] == 'X') {
                    xCoord = i;
                    y = j;
                    return xCoord;
                }
            }
        }
    }
    if (lvl == 3) {
        /*This is for level 3*/
        for (int i = 0; i != 20; ++i) {
            for (int j = 0; j != 20; ++j) {
                if (lvl3[i][j] == 'X') {
                    xCoord = i;
                    y = j;
                    return xCoord;
                }
            }
        }
    }
    if (lvl == 4) {
        /*This is for the solution of level 1*/
        for (int i = 0; i != 20; ++i) {
            for (int j = 0; j != 20; ++j) {
                if (lvl4[i][j] == 'X') {
                    xCoord = i;
                    y = j;
                    return xCoord;
                }
            }
        }
    }
    if (lvl == 5) {
        /*This is for the solution of level 2*/
        for (int i = 0; i != 20; ++i) {
            for (int j = 0; j != 20; ++j) {
                if (lvl5[i][j] == 'X') {
                    xCoord = i;
                    y = j;
                    return xCoord;
                }
            }
        }
    }
    if (lvl == 6) {
        /*This is for the solution of level 3*/
        for (int i = 0; i != 20; ++i) {
            for (int j = 0; j != 20; ++j) {
                if (lvl6[i][j] == 'X') {
                    xCoord = i;
                    y = j;
                    return xCoord;
                }
            }
        }
    }
    return 0;
}

崩溃的原因是当关卡运行时它会在 int startingPointX 中搜索 X,但是在 void 位置游戏会搜索我,即 '@',因此如果我开始第二关,就会出现在关卡中不再有“X”。函数 int startingPointX 返回 0,它不会设置 y,给 y 一个随机值。因此,行 lvl1[x][y];在 void 位置会使游戏做随机的事情,因为 y 有一个随机值,很可能超出范围,导致崩溃。

我尝试了很多方法来更改功能的工作方式,但每次它仍然最终崩溃。帮助将不胜感激,谢谢

下面是编译和运行的完整代码: https://drive.google.com/open?id=0B2lLG0MNZMxdT3kteTBtR0puWlE 我使用的是 Windows Visual Studio 2015

【问题讨论】:

    标签: c++ visual-c++ crash maze


    【解决方案1】:

    我提出了多种可能的解决方案,您可以尝试实施:

    我的第一个想法是在调用每个级别时硬编码me 的起始位置,而不是搜索“X”。您编写应用程序的方式,这也要求您在完成关卡时将me的当前位置更改回空格,否则再次调用关卡时末尾仍然会有一个@ .

    另一种快速的解决方案是存储起始位置坐标,并在完成关卡后将存储的坐标设置回“X”,再次将 @ 更改回空格。

    您是否尝试过将每个级别设为 const 字符数组,并将它们复制到另一个 char 数组中,例如 'CurrentLevel'?

    您可以使用memcpy 实现此目的,例如:

    const char lvl1[20][20] = (your array); char currentLevel[20][20] = {0}; //all initialised to 0

    稍后在您的代码中创建所需级别时:

    //Copy the contents of lvl1 into currentLevel, up to the size of the array memcpy(currentLevel, lvl1, sizeof(currentLvel));

    使用这种方法,您可以重新创建每个级别,包括“X” 您必须对代码进行更改以适应此解决方案,但请参考 currentLevel 而不是级别 1 - 6。

    【讨论】:

    • 您好,我尝试使用您的第一个想法,即硬编码 'me' 的起始位置,使其变为空白,但这似乎不会在迷宫中加载 '@' 字符,所以我无法在迷宫周围移动任何东西到达终点。
    • 我也尝试过使用 memcpy,但我的技能水平还不够高,无法将其应用到我的代码中,即使在搜索了好几个小时后如何实现它
    猜你喜欢
    • 1970-01-01
    • 2015-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-19
    • 1970-01-01
    相关资源
    最近更新 更多