Reputation: 159
I have to write minesweeper. I've figured out a way to check the adjacent indices to count how many bombs surround the current index without going out of bounds. But it's long, ugly, and most likely inefficient. They're just a bunch of conditional statements for each unique cell that could potentially reach out of bounds. My question is, is there a shorter way to do this? And would implementing a 1 dimensional warp-around array make it any easier/harder?
int count = 0;
for (int i = 0; i < WIDTH; i++){
for (int j = 0; j < HEIGHT; j++){
**// index 0,0**
if (i == 0 && j == 0 && field[i][j] != 10){
if (field[i][j + 1] == 10)
count++;
if (field[i + 1][j] == 10)
count++;
if (field[i + 1][j + 1] == 10)
count++;
}
**// index 0,9**
else if (i == 0 && j == HEIGHT - 1 && field[i][j] != 10){
if (field[i][j - 1] == 10)
count++;
if (field[i + 1][j - 1] == 10)
count++;
if (field[i + 1][j] == 10)
count++;
}
**// index 9,0**
else if (i == WIDTH - 1 && j == 0 && field[i][j] != 10){
if (field[i - 1][j] == 10)
count++;
if (field[i][j + 1] == 10)
count++;
if (field[i - 1][j + 1] == 10)
count++;
}
**// index 9,9**
else if (i == WIDTH - 1 && j == HEIGHT - 1 && field[i][j] != 10){
if (field[i - 1][j] == 10)
count++;
if (field[i][j - 1] == 10)
count++;
if (field[i - 1][j - 1] == 10)
count++;
}
**// if first row**
else if (i == 0 && (j != 0 && j != HEIGHT - 1) && field[i][j] != 10){
if (field[i][j - 1] == 10)
count++;
if (field[i + 1][j - 1] == 10)
count++;
if (field[i + 1][j] == 10)
count++;
if (field[i + 1][j + 1] == 10)
count++;
if (field[i][j + 1] == 10)
count++;
}
**// if last row**
else if (i == WIDTH - 1 && (j != 0 && j != HEIGHT - 1) && field[i][j] != 10){
if (field[i][j - 1] == 10)
count++;
if (field[i - 1][j - 1] == 10)
count++;
if (field[i - 1][j] == 10)
count++;
if (field[i - 1][j + 1] == 10)
count++;
if (field[i][j + 1] == 10)
count++;
}
**// if first col**
else if (j == 0 && (i != 0 && i != HEIGHT - 1) && field[i][j] != 10){
if (field[i - 1][j] == 10)
count++;
if (field[i - 1][j + 1] == 10)
count++;
if (field[i][j + 1] == 10)
count++;
if (field[i + 1][j] == 10)
count++;
if (field[i + 1][j + 1] == 10)
count++;
}
**// if last col**
else if (j == HEIGHT - 1 && (i != 0 && i != WIDTH - 1) && field[i][j] != 10){
if (field[i - 1][j - 1] == 10)
count++;
if (field[i - 1][j] == 10)
count++;
if (field[i][j - 1] == 10)
count++;
if (field[i + 1][j - 1] == 10)
count++;
if (field[i + 1][j] == 10)
count++;
}
**// Cells that are fully surrounded**
else if (field[i][j] != 10){
if (field[i - 1][j - 1] == 10)
count++;
if (field[i - 1][j] == 10)
count++;
if (field[i - 1][j + 1] == 10)
count++;
if (field[i][j - 1] == 10)
count++;
if (field[i][j + 1] == 10)
count++;
if (field[i + 1][j - 1] == 10)
count++;
if (field[i + 1][j] == 10)
count++;
if (field[i + 1][j + 1] == 10)
count++;
}
if (field[i][j] != 10)
field[i][j] = count;
count = 0;
}
}
Upvotes: 0
Views: 3152
Reputation: 70929
There is a standard way to deal with such situations - define an array with your valid moves and iterate over it. Here is an example how you can iterate over 8 neighboring cells:
static int moves[8][2] = {{-1,0}, {-1, -1}, {0, -1}, {1, -1}, {1, 0}, {1, 1}, {0, 1}, {-1, 1}};
for (int i = 0; i < WIDTH; i++) {
for (int j = 0; j < HEIGHT; j++) {
for (int l = 0; l < 8 /*sizeof(move) / sizeof(move[0]) */; ++l) {
int ti = i + move[l][0];
int tj = j + move[l][1];
if (ti < 0 || ti >= WIDTH || tj < 0 || tj >= HEIGHT) {
continue;
}
// cell (ti, tj) is valid neighbor do something with it.
}
}
}
Upvotes: 2