2014-11-10 3 views
0

Я пытаюсь создать простую текстовую игру. Когда программа достигает 0, я получаю необработанное исключение ... нарушение доступа. Когда я комментирую функции создания платы и дисплея, я не получаю ошибку. Дайте мне знать, если увидите что-нибудь еще, что выглядит уродливым.Необработанное исключение в текстовой игре

class character 
{ 
public: 
    bool alive; 
    bool exit; 
    int row; 
    int col; 

    character() 
    { 
    alive = true; 
    exit = false; 
    row = 0; 
    col = 0; 
    } 



    void receiveMove() 
    { 
     char a; 
     cout<<"Move to the exit with w,a,s,d:"; 
     cin>>a; 
     switch(a) 
     { 
     case ('w'): 
      row -= 1; 
      break; 
     case ('a'): 
      col -= 1; 
      break; 
     case ('s'): 
      row += 1; 
      break; 
     case ('d'): 
      col += 1; 
      break; 
     default: 
      cout <<"Invalid Move"; 
     } 

    } 

}; 


class game 
{ 


public: 
    int board[10][10]; 



    void generateBoard() 
    { 
     for(int i = 0; i<10; i++) 
     { 
      for(int j = 0; j<10; j++) 
      { 
       board[i][j] = 0; 
      } 
     } 

     for(int i = 0; i<3; i++) 
     { 
      int trap = rand()%99+1; 
      int row = trap/9; 
      int column = trap%9; 
      board[row][column] = 1; 

     } 


     board[9][9] = 2;           //set last square as exit 
    } 


    void displayBoard(int charRow, int charCol, bool &alive, bool &exit) 
    { 
     ClearScreen(); 
     for(int i=0; i<10; i++) 
     { 
      for(int j=0; j<10; j++) 
      { 
       if(i == charRow && j == charCol) 
       { 
       cout << "X "; 
        if(board[i][j] == 1) 
        { 
         alive = false; 
        } 
        if(board[i][j] == 2) 
        { 
         exit = true; 
        } 
       } 
       else 
       { 
       cout << board[i][j]<< " "; 
       } 
      } 
      cout << "\n"; 
     } 


    } 

void checkForWin(bool exit) 
{ 
    if(exit) 
    { 
     cout <<"You win"; 
    } 
} 

void checkForDead(bool alive) 
{ 
    if(!alive) 
    { 
     cout <<"You dead"; 
    } 
} 



}; 



int main() 
{ 
    character Player; 
    game Game; 


    Game.generateBoard(); 
    Game.displayBoard(Player.row,Player.col,Player.alive,Player.exit); 
    while(Player.alive && !Player.exit) 
    { 
    Player.receiveMove(); 
    Game.displayBoard(Player.row,Player.col,Player.alive,Player.exit); 
    } 
    Game.checkForWin(Player.exit); 
    Game.checkForDead(Player.alive); 


    return 0; 
} 
+1

Вы отлаживали свою программу с помощью отладчика? Кроме того, вам нужно указать ввод, который вы использовали. – PaulMcKenzie

+0

Он рушился каждый раз, когда игра заканчивалась. Независимо от ввода. Да, я использовал Microsoft Visual Studio 2010. –

ответ

0

Эта линия

int row = trap/9; 

может привести к row быть больше, чем 9 (например, если ловушка 90 или более), который будет переполнение ваш массив. Измените его на

int row = trap/10; 
int column = trap%10; 
+0

Спасибо. Я смущен, что пропустил это. –

0

Ну, во фрагменте

int trap = rand()%99+1; 
int row = trap/9; 
int column = trap%9; 
board[row][column] = 1; 

вы присваивающей случайное значение trap от 1 до 99. Так как в этом случае row получит значение 11, вы бы из границ в массиве board.

EDIT: вам нужно разделить на 10, размер вашей доски.

+0

Делает смысл. Вы, ребята, знали, как искать ошибку массива на основе сообщения? –