2017-04-14 54 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,但是我的技能水平還不夠高,無法將其應用到我的代碼中,即使搜索了幾個小時的如何實現它 –

相關問題