Есть ли более простой способ найти матрицу 3x3 в матрице 11x11? - PullRequest
0 голосов
/ 03 мая 2020

Несколько друзей и я создаем игру на основе моделирования, используя java, где наши "игроки" go выходят на матрицу 11x11, заполненную классом под названием Chunk. Чтобы игроки могли взаимодействовать с окружающим миром, нам необходимо видеть информацию о чанках в 3х3 вокруг игрока.

Пример (меньший размер матрицы, x = Ничего там, o = Person):

xxxxxxxxxxx
xxxxxxxxxxx
xxxxxoxxxxx
xxxxxxxxxxx
xxxxxxxxxxx

Нам нужно было бы собрать куски, окружающие игрока (o) (в данном случае строки [1], [2], [ 3] и col [4], [5], [6]). Конечно, матрица 3x3 не может выходить за границы матрицы, и если она это делает, мы просто игнорируем те, которых нет, и собираем куски, которые мы можем собрать. В настоящее время у нас есть блок кода, который работает для желаемой задачи, но мы чувствуем, что его можно сделать быстрее, чище или полностью переделать другим способом.

fullMap - это массив, который инициализирован как заполненный 11x11 блоков Chunk, и currentRow , currentCol оба являются целыми числами, которые относятся к позиции в полной карте игрок в настоящее время находится в.

for(int row = 0; row < fullMap.length; row++) {
      for (int col = 0; col < fullMap[row].length; col++) {
            if (((row == currentRow-1) && (col == currentCol)) && currentRow != 0) {
                //store the chunk
            } else if (((row == currentRow-1) && (col == currentCol+1)) && (currentRow != 0 && currentCol != 10)) {
                //store the chunk
            } else if (((row == currentRow-1) && (col == currentCol-1)) && (currentRow != 0 && currentCol != 0)) {
                //store the chunk
            } else if (((row == currentRow) && (col == currentCol+1)) && currentCol != 10) {
                //store the chunk
            } else if (((row == currentRow) && (col == currentCol-1))  && currentCol != 0) {
                //store the chunk
            } else if (((row == currentRow+1) && (col == currentCol+1)) && (currentRow != 10 && currentCol != 10)){
                //store the chunk
            } else if (((row == currentRow+1) && (col == currentCol)) && currentRow != 10) {
                //store the chunk
            } else if (((row == currentRow+1) && (col == currentCol-1)) && (currentRow != 10 && currentCol != 0)){
                //store the chunk
            }
    }
}

Если нужна другая информация, я рад опубликовать ее.

Ответы [ 2 ]

2 голосов
/ 03 мая 2020

Вам не нужно перебирать fullMap, не так ли? Вы знаете (currentRow, currentCol) и оттуда вы go -1 / + 1 в каждом направлении. Всего у вас будет 9 полей для проверки.

    ...
    for (int i = -1; i <= 1; i++) {
      for (int j = -1; j <= 1 ; j++) {
        if (isMovePossible(currentRow + i, currentCol + j)) {
          // store chunk
        }
      }
    }
    ...


  private static boolean isMovePossible(int row, int col) {
    return row >= 0 && row <= 10 && col >= 0 && col <=10;
  }
0 голосов
/ 03 мая 2020

Может быть сокращено с использованием массива направлений и l oop.

int[][] dirs = {{-1, 0}, {-1, 1}, {-1, -1}, {0, 1}, {0, -1}, {1, 1}, {1, 0}, {1, -1}};

for(int row = 0; row < fullMap.length; row++) {
    for (int col = 0; col < fullMap[row].length; col++) {
        for (int[] arr: dirs) {
            if ((arr[0] == -1 && currentRow != 0) || (arr[1] == 1 && currentCol != 10) {
                if (row == currentRow + arr[0] && col == currentCol + arr[1]) {                        
                    // store the chunk
                }
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...