我必须写扫雷。我想出了一种方法来检查相邻索引以计算当前索引周围有多少炸弹而不会超出范围。但它又长又丑,而且很可能效率低下。对于每个可能超出范围的唯一单元格,它们只是一堆条件语句。我的问题是,有没有更短的方法来做到这一点?并且实施一维环绕阵列会使其更容易/更难吗?
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;
}
}