Conway's Game Of Life - sprawdzenie ilości sąsiadów

0

Witajcie!

Mam matury, więc niewiele mam czasu na pisanie (a i ochota na pisanie czegokolwiek mnie opuszcza :P )
Kod jest dosyć słaby, ale próbuję stworzyć mały (bardzo mały i prymitywny) symulator tej gry - było takie zadanie w zeszłym roku na maturze z informatyki (całe szczęście, że stara podstawa) i pomyślałem, że to fajny pomysł poklepać sobie chwilkę dziennie.

Do rzeczy - mam metodę numberOfNeighbours(int row, int column) : int, która ma zwrócić ilość sąsiadów dla komórki i nie mogę jej jakoś sensownie ugryźć.
Oto ona:

public int numberOfNeighbours(int x, int y) {
	int neighboursCount = 0;
	for (int i = -1; i < 2; i++) {
		for (int j = -1; j < 2; j++) {
			if (gameBoard[x + i][y + j] == 'X') neighboursCount++;
		}
	}
	return neighboursCount;
}

Uwsteczniam się i potrzebuję pomocy. Możliwe też, że błąd kryje się w metodzie nextRound(), treść poniżej:

void nextRound() {
	// Starts from 1 because number of neighbours add -1
	// to row and to column in the first place
	for (int i = 1; i < gameBoard.length - 1; i++) {
		for (int j = 1; j < gameBoard[i].length - 1; j++) {
			if (gameBoard[i][j] == 'X' && hasTwoOrThreeNeighbours(i, j)) {
				gameBoard[i][j] = 'X';
			} else if (gameBoard[i][j] == '.' && hasThreeNeighbours(i, j)) {
				gameBoard[i][j] = 'X';
			} else {
				gameBoard[i][j] = '.';
			}
		}
	}
	numberOfRounds++;
}

Snippet całej klasy jest tutaj
Z góry dzięki za pomoc i przepraszam za słabą jakość kodu.

1

Nie patrzyłem na drugą metodę ale w pierwszej.

x-1 : y-1, y, y+1
x    : y-1, y+1
x+1: y-1, y, y+1 

Pętle:

i = x-1; i <= x+1, i++
j= y-1; j <= y+1, j++

z tym, że musi być spełniony warunek:

i >=0 && j >= 0 && !(i==x && j==y)

Jak to zakodzisz to powinno działać.
Edit. Jeszcze musisz sprawdzić koniec planszy, czyli i < arrayXSize && y < arrayYSize

0

Super, dzięki @szweszwe mam tylko jeszcze problem z komórkami krańcowymi.
Nie doprecyzowałem, że według zasad komórka będąca na krańcu planszy ma sąsiadów z drugiej strony planszy
Przykładowo komórka zamalowana na zielono w poniższym przykładzie ma takich sąsiadów (określonych kolorem żółtym)
screenshot-20170506100112.png

1

No to moja metoda która wypisuje indexy tablicy:

private static void printNeighbors(int x, int y) {
   for(int i = x-1; i <= x+1; i++) {
      int correctI = i;
      if (i < 0)
         correctI = arrayXSize - 1;
      else if (i == arrayXSize)
         correctI = 0;
      
      for (int j = y-1; j <= y+1; j++) {
         int correctJ = j;
         if (j < 0)
            correctJ = arrayYSize - 1;
         else if (j == arrayYSize)
            correctJ = 0;
         
         if(i != x || j != y)
            System.out.println(correctI + ", " + correctJ);
      }
   }
}
1

Jeśli chcesz rzucić okiem na przykładową implementację możesz zajrzeć na githuba. Jakiś czas temu nadziubałem prosty przykład.

1

Oprócz zliczania sąsiadów, masz w swoim algorytmie drugi błąd: dane zaktualizowanej planszy powinieneś zapisywać do nowej tablicy i dopiero na końcu je podmieniać.
W innym wypadku będziesz otrzymywał błędne wartości, ponieważ gdy zaktualizujesz komórkę np. (0,0), może zmienić się liczba sąsiadów wokół niej (ponieważ ona sama umrze/narodzi się), co jest niedopuszczalne w trakcie aktualizacji.

1 użytkowników online, w tym zalogowanych: 0, gości: 1