Game of life

Chloe

Mitglied
Abend ihr Lieben,
Ich darf das allbekannte Game of Life programmieren. Leider wurde ich aus den bereits bestehenden Artikeln nicht schlau, daher seid bitte nicht böse, dass ich nochmal selber nachfrage.^^

Ich habe schon einiges selber programmiert, bin aber auf kleine Probleme gestoßen.

Java:
public class Zellen 
{	
int i,j,nachbar;
boolean [][] nextG = new boolean [i][j];//Speicherarray für nächste Generation
boolean [][] zellenFeld = new boolean [i][j];
/*
 * zellenFeld = Menge von Zellen die entweder tot(false)
 * oder lebendig(true) sind.
 */

int nachbarnZaehlen()
{
nachbar = 0;

	if (zellenFeld[i][j+1]==true)
		nachbar++;
	if (zellenFeld[i+1][j+1]==true)
		nachbar++;
	if (zellenFeld[i+1][j]==true)
		nachbar++;
	if (zellenFeld[i+1][j-1]==true)
		nachbar++;
	if (zellenFeld[i][j-1]==true)
		nachbar++;
	if (zellenFeld[i-1][j-1]==true)
		nachbar++;
	if (zellenFeld[i-1][j]==true)
		nachbar++;
	if (zellenFeld[i-1][j+1]==true)
		nachbar++;
	return nachbar;
}

void print()
{
	if(zellenFeld[i][j]==true)
	{
		System.out.println("o");
	}
	else
	{
		System.out.println(" ");
	}
	
}//Ende print()

boolean totOderLebendig(int i,int j)
{
	nachbarnZaehlen();
	
	/* eine lebende Zelle mit weniger als zwei lebenden Nachbarn 
	 *ist in der nächsten Generation tot.
	 */
	if (zellenFeld[i][j]==true)
	{
		if(nachbar<2)
			nextG[i][j]=false;

		/*
		 *eine lebende Zelle mit mehr als drei lebenden 
		 *Nachbarn ist in der nächsten Generation tot.
		 */
		if(nachbar>3)
			nextG[i][j]=false;
	}
	
	else if(zellenFeld[i][j]==false)
	{
		/*eine tote Zelle mit genau drei lebenden Nachbarn wird 
		 * in der nächsten Generation neu geboren.
		 */
		if(nachbar==3)
			nextG[i][j]=true;
	}
}// Ende totOderLebendig

/**
 * Die nächste Generation wird berechnet.
 */
void naechsteGeneration()
{
	for(int i=0;i<10; i++)
	{
		for(int j=0;j<10;j++)
		{
		nextG[i][j] = totOderLebendig(i,j);
		//nächste Generation wird in nextG ersteinmal eingespeichert
		}
	}
	for(int i=0;i<10;i++)
	{
		for(int j=0;j<10;j++)
		{
			zellenFeld[i][j] = nextG[i][j];
			//Wert des Zwischenspeicherarrays wird übertragen
		}
	}
}

}//Ende Zellen

Mein erstes Problem ist, dass mein Rand fest sein soll. (Das Array ist festgegt und darf auch nicht verändert werden)
Die Frage ist wie ich am Rad die Nachbarn zählen kann.
Zum anderen (ein eher kleiner Denkfehler) soll ich ja bei der Methode totOderLebendig ein boolean Wert zurückgeben, aber wie soll der aussehen?

Bitte nicht über die einfachsten Fragen wundern, ich bin ein blutiger Anfänger.^^"
 

Niggel595

Mitglied
Also, du willst am Rand nur dann die Nachbarn beachten, wenn es sie gibt. Dazu überprüfst du das mithilfe von &&. Nur wenn der erste Ausdruck stimmt, wird der zweite überprüft, es fliegt also keine Exception.

Java:
int nachbarnZaehlen()
{
nachbar = 0;

	if (j<zellenFeld[i].length-1&&zellenFeld[i][j+1]==true)
		nachbar++;
	if (i<zellenFeld.length-1&&j<zellenFeld[i].length-1&&zellenFeld[i+1][j+1]==true)
		nachbar++;
	if (i<zellenFeld.length-1&&zellenFeld[i+1][j]==true)
		nachbar++;
	if (i<zellenFeld.length-1&&j>0&&zellenFeld[i+1][j-1]==true)
		nachbar++;
	if (j>0&&zellenFeld[i][j-1]==true)
		nachbar++;
	if (i>0&&j>0&&zellenFeld[i-1][j-1]==true)
		nachbar++;
	if (i>0&&zellenFeld[i-1][j]==true)
		nachbar++;
	if (i>0&&j<zellenFeld[i].length&&zellenFeld[i-1][j+1]==true)
		nachbar++;
	return nachbar;
}

