Java - game of life

0

Cześć, nie do końca wiem w czym tkwi mój problem, ale program nie zachowuje się tak jak teoretycznie powinen...

Zasady i kod :
Martwa komórka, która ma dokładnie 3 żywych sąsiadów, staje się żywa w następnej jednostce czasu (rodzi się)
Żywa komórka z 2 albo 3 żywymi sąsiadami pozostaje nadal żywa; przy innej liczbie sąsiadów umiera (z „samotności” albo „zatłoczenia”).

public class GameOfLife {
	public static void game() {
		int h = 55;
		
		String[][] box = new String[h][h];
		String cell = " * ";
		String deadCell =  "   ";
		int howManyCellsAround;
		
		
		for(int i = 0; i < box.length; i++)
			for(int j = 0; j< box.length; j++)
				box[i][j] = deadCell;
			

		//CELLLS
		box[h/2][h/2] = cell;
		box[(h/2)+1][h/2] = cell;
		box[(h/2)-1][h/2] = cell;
		

		
		while(true) {

			
			for(int i = 0; i < box.length; i++) {
				for(int j = 0; j< box.length; j++) {
						
						howManyCellsAround = 0;
						

						if(i-1 >= 0			 			 				 && box[i-1][j].equals(cell)) howManyCellsAround++;
						if(i+1 <= box.length-1 							 && box[i+1][j].equals(cell)) howManyCellsAround++;
						if(						   j-1 >= 0 			 && box[i][j-1].equals(cell)) howManyCellsAround++;
						if(						   j+1 <= box.length-1 	 && box[i][j+1].equals(cell)) howManyCellsAround++;
						if(i-1 >= 0 			&& j+1 <= box.length-1	 && box[i-1][j+1].equals(cell)) howManyCellsAround++;
						if(i-1 >= 0 			&& j+1 <= box.length-1	 && box[i-1][j+1].equals(cell)) howManyCellsAround++;
						if(i+1 <= box.length-1  && j-1 >= 0 		 	 && box[i+1][j-1].equals(cell)) howManyCellsAround++;
						if(i+1 <= box.length-1  && j+1 <= box.length-1 	 && box[i+1][j+1].equals(cell)) howManyCellsAround++;
				
								
						if(howManyCellsAround == 3)
						box[i][j] = cell;
						
						if(howManyCellsAround < 2 && howManyCellsAround > 3 )
							box[i][j] = deadCell;

					
				}
			}
			
			
			
			
				for(int i = 0; i < box.length; i++) {
					for(int j = 0, nextLine = 0; j< box.length; j++, nextLine++) {
						System.out.print(box[i][j]);
						if(nextLine > h-2) {
							System.out.println();
							nextLine = 0;
						}
					}
				}

				
				try {
					Thread.sleep(500);
					} catch (Exception e) {
					throw new RuntimeException(e);
					}
				
				
		}
	} 

2
  1. Nie howManyCellsAround, tylko pokombinuj z określeniem sąsiedztwo Moore'a.
  2. Nie możesz modyfikować (nadpisywać) mapy, którą w danej chwili sprawdzasz. Nowe stany komórek zapisuj do odrębnej tablicy.
  3. Mam nadzieję, że widzisz, iż Twój zbiór ifów to patologia i należy go przepisać.
0

Rozumiem, poza punktem 2gim. Dlaczego nie mogę modyfikować tablicy którą potem wypisze na ekran?

0

Eh.. uświadomiłem sobie właśnie jak trywialny błąd popełniłem. Dzięki wielkie za pomoc :D

4

Nie możesz modyfikować mapy, podczas gdy ją sprawdzasz - nie mówiłem absolutnie nic o pisaniu na ekran.

f84fa9f12b.png
Zielona komórka ma jednego sąsiada, a czerwona trzech, i w taki sposób powinno się teraz ewaluować ich stany.
Zauważ, że Ty najpierw ewaluujesz stan zielonej komórki, potem ją usuwasz (bo ma jednego sąsiada) i w tej samej jednostce czasu (określenie-klucz!) czerwona ma już tylko dwóch sąsiadów i znika, choć nie powinna.

Dlatego właśnie nowe stany komórek powinieneś zapisywać do drugiej tablicy, której nie bierzesz pod uwagę w warunkach.

Edit: damn, gdybym nie robił obrazka. tobym się wyrobił ;-P

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