2017-04-14 110 views
0

过去几周我一直在做迷宫游戏,并在3天前完成编码。我一直在测试游戏中的任何错误,一切看起来都不错,但是我遇到的一个主要问题是如果我想在游戏的一次运行中玩同一级别的游戏,那么游戏会崩溃。例如,我玩等级1和等级2,如果我在主菜单上再次选择其中任何一个,游戏就会变成空白屏幕并崩溃。 我已经来源的bug分为三个我的功能,如下:如何将X重置回阵列中的原始位置?

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,然而,在虚位置游戏会搜索我,这就是'@',因此如果我如果是第二级,那么关卡中不会再有'X'。函数int startingPointX返回0,它不会设置y,给y一个随机值。因此,行lvl1 [x] [y];在虚空位置会使游戏做随机事件,因为y有一个随机值,这可能超出范围,导致崩溃。

我已经尝试了很多方法来改变函数的工作方式,但每次它仍然会崩溃。帮助将不胜感激,谢谢

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

回答

0

我想出多种可能的解决方案,你可以尝试实施:

我的第一个想法是硬编码me时的起始位置,而不是搜索'X'时调用每个级别。您编写应用程序的方式也需要当您完成关卡时,将当前位置me更改回空白处,或者当再次调用关卡时最后仍会有@。

另一个快速解决方案是存储起始位置坐标,并在完成关卡时将存储的坐标设置回'X',再次将@更改回空白处。

您是否尝试过将每个级别设置为一个常量字符数组,然后将它们复制到另一个字符数组中,例如“CurrentLevel”?当你想创建所需的水平

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

在后面的代码:

你可以做到这一点使用memcpy,例如

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

使用这种方法,你能够重新创建每个级别,包括'X' 您将不得不对您的代码进行更改以适应此解决方案,但通过参考响到currentLevel而不是1 - 6级。

+0

你好,我尝试着使用你的第一个想法来硬编码'我'的开始位置,所以它变成了一个空白区域,但似乎并没有加载迷宫中的'@'字符,所以我无法移动迷宫中的任何东西到达最后。 –

+0

我也尝试过使用memcpy,但是我的技能水平还不够高,无法将其应用到我的代码中,即使搜索了几个小时的如何实现它 –