In der Methode totOderLebendig hast du mehrmals den Ausdruck
Java:
nextG[i][j]=false;
bzw.
Java:
nextG[i][j]=true;
verwendet. Benutze stattdessen einfach
Java:
return false;
bzw.
Java:
return true;
, um den entsprechenden Wert zurückzugeben. Da du ihn in der Methode sowieso dem entsprechenden Feld in nextG zuordnest, ist es das, was du brauchst.

Außerdem solltest du in der Methode totOderLebendig die Zeile
Java:
else if(zellenFeld[i][j]==false)
durch ein einfaches
Java:
else
ersetzen, da ein Feld ja entweder tot oder eben lebendig ist. Bei deiner aktuellen Version müsstest du noch definieren, was zurückgegeben werden soll, wenn ein Feld weder tot noch lebendig ist, was ja offensichtlich unmöglich ist.

LG
Niggel

edit: Verdammt, der Doppelpost war unerwünscht. Sorry dafür, kann evtl. dieser Post entfernt werden?
 
Zuletzt bearbeitet von einem Moderator:

Niggel595

Mitglied
Moin,

also, du willst am Rand nur dann die Nachbarn beachten, wenn es sie gibt. Dazu überprüfst du das mithilfe von &&. Nur wenn der erste Ausdruck stimmt, wird der zweite überprüft, es fliegt also keine Exception.

Java:
int nachbarnZaehlen()
{
nachbar = 0;

	if (j<zellenFeld[i].length-1&&zellenFeld[i][j+1]==true)
		nachbar++;
	if (i<zellenFeld.length-1&&j<zellenFeld[i].length-1&&zellenFeld[i+1][j+1]==true)
		nachbar++;
	if (i<zellenFeld.length-1&&zellenFeld[i+1][j]==true)
		nachbar++;
	if (i<zellenFeld.length-1&&j>0&&zellenFeld[i+1][j-1]==true)
		nachbar++;
	if (j>0&&zellenFeld[i][j-1]==true)
		nachbar++;
	if (i>0&&j>0&&zellenFeld[i-1][j-1]==true)
		nachbar++;
	if (i>0&&zellenFeld[i-1][j]==true)
		nachbar++;
	if (i>0&&j<zellenFeld[i].length&&zellenFeld[i-1][j+1]==true)
		nachbar++;
	return nachbar;
}

In der Methode totOderLebendig hast du mehrmals den Ausdruck
Java:
nextG[i][j]=false;
bzw.
Java:
nextG[i][j]=true;
verwendet. Benutze stattdessen einfach
Java:
return false;
bzw.
Java:
return true;
, um den entsprechenden Wert zurückzugeben. Da du ihn in der Methode sowieso dem entsprechenden Feld in nextG zuordnest, ist es das, was du brauchst.

Außerdem solltest du in der Methode totOderLebendig die Zeile
Java:
else if(zellenFeld[i][j]==false)
durch ein einfaches
Java:
else
ersetzen, da ein Feld ja entweder tot oder eben lebendig ist. Bei deiner aktuellen Version müsstest du noch definieren, was zurückgegeben werden soll, wenn ein Feld weder tot noch lebendig ist, was ja offensichtlich unmöglich ist.

LG
Niggel
 

piu58

Mitglied
> Die Frage ist wie ich am Rand die Nachbarn zählen kann.

Ich sehe zwei leicht zu programmerende Methoden:
1) Rand ist Rand, dort gibt es keine Nachbarn. Am einfachsten zu realisieren, wenn man ringsrum eine Reihe frei lässt, d.h. vor der Zählung einfach löscht (falls dort was entstanden sein sollte)
2) Überschnappen: Das Gebiet ist torusmäßig verbunden. Ein Segler würde also rechts rauslaufen und links wieder hineinkommen. Dann gibt es keinen Rand, obwohl das Gebiet begrenzt ist.
 
H

hüteüberhüte

Gast
Erste Problem sind die Bezeichner: Lebendig bedeutet noch etwas mehr als lebend, und ist nicht das Antonym. ;)
 
H

hüteüberhüte

Gast
Ich habs auch mal programmiert und möchte es gerne hier präsentieren:

Java:
import java.util.Random;

/**
 * @author hütte
 */
public class ConwaysSpielDesLebens {

    private static final int LÄNGE = 5;
    private static final double WAHRSCHEINLICHKEIT = 0.5; // 1.0 immer true
    private static boolean[][] spiel = new boolean[LÄNGE][LÄNGE];

