2015-09-27 34 views
0

所以我一直在嘗試在Xcode中編寫遊戲,其中在終端中使用char類型的多維數組繪製遊戲板。遊戲應該就像是一個地下城,有一扇門,你可以踩下,當你在一個新的房間裏生成。但有時我得到這真討厭的「(11db)」錯誤的事情,其中​​我的一行被突出顯示「線程1:EXC_BAD_ACCESS(code = EXC_I386_GPFLT)」,開始真的讓我煩惱。這不是我第一次在X代碼中發生(11db)錯誤,而且之前我已經能夠修復它,但是現在我似乎還沒有。也有人真的知道這意味着什麼嗎?我試着做一些Google搜索嘗試找出來,但到目前爲止我還沒有成功。但是,我發現最令人討厭的部分是,它不會每次都發生。有時會在房間創建完成後立即開始運行程序,有時會在您穿過門後發生,甚至在沒有它的情況下甚至無法運行。下面的代碼在那裏發生的事情:XCode 11db error thing

door_x = randomNumber(height - 1, 1); 
    door_y = randomNumber(width - 1, 1); 

    //Check to see if door location is the same an an enemy or the player 
    for (int i = 0; i < enemies.size(); i++){ 
     while ((door_x == enemies.at(i).getX() && door_y == enemies.at(i).getY()) || (door_x == player->getX() && door_y == player->getY())){ 
      door_x = randomNumber(height - 1, 1); 
      door_y = randomNumber(width - 1, 0); 
     } 
    } 
    room[door_y][door_x] = DOOR;//Place door on map 

此錯誤是在上面的代碼中的最後一行發生。有人能告訴我什麼是錯的,爲什麼。雖然我並不陌生於C++,但我在初級階段編程,所以如果這只是一個愚蠢的真正明顯的錯誤,那麼我很抱歉。

編輯: 我被要求包括代碼的其餘部分,所以這裏是創建一個新房間和我的隨機數函數的全部功能。

int randomNumber(int max, int min){ 
    int randomNumber = rand() %(max - min) + min; 
    return randomNumber; 
} 

void create_new_room(){ 
    //Get random room height and room width 
    height = randomNumber(settings[0], settings[1]); 
    width = randomNumber(settings[2], settings[3]); 

    room = new char*[height]; 
    for (int iter = 0; iter != height; iter++) { 
     room[iter] = new char[width]; 
    } 

    for (int i = 0; i < height; i++){ 
     for (int j = 0; j < width; j++){ 
      room[i][j] = EMPTY; 
     } 
    } 

    enemies.clear();//Delete every object from the vector 

    //Create the enemies 
    int numEnemies = randomNumber(settings[4], settings[5]); 

    for (int i = 0; i < numEnemies; i++){ 
     int randomHeight = randomNumber(height, 0); 
     int randomWidth = randomNumber(width, 0); 
     Enemy *e;//Create pointer to class to allow vector class push back 
     e = new Enemy(randomWidth, randomHeight, HEALTH); 
     enemies.push_back(*e); 
     delete e;//Delete pointer e to free memory and avoid any memory leak. 
     room[enemies.at(i).getY()][enemies.at(i).getX()] = ENEMY;//Place enemy on board 
    } 

    //Create Player 
    int player_y = randomNumber(height, 0); 
    int player_x = randomNumber(width, 0); 
    for (int i = 0; i < enemies.size(); i++){ 
     while (player_x == enemies.at(i).getX()){ 
      player_y = randomNumber(height, 0); 
      player_x = randomNumber(width, 0); 
     } 
    } 
    player = new Player(player_x, player_y, ATTACK); 

    //Place player on board 
    room[player->getY()][player->getX()] = PLAYER; 

     //Create a door 
     door_x = randomNumber(height - 1, 1); 
     door_y = randomNumber(width - 1, 1); 

     //Check to see if door location is the same an an enemy or the player 
     for (int i = 0; i < enemies.size(); i++){ 
      while ((door_x == enemies.at(i).getX() && door_y == enemies.at(i).getY()) || (door_x == player->getX() && door_y == player->getY())){ 
       door_x = randomNumber(height - 1, 1); 
       door_y = randomNumber(width - 1, 1); 
      } 
     } 
     room[door_y][door_x] = DOOR;//Place door on map 

} 

設置[]是設定我具有從與用於最大用戶設置的文本文件中讀取的值和MIN隨機值的陣列。 0 =最大高度1 =最小高度2 =最大寬度3 =最小寬度4 =最大敵人5 =最小敵人

另外我在主要功能頂部使用srand(time(0))

我的代碼有點混亂,但在這裏。

+1

它是'lldb',而不是'11db'。 – emlai

回答

0

您的代碼崩潰,因爲您正在取消引用指針並導致內存不佳。 EXC_I386_GPFLT基本上是異常,i386(你的CPU架構),一般保護錯誤,這意味着你的代碼試圖讀或寫它不應該的內存。

看你的代碼,無論是room未設置(可能是空還是?),或者它已經被釋放,或者door_xdoor_y已經結束了大於您room分配(也許你randomNumber方法有一個bug ?)

您需要打印的值roomdoor_xdoor_y你的代碼崩潰之前,你需要向我們展示了代碼的其餘部分,所以我們可以看到你是如何分配room以及如何randomNumber作品(以及如何計算出地圖的大小)。

@zenith是對的,它是lldb,LLVM調試器,而不是11db。您應該閱讀lldb上的教程,因爲您可以從該提示中獲取大量信息。

+0

我在上面的編輯中添加了創建新房間函數和隨機數函數。創建新房間是創建房間大小和創建實際房間數組的地方。 – CharlieFan39

相關問題