Я делаю Conway’s Game of Life для класса C ++, который я посещаю, и я не могу заставить его оставаться в пределах досягаемости на границах. Мы используем древний класс, поэтому его объяснение ниже.
<lvp\matrix.h>
— Позволяет масштабировать 2-мерные массивы
Использование —
декларация — matrix<itemType> itemName(numRows, numColumns, fillValue)
переход к функциям — (itemName)
параметр в функциях — либо (const matrix<itemType> &name)
или что без 'const'
спереди.
Итак, вот картина проблемы (вектор — это класс, на котором основана матрица, он создает массивы и имеет методы, которые очень легко масштабируют).
http://imageshack.com/a/img835/2531/03gx.png
Просто помните, что я начинающий программист, поэтому, пожалуйста, будьте осторожны с вашей критикой 🙂
И заранее спасибо.
Итак, вот код на данный момент:
#include <lvp\matrix.h>
#include <iostream.h>
//--------------------------------------------------------------
void displayBoard(const matrix<char> &board)
{
cout << " 1 2 3 4 5 6 7" << endl;
for( int row=0; row<board.numrows(); row++)
{
cout << row+1 << " ";
for( int col = 0; col < board.numcols(); col++)
cout<<"["<<board[row][col]<<"]";
cout<<endl;
}
}
//--------------------------------------------------------------
void placeLiveCells(matrix<char> &board, matrix<char> &check)
{
//Test function
board[3][3]='X';
board[3][4]='X';
board[3][2]='X';
check[3][3]='X';
check[3][4]='X';
check[3][2]='X';
}
//--------------------------------------------------------------//--------------------------------------------------------------
void checkNeighbors(matrix<char> &board, int row, int col)
{
int count=0;
for(int i=0; i<2; i++)
{
if(board[row][col+1]=='X')
count++;
if(board[row][col-1]=='X')
count++;
if(board[row+1][col+1]=='X')
count++;
if(board[row-1][col-1]=='X')
count++;
if(board[row+1][col-1]=='X')
count++;
if(board[row-1][col+1]=='X')
count++;
if(board[row+1][col]=='X')
count++;
if(board[row-1][col]=='X')
count++;
if(count<2)
board[row][col]='O';
if(count>3)
board[row][col]='O';
}
}
//--------------------------------------------------------------
void findX(matrix<char> &board)
{
int numspots=board.numrows()*board.numcols(), r=0, c;
for(int j=0; j<numspots; j++)
{
if(board[r][c]=='X')
checkNeighbors(board, r, c); /*This is where I think the
problem is, the code was working ok before I added this function*/
if(c==6)
{
c=0;
r++;
}
}
}
//--------------------------------------------------------------
int main()
{
int row=0, col=0;
matrix<char> check(7, 7, 'O');
matrix<char> board(7, 7, 'O');
displayBoard(board);
placeLiveCells(board, check);
displayBoard(board);
findX(board);
checkNeighbors(board, row, col);
return(0);
}
Моя следующая попытка checkNeighbors включает проверку на наличие ошибок за пределами <0, который все еще не работает:
void checkNeighbors(matrix<char> &board, int row, int col)
{
int count=0;
for(int i=0; i<2; i++)
{
if((row-1>=0) && (col-1>=0))
{
if(board[row][col+1]=='X')
count++;
if(board[row][col-1]=='X')
count++;
if(board[row+1][col+1]=='X')
count++;
if(board[row-1][col-1]=='X')
count++;
if(board[row+1][col-1]=='X')
count++;
if(board[row-1][col+1]=='X')
count++;
if(board[row+1][col]=='X')
count++;
if(board[row-1][col]=='X')
count++;
if(count<2)
board[row][col]='O';
if(count>3)
board[row][col]='O';
}
else if((row-1<0) && (col-1>=0))
{
if(board[row][col+1]=='X')
count++;
if(board[row][col-1]=='X')
count++;
if(board[row+1][col+1]=='X')
count++;
if(board[row][col-1]=='X')
count++;
if(board[row+1][col-1]=='X')
count++;
if(board[row][col+1]=='X')
count++;
if(board[row+1][col]=='X')
count++;
if(board[row][col]=='X')
count++;
if(count<2)
board[row][col]='O';
if(count>3)
board[row][col]='O';
}
else if((row-1>=0) && (col-1<0))
{
if(board[row][col+1]=='X')
count++;
if(board[row][col]=='X')
count++;
if(board[row+1][col+1]=='X')
count++;
if(board[row-1][col]=='X')
count++;
if(board[row+1][col]=='X')
count++;
if(board[row-1][col+1]=='X')
count++;
if(board[row+1][col]=='X')
count++;
if(board[row-1][col]=='X')
count++;
if(count<2)
board[row][col]='O';
if(count>3)
board[row][col]='O';
}
else if((row-1<0) && (col-1<0))
{
if(board[row][col+1]=='X')
count++;
if(board[row][col]=='X')
count++;
if(board[row+1][col+1]=='X')
count++;
if(board[row][col]=='X')
count++;
if(board[row+1][col]=='X')
count++;
if(board[row][col+1]=='X')
count++;
if(board[row+1][col]=='X')
count++;
if(board[row][col]=='X')
count++;
if(count<2)
board[row][col]='O';
if(count>3)
board[row][col]='O';
}
}
}
Так что я сделал здесь, я переделал checkNeighbors
с одним огромным оператором if вокруг операторов if, которые проверяют другие ячейки. Теперь они делают это так, что если row
или же col
отрицательны, при проверке соседних ячеек НЕ будет -1 к тому, что будет отрицательным.
Задача ещё не решена.