    static {
        Random r = new Random();
        for (int i = 0; i < LÄNGE; i++) {
            for (int j = 0; j < LÄNGE; j++) {
                if (r.nextDouble() < WAHRSCHEINLICHKEIT) {
                    spiel[i][j] = true;
                }
            }
        }
    }

    private static void nächsteGeneration() {
        boolean[][] neuSpiel = new boolean[LÄNGE][LÄNGE];
        for (int i = 0; i < LÄNGE; i++) {
            for (int j = 0; j < LÄNGE; j++) {
                int nachbarn = gibNachbarn(i, j);
                if (spiel[i][j]) {
                    if (nachbarn < 2 || nachbarn > 3) {
                        neuSpiel[i][j] = false;
                    } else {
                        neuSpiel[i][j] = true;
                    }
                } else {
                    if (nachbarn == 3) {
                        neuSpiel[i][j] = true;
                    } else {
                        neuSpiel[i][j] = false;
                    }
                }
            }
        }
        spiel = neuSpiel;
    }

    private static int gibNachbarn(int i, int j) {
        int sum = 0;
        if (imSpielUndLebend(i - 1, j - 1)) {
            sum++;
        }
        if (imSpielUndLebend(i - 1, j    )) {
            sum++;
        }
        if (imSpielUndLebend(i - 1, j + 1)) {
            sum++;
        }
        if (imSpielUndLebend(i    , j - 1)) {
            sum++;
        }
        if (imSpielUndLebend(i    , j + 1)) {
            sum++;
        }
        if (imSpielUndLebend(i + 1, j - 1)) {
            sum++;
        }
        if (imSpielUndLebend(i + 1, j    )) {
            sum++;
        }
        if (imSpielUndLebend(i + 1, j + 1)) {
            sum++;
        }
        return sum;
    }

    private static boolean imSpielUndLebend(int i, int j) {
        return i < LÄNGE && j < LÄNGE && i >= 0 && j >= 0 && spiel[i][j];
    }

    private static void drucke() {
        for (int i = 0; i < LÄNGE; i++) {
            System.out.print('|');
            for (int j = 0; j < LÄNGE; j++) {
                if (spiel[i][j]) {
                    System.out.print('*');
                } else {
                    System.out.print(' ');
                }
                System.out.print('|');
            }
            System.out.println("");
        }
        System.out.println("");
    }

    public static void main(String[] args) {
        drucke();
        for (int i = 0; i < 10; i++) {
            nächsteGeneration();
            drucke();
        }
    }
}

Code:
run:
| |*|*| | |
|*|*|*|*| |
| | |*|*|*|
| | |*| | |
| | |*| | |

|*| | |*| |
|*| | | |*|
| | | | |*|
| |*|*| | |
| | | | | |

| | | | | |
| | | |*|*|
| |*| |*| |
| | | | | |
| | | | | |

| | | | | |
| | |*|*|*|
| | |*|*|*|
| | | | | |
| | | | | |

| | | |*| |
| | |*| |*|
| | |*| |*|
| | | |*| |
| | | | | |

| | | |*| |
| | |*| |*|
| | |*| |*|
| | | |*| |
| | | | | |

| | | |*| |
| | |*| |*|
| | |*| |*|
| | | |*| |
| | | | | |

| | | |*| |
| | |*| |*|
| | |*| |*|
| | | |*| |
| | | | | |

| | | |*| |
| | |*| |*|
| | |*| |*|
| | | |*| |
| | | | | |

| | | |*| |
| | |*| |*|
| | |*| |*|
| | | |*| |
| | | | | |

| | | |*| |
| | |*| |*|
| | |*| |*|
| | | |*| |
| | | | | |

Ich hab keinen Grund gesehen, die Methoden nicht statisch zu machen.

Vielleicht findet ihr irgendwelche Fehler, dann wäre es super, wenn ihr mir die mitteilt.

Grüßle
 
H

hüteüberhüte

Gast
Zeile 29 und 31 hätte ich vielleicht tauschen sollen:

Code:
 true
 false

 true
 false ...

nächsteGeneration vielleicht Folgegeneration nennen,

gibNachbarn vielleicht nur nachbarn nennen...

Sonst fällt mir weiter nichts bewegendes auf... Vielleicht noch eine Erkennung einbauen, ob sich Folgegenerationen wiederholen... :bahnhof:
 

Chloe

Mitglied
Hier die gewünschte Klasse ZellenTest. Hab einfach mal nur die dritte Konfiguration gepostet, sonst wird es zu lang.^^

