2015-10-29 2 views
0

Я думаю, проблема в моем конструкторе. Он начинает работать и «кладет бомбы» в 2-й массив (сетка), но он останавливается посередине. (Иногда он будет работать весь путь через ...Ошибка сегментации для программы minesweeper C++

SweeperGrid::SweeperGrid(const int initialRows, const int initialCols, const int density){ 
if ((initialRows<5 || initialCols<5) || (density<25 || density>75)) { 
    throw out_of_range("Grid not large enough (number of rows or columns cannot be fewer than 5) or density is too low or high (must be between 25% and 75%)"); 
} 

numRows = initialRows; 
numColumns = initialCols; 
numBombs = 0; 

grid = new SweeperCell*[numRows]; 
for(int i=0; i <numRows; i++){ 
    grid[i] = new SweeperCell[numColumns]; 
} 

srand(time(0)); 
for(int i=0; i<numRows; i++){ 
    for (int j=0; j<numColumns; j++){ 
     if(rand()%100+1<=density){ 
      PlaceBomb(i, j); 
     } 
    } 
} 
} 

Вот функция PlaceBomb:

void SweeperGrid::PlaceBomb(int row, int col){ 
cout<<row<<", "<<col<<endl; 

if ((row<0||row>=numRows)||(col<0||col>=numColumns)){ 
    throw out_of_range("Out of bounds (PlaceBomb)"); 
} 

At(row, col).PlaceBomb(); 
numBombs++; 

//add if statements so it doesn't go out of bounds 
if (row==0) { 
    At(row+1, col).IncrementNumAdjacent(); 
    At(row, col-1).IncrementNumAdjacent(); 
    At(row, col+1).IncrementNumAdjacent(); 
    At(row+1, col+1).IncrementNumAdjacent(); 
    At(row+1, col-1).IncrementNumAdjacent(); 
} 

if (row==0&&col==0) { 
    At(row+1, col).IncrementNumAdjacent(); 
    At(row, col+1).IncrementNumAdjacent(); 
    At(row+1, col+1).IncrementNumAdjacent(); 
} 

if (col==0) { 
    At(row-1, col).IncrementNumAdjacent(); 
    At(row+1, col).IncrementNumAdjacent(); 
    At(row, col+1).IncrementNumAdjacent(); 
    At(row+1, col+1).IncrementNumAdjacent(); 
    At(row-1, col+1).IncrementNumAdjacent(); 
} 

if (row==numRows-1) { 
    At(row-1, col).IncrementNumAdjacent(); 
    At(row, col-1).IncrementNumAdjacent(); 
    At(row, col+1).IncrementNumAdjacent(); 
    At(row-1, col-1).IncrementNumAdjacent(); 
    At(row-1, col+1).IncrementNumAdjacent(); 
} 

if (row==numRows-1&&col==numColumns-1) { 
    At(row-1, col).IncrementNumAdjacent(); 
    At(row, col-1).IncrementNumAdjacent(); 
    At(row-1, col-1).IncrementNumAdjacent(); 
} 

if (col==numColumns-1) { 
    At(row-1, col).IncrementNumAdjacent(); 
    At(row+1, col).IncrementNumAdjacent(); 
    At(row, col-1).IncrementNumAdjacent(); 
    At(row-1, col-1).IncrementNumAdjacent(); 
    At(row+1, col-1).IncrementNumAdjacent(); 
} 

if (row==0&&col==numColumns-1) { 
    At(row+1, col).IncrementNumAdjacent(); 
    At(row, col-1).IncrementNumAdjacent(); 
    At(row+1, col-1).IncrementNumAdjacent(); 
} 

if (row==numRows-1&&col==0) { 
    At(row-1, col).IncrementNumAdjacent(); 
    At(row, col+1).IncrementNumAdjacent(); 
    At(row-1, col+1).IncrementNumAdjacent(); 
} 

** IncrementNumAdjacent находится в другом файле, и я уверен, что он работает

.

ответ

0

Вы слишком много IncrementNumAdjacent звонков и некоторые из них могут быть из диапазона

Например:.

if (row==0) { 
    At(row+1, col).IncrementNumAdjacent(); 
    At(row, col-1).IncrementNumAdjacent(); 

Что произойдет, если col 0 в этом пункте?

Возможно, в вашем классе SweeperGrid есть метод safeIncrementNumAdjacent(int row, int col), который просто игнорирует элементы вне диапазона. Что-то вроде:

void SweeperGrid::safeIncrementNumAdjacent(int row, int col) { 
    if (row >= 0 && row < numRows && col >= 0 & col < numCols) 
     At(row, col).IncrementNumAdjacent(); 
} 

тогда просто позвоните, что для 8 мест вокруг текущей точки.

+0

Спасибо! Я проверю это! – AOlson

+0

К сожалению, это все еще не работает ... Нет ошибки сегментации, но иногда она слишком сильно увеличивается? Также numBombs возвращает еще несколько «бомб», чем есть на самом деле. – AOlson

+0

Без просмотра вашего кода немного сложно сказать, но, возможно, ваш случайный бомбардировщик размещает две бомбы в одном месте. Это приведет к тому, что вы описываете. –

Смежные вопросы