Conways Spiel des Lebens



  • Hallo miteinander,

    ich hoffe, dass ihr mir helfen könnt. Ich bin C++-Neuling (seit ca. 3 Wochen) und soll nun Conways Spiel des Lebens programmieren. 😕 Ich sitze schon seit vier Tagen daran 😞 , jedoch komme ich nicht auf eine gescheite Lösung.
    Ich hoffe, dass ich hier in diesem Forum Vorschläge bzw. Lösungsansätze finden kann. Das Programm ist mir persönlich sehr wichtig. Ich hätte gerne eine Vorlage, an der ich die einzelnen Schritte nachvollziehen kann.

    Vielen Dank im Voraus.

    //Conways Spiel des Lebens//
    //Programm hat 100 Zellen, wovon 30 anfänglich leben, 20 Generationen sollen simuliert werden
    //G Parameter für eine Generation
    //N Parameter für die Anzahl der lebenden Nachbarn jeder Zelle
    //n Parameter für die Dimension des Spielfeldes
    //m Parameter für die Anzahl der lebeneden Zellen
    //Zelle hat im Inneren des Feldes 8, am Rand 5 und in den Ecken drei Nachbarn
    
    #include <iostream>
    
    using namespace std;
    
    void erzeugeGen()		//Erzeugen einer Anfangsgeneration mit einer gegeben Zahl lebender Zellen
    
    {	unsigned int**& G;	//Deklaration
    	unsigned int n,m;
    
    	while (m !=0)
    
    	G=1;
    	m--;
    }
    
    void bestimmeGen()		//Erzeugen einer neuen Generation auf Basis einer gegebenen Generation
    
    {	unsigned int**& G;	//Deklaration
    	unsigned int**& N;
    	unsigned int n;
    
    		for() 
    		for()
    
    		switch 
    			case 'a'; /*Besitzt eine Zelle genau zwei lebende Nachbarzellen, dann ändert sich ihr Zusatand
    				     in der nächsten Generation nicht*/
    
    			case 'b'; /*Besitzt die Zelle genau drei lebende Nachbarzellen, dann wird ihr Zustand in der nächsten 
    				     Generation auf "Zelle lebt" gesetzt*/
    
    			case 'c'; /*Besitzt die Zelle weniger als zwei oder mehr als drei lebende Nachbarzellen, dann wird ihr 
    				     Zustand in der nächsten Generation auf "Zelle tot" gesetzt.*/
    
    }
    
    void bestimmeNachb()		//Bestimmen der Anzahl lebender Nachbarzellen aller Zellen einer gegebenen Generation
    
    {	unsigned int** G;	//Deklaration
    	unsigned int**& N;
    	unsigned int n;
    
    		for()		//Berücksichtigung aller Zellen
    		for()
    
    			for()	//Ermitteln der Anzahl der lebenden Nachbarzellen einer Zelle
    			for()
    			if()
    }
    
    void zeigeGen()			//Ausgeben einer gegebenen Generation
    
    {	unsigned int** G;	//Deklaration	
    	unsigned int n;
    
    		for()
    		for()
    }
    
    int main()			//Hauptprogramm
    
    {	unsigned int n;		//Deklaration
    	unsigned int m;
    	unsigned int**G = new unsigned int *[n][n];
    	unsigned int**N = new unsigned int *[n][n];
    
    		cout<<"Die Dimension des Spielfeldes betraegt: ";	//Einlesen Der Dimension n des Spielfeldes
    		cin>>n;
    		cout<<"Anzahl der zu Beginn lebenden Zellen: ";		//Einlesen der Anzahl m der zu Beginn lebenden Zellen
    		cin>>m;
    
    		cout<<							//zufällige Verteilung der Zellen auf dem Spielfeld
    									// Ausgabe der Anfangsgeneration
    		erzeugeGen()
    		zeigeGen()
    
    		for(G=0; G<=m; G++)					//Durchlaufen aller Generationen 
    		cout<< G++;						//Ausgabe jeder Genration mit Nummer
    		bestimme Nachbarn()
    		bestimmeGen()
    		zeigeGen()
    
    		for(n=0; n<m; n++)
    		delete[] G[n];
    		delete[] G;
    
    		for(n=0; n<m> n++)
    		delete[] N[n];
    		delete [] N;
    
    }
    

    LG, mathmath



  • was genau ist denn das problem?



  • Hallo,

    mir ist nicht klar, wie ich die einzelnen Schritte verknüpfen soll, um ein lauffähige Programm zu erstellen.Die ganzen Initialisierungen und so. Ich habe jetzt schon etliche Stunden an der Ausarbeitung des Programms verbracht aber leider weiß ich ab diesem Zeitpunkt nicht mehr, wie ich weiter verfahren soll. Das Problem ist aber auch, dass ich schon in der dritten Woche mit so einem komplexen Programm konfrontiert werde. Ich weiß echt nicht mehr weiter. 😞

    Ich wäre wirklich sehr dankbar, wenn mir jemand helfen könnte. 👍

    LG, mathmath



  • Versuchs doch erstmal mit einem Feld fester Dimension, und gib das Anfangsfeld im Programm vor. Dann brauchst du nur noch den Entwicklungsschritt und die Ausgabe, das sollte aber zu machen sein.



  • Hallo,

    jetzt sitze ich schon etliche Tage an diesem Programm und komme nicht weiter. Leider erhalte ich nur indirekte Beweise, die mich jedoch nicht weiterbringen. Ich weiß, dass hier andere Forenmitglieder einen anderen c++-wissensstand haben als ich ihn wahrscheinlich habe, und deshalb würe es mir helfen, wenn mal ein konkreter Hineis oder ein Lösungsbeispiel gepostet würde, damit ich mich an diesem Beispiel orientieren und die einzelnen Schritte nachvollziehen kann. In C++-Büchern ist immer nur die allgemeine Definition der einzelnen C++-Elemente dargesellt, jedoch fehlen mir stets praktische Beispiele.

    Hat niemand einen konkreten Beweis oder Lösungsansatz parat??? Sonst verzweifle ich hier noch. Es würde mir wirklich sehr helfen. Ich wäre euch dafür sehr dankbar. 😞 😞 😞

    LG, mathmth



  • Hab das vor Jahren mal für die Konsole programmieren müssen. Schau's Dir an, vielleicht hilft es ja. Das so abzugeben ohne es verstanden zu haben wäre hingegen unklug befürchte ich 😉 . Ist evtl. nicht der beste Code, habe es wie gesagt vor einigen Jahren programmiert.

    #include <cstdlib>
    #include <ctime>
    #include <cstring>
    #include <iostream>
    
    const int xMove[8] = { -1, 0, 1, 1, 1, 0,-1,-1 };
    const int yMove[8] = { -1,-1,-1, 0, 1, 1, 1, 0 };
    const int width = 79, height = 23;
    
    class GameOfLife {
    	bool cells[width][height];
    	unsigned long generation;
    	static bool seed;
    
    	unsigned fit(int value, unsigned maximum) {
    		return (value + maximum) % maximum;
    	}
    
    public:
    	GameOfLife() : generation(0) {
    		if(!seed) {
    			std::srand(static_cast<unsigned>(time(0)));
    			seed = true;
    		}
    
        memset(cells, 0, sizeof(cells) * sizeof(bool));
    		for(unsigned i = 0; i < 200; ++i)
    			cells[rand() % width][rand() % height] = true;
    	}
    	void generateNext();
    
    	friend std::ostream& operator <<(std::ostream&, const GameOfLife&);
    };
    
    bool GameOfLife::seed = false;
    
    void GameOfLife::generateNext() {
    	bool nextCells[width][height];
    
    	for(unsigned y = 0; y < height; ++y) {
    		for(unsigned x = 0; x < width; ++x) {
    			unsigned neighbours = 0;
    			for(int i = 0; i < 8; ++i)
    				if(cells[fit(x + xMove[i], width)][fit(y + yMove[i], height)])
    					++neighbours;
    
    			switch(neighbours) {
    				case 2: // passiert nix
    					nextCells[x][y] = cells[x][y];
    					break;
    				case 3: // Geburt
    					nextCells[x][y] = true;
    					break;
    				default: // sterben
    					nextCells[x][y] = false;
    					break;
    			}
    		}
    	}
    
    	memcpy(cells, nextCells, sizeof(cells) * sizeof(bool));
    }
    
    std::ostream& operator <<(std::ostream& os, const GameOfLife& game) {
    	os << "Generation: " << game.generation << "\n";
    
    	for(unsigned y = 0; y < height; ++y) {
    		for(unsigned x = 0; x < width; ++x)
    			os << (game.cells[x][y] ? "O" : " ");
    		os << "\n";
    	}
    	return os;
    }
    
    void wait () {
    	std::cin.clear();
    	std::cin.ignore(std::cin.rdbuf()->in_avail());
    	std::cin.get();
    }
    
    int main() {
    	GameOfLife game;
    
    	for(;;) {
    		std::cout << game << std::endl;
    		game.generateNext();
    		wait();
    	}
    }
    

Anmelden zum Antworten