Java:
public class ZellenTest extends Zellen
{
	public static void main(String[] args) 
	{
		Zellen z = new Zellen();
		int m;

System.out.println("Die dritte Konfiguration beginnt.");
		
		for(int i=0; i<10; i++)
		{
			for (int j=0; j<10; j++)
			{
				z.zellenFeld[i][j]=false;
			}
		}
		z.zellenFeld[3][3]=true;
		z.zellenFeld[3][4]=true;
		z.zellenFeld[4][3]=true;
		z.zellenFeld[4][4]=true;
		z.zellenFeld[5][5]=true;
		z.zellenFeld[5][6]=true;
		z.zellenFeld[6][5]=true;
		z.zellenFeld[6][6]=true;
// Bilden Sie 10 Generationen und lassen Sie jede ausgeben
		
		z.print();

		System.out.println("---------------");

			for(m=0;m<10;m++)
			{
				z.naechsteGeneration();
				z.print();
			}
	}

@Berlinerin bist du in meinem Kurs? (FIW 1.Semester)
 
H

hüteüberhüte

Gast
Ich habe Berlinerin schon eine Nachricht geschickt, mit einer nicht-statischen Ansatz. Evtl. müsste darin zellen/zellenFeld nicht den Modifier private besitzen. Ich denke, damit sollte die Aufgabe lösbar sein....

Hier noch ein vereinfachtes if-else-Konstrukt:

Java:
private boolean totOderLebendig(int i, int j) {
  int nachbarn = nachbarn(i, j);
  return nachbarn == 3 || zellen[i][j] && nachbarn == 2;
}

Grüßle
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
X Game of Life Nachbarn zählen Java Basics - Anfänger-Themen 20
P Moore Nachbarschaft-Game of Life Java Basics - Anfänger-Themen 1
L Conways Game of Life Java Basics - Anfänger-Themen 4
J Game of life Java Basics - Anfänger-Themen 3
E Belebeste Area im Game of Life suchen Java Basics - Anfänger-Themen 0
B Wer kennt einen Link für vollständiges, leichtverständliches "Game of Life"? Java Basics - Anfänger-Themen 1
P Game of Life Java Basics - Anfänger-Themen 18
C Conways Game of Life / "Waldbrandsimulation": wieso temporäres Hilfs-Array?! Java Basics - Anfänger-Themen 8
K Game of Life Implementierung Java Basics - Anfänger-Themen 30
D Game of Life - Nachbarn zählen Java Basics - Anfänger-Themen 8
Developer_X Game of Life Java Basics - Anfänger-Themen 10
L Game of life in einem FensterVisualisieren Java Basics - Anfänger-Themen 2
D Game of Life Java Basics - Anfänger-Themen 14
L Wizzard-Game Java Basics - Anfänger-Themen 3
Jxhnny.lpz bouncing Ball (Brick-Breaker-Game) Java Basics - Anfänger-Themen 1
V Probleme Guessing Game Java Basics - Anfänger-Themen 8
P 2D Game Java Basics - Anfänger-Themen 6
B Verwirrender Game Loop Java Basics - Anfänger-Themen 6
B "Snake"-Game verbuggt Java Basics - Anfänger-Themen 0
K Game of live Java Basics - Anfänger-Themen 4
F Java Collectors Game Hilfe Java Basics - Anfänger-Themen 4
C Wie kann ich jetzt von der Game.java auf die Timer.java zugreifen? Java Basics - Anfänger-Themen 6
F Game-Engine für textbasierendes Spiel: Architektur? Java Basics - Anfänger-Themen 9
D Textfield im Game ,Problem: while-Schleife Java Basics - Anfänger-Themen 1
K Gutes Java 3D Game Tutorial gesucht Java Basics - Anfänger-Themen 6
Java-Insel Game-Konzept Java Basics - Anfänger-Themen 10
G Game Loop Problem Java Basics - Anfänger-Themen 9
T Kleines Game mit Kollision Java Basics - Anfänger-Themen 2
V Start ins Java Game Development Java Basics - Anfänger-Themen 22
I Programm Game & AR Java Basics - Anfänger-Themen 13
T Anagram Game - warum ist es auf 2 Packages aufgeteilt? Java Basics - Anfänger-Themen 3
S 3d-game java3d/eigene API Java Basics - Anfänger-Themen 4
C Pong Game Java Basics - Anfänger-Themen 2
H What is the Life Cycle of an Object Created Within/Outside of a Servlet? Will that item be destroyed after the session ends? Java Basics - Anfänger-Themen 1
B Erste Schritte Way of life ohne import - Habe Beispiel, macht Unfug Java Basics - Anfänger-Themen 21

Ähnliche Java Themen

Neue Themen


Oben