2014-02-23 41 views
0

我必須寫掃雷。 我已經想出了一種方法來檢查相鄰指數,以計算當前指數週圍有多少炸彈,而不會超出界限。但它很長,很醜,很可能是低效的。 它們只是每個可能超出範圍的獨特單元格的一組條件語句。我的問題是,有沒有更簡單的方法來做到這一點?並且實現一維的環繞陣列會使它更容易/更難?檢查二維數組中的相鄰索引

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; 
    } 
} 
+0

我發現了一個類似的問題,可能被證明對你有用:http://stackoverflow.com/questions/20381284/multi-dimensional-array-how -can-i-check-all-adjacent-tiles-that-in-bounds-t在這個問題上接受的答案使用短路評估來檢查四個單元 - 上/下/右/左 - 但是你應該能夠擴展它與周圍所有8個單元一起工作。 – computerfreaker

+0

謝謝你的鏈接 – justin

回答

1

有一種標準的方式來處理這種情況 - 用你的有效動作定義一個數組並重復它。下面是一個例子,你如何可以遍歷8相鄰小區:

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. 
     } 
    } 
} 
+1

哇,這很酷。我從來沒有想過把有效的舉動放在一個數組中。謝謝。順便說一句,if語句應該是ti <0.否則它不會測試第一行中的單元格。再次感謝 – justin

+0

@justin當然:-)這是一個錯字。現在修好了,謝謝。 –