0

Итак, я пытаюсь построить игру в программе жизни, и я достаточно свеж для java/кодирования вообще, и у меня возникают проблемы, обертывающие мою голову вокруг обертывания в 2D-массивах. У меня есть конструктор и методы, которые построят мне массив и помещают «ячейки» туда, где я хочу их, но я не понимаю, как я могу видеть, сколько соседей имеет ячейка.Подсчет соседей с обертыванием в 2-мерном массиве (игра жизни)

Подводя итог:

я могу сделать 2D массив любого типа.

я могу поставить «клетку» в различных элементах в массиве

Теперь, как я вижу пространство рядом с моей ячейкой проверяемой имеют сосед по всей стороне (я использую вложенный цикл, чтобы пройти через каждый клетки)?

KEEP IN MIND! Здесь действует обтекание.

ОБНОВЛЕНИЕ: Это то, что у меня есть, но когда я проверяю его, он возвращает 1 меньше соседа, чем должно быть. UPDATE 2: Я удалил первое заявление if, потому что я не думаю, что это имеет смысл с ним. Но теперь я не могу получить гр идти 1.

public int neighborCount(int row, int col) { 
    int count = 0; 
    for (int r = 0; r < society.length; r++) { 
     for (int c = 0; c < society[0].length; c++) { 
       // up and left 
       if ((society[(r - 1 + row) % row][(c - 1 + col) % col]) == cell) { 
        count++; 
       } 
       // up 
       if ((society[(r - 1 + row) % row][c]) == cell) { 
        count++; 
       } 
       // up and right 
       if ((society[(r - 1 + row) % row][(c + 1 + col) % col]) == cell) { 
        count++; 
       } 
       // left 
       if ((society[r][(c - 1 + col) % col]) == cell) { 
        count++; 
       } 
       // right 
       if ((society[r][(c + 1 + col) % col]) == cell) { 
        count++; 
       } 
       // down and left 
       if ((society[(r + 1 + row) % row][(c - 1 + col) % col]) == cell) { 
        count++; 
       } 
       // down 
       if ((society[(r + 1 + row) % row][c]) == cell) { 
        count++; 
       } 
       // down and right 
       if ((society[(r + 1 + row) % row][(c + 1 + col) % col]) == cell) { 
        count++; 
       } 
     } 
    } 
    return count; 
} 

Мой тест:

@Test 
public void testNeighborsWrapping() { 
    GameOfLife society = new GameOfLife(10, 16); 
    society.growCellAt(3, 3); 
    society.growCellAt(3, 4); 
    society.growCellAt(3, 5); 
    assertEquals(0, society.neighborCount(2, 1)); 
    assertEquals(1, society.neighborCount(2, 2)); 
    assertEquals(2, society.neighborCount(2, 3)); 
    assertEquals(3, society.neighborCount(2, 4)); 

} 

}

+0

Почему вы просто не проверяете каждую ячейку вручную? –

+0

Ну, мне нравится, когда мой метод делает это для меня, поэтому я могу просто сказать, иди, и все идет. – Tejas

+0

В вашем методе вы проверяете каждую (окружающую) ячейку вручную. –

ответ

1

Если я правильно понял проблему правильно, код может быть что-то вроде

Object[] getNeighbors(int i, int j) { 
    // put code to return the neighbors given an index 
} 

boolean allNeighborsFull(int i, int j) { 
    Object[] neighbors = getNeighbors(i, j); 
    boolean allFull = true; 
    for (Object neighbor : neighbors) { 
     if (!neighbor.full()) { 
      allFull = false; 
      break; 
     } 
    } 
    return allFull; 
} 

boolean allNeighborsSurrounded() { 
    Object[] neighbors = getNeighbors(i, j); 
    // check each one of these using the method above 
} 
+0

Я как бы смотрю, как работает ваш метод getneighbors – Tejas

+0

О, только эта часть. Ну, один простой способ - жестко закодировать соседей. Просто убедитесь, что если вы обращаетесь к i-1, то i> 0. Если вы обращаетесь к i + 1, то i <длина - 1. Есть только 8 соседей. –

+0

Я не уверен, что я действительно – Tejas

0

Это будет работать:

public Cell[] getNeighbours(int i, int j) { 
    int i2 = i - 1; 
    int i3 = i + 1; 
    int j2 = j - 1; 
    int j3 = j + 1; 
    if (i2 == -1) 
     i2 = board.length - 1; 
    if (i3 == board.length) 
     i3 = 0; 
    if (j2 == -1) 
     j2 = board[i].length - 1; 
    if (j3 == board[i].length) 
     j3 = 0; 
    return new Cell[] { 
     board[i2][j2], board[i2][j], board[i2][j3], 
     board[i][j2], board[i][j3], board[i3][j2], 
     board[i3][j], board[i3][j3] 
    }; 
} 
Смежные вопросы