简体   繁体   English

检查二维数组中的相邻索引

[英]Checking adjacent indices in 2 dimensional array

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

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: 这是一个示例,如何迭代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.
      }
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM