1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

c++ GameOfLife ...Bitte rettet mich!

Dieses Thema im Forum "OS X-Developer" wurde erstellt von faxe, 26.10.07.

  1. faxe

    faxe Transparent von Croncels

    Dabei seit:
    13.11.06
    Beiträge:
    305
    Hi
    Ich muss das GameOfLife in c++ fürs Terminal programmieren und ich schaffs nicht.

    Ich hab' jetzt an der FH ein Jahr Java programmiert (hab mir nicht leicht getan!) und jetzt zu Beginn dieses Semesters starteten wir mit c++.
    Und jetzt die erste Aufgabe "GameOfLife".

    Also ich blick' gar nicht durch!!! Ich weiß nicht mal wie man in c++ Methoden schreibt, bzw welche Regeln es da gibt.
    Ausserdem programmieren alle auf Windows im VisualStudio und ich in xcode. Jetzt kommt das (als Anfänger) auch noch erschwerend dazu.

    Kann mir vielleicht wer einen Code zukommen lassen oder weiß wer, wo ich etwas brauchbares herbekomme?
    Ich bin schon fast am verzweifeln. Habe mir jetzt schon eine größere HDD besorgt, damit ich Parallels und damit Windows und damit wiederum VisualStudio installieren kann. Vielleicht gehts dann leichter.

    Vielleicht gibts die eine oder andere gute Seele, die mir helfen kann!
     
  2. tjp

    tjp Baldwins roter Pepping

    Dabei seit:
    07.07.04
    Beiträge:
    3.255
    Dir die Lösung vorzubeten bringt Dir nichts. Stell Fragen was Du nicht verstehst. Der Hauptunterschied ist: C++ kennt kein eingebautes Reflection, und die Speicherverwaltung muß per Hand oder spezieller Konstrukte erfolgen (kein GC dabei, gibt es aber als Library) erfolgen.
     
  3. faxe

    faxe Transparent von Croncels

    Dabei seit:
    13.11.06
    Beiträge:
    305
    @ tjp: Ja, du hast recht! Allerdings kämpfe ich so sehr mit dem programmieren und schaffs einfach noch nicht. Und deshalb wird es mir öfters ein wenig zu "groß" und unübersichtlich- also die Aufgabenstellung.

    Jetzt bekomm ich wenigstens schon was raus. Aber noch nicht so ganz das, was das Ding machen soll.
    Könnte vielleicht wer kurz drüberschauen?

    Code:
    #include <iostream>
    using namespace std;
    
    //Größe x und y
    const int wievielx = 40; //Spalten
    const int wieviely = 15; //Zeilen
    
    int bereich[wieviely][wievielx]; //Spielflächenbereich
    int test=0; //für Testzwecke
    
    /*---*/
    
    //Initialisierung Bereich des GameOfLife
    void initArray (){
    	for(int i=0; i<wieviely; i++){
    		for(int j=0; j<wievielx; j++){
    			bereich[i][j]=0;
    		}
    	}
    }
    
    /*---*/
    
    //Auswahl Start
    void auswahl(){
    	char auswahl;
    	cout << "Bitte Startaufstellung wählen! \n1:Block\n2:Boat\n3:Blinker\n4:Toad\n5:Glider\n6:Spaceship\n7:Die Hard"<< endl;
    	cin.get(auswahl);
    	int verschub= 5; //Verschub bzw Einrückung
    	
    	switch (auswahl) {
    		case '1': //Block
    			bereich[verschub+0][verschub+0] = 1;
    			bereich[verschub+0][verschub+1] = 1;
    			bereich[verschub+1][verschub+0] = 1;
    			bereich[verschub+1][verschub+1] = 1;
    			break;
    		case '2': //Boat
    			bereich[verschub+0][verschub+0] = 1;
    			bereich[verschub+0][verschub+1] = 1;
    			bereich[verschub+1][verschub+0] = 1;
    			bereich[verschub+1][verschub+2] = 1;
    			bereich[verschub+2][verschub+1] = 1;
    			break;
    		case '3': //Blinker
    			bereich[verschub+0][verschub+0] = 1;
    			bereich[verschub+0][verschub+1] = 1;
    			bereich[verschub+0][verschub+2] = 1;
    			break;
    		case '4': //Toad
    			bereich[verschub+0][verschub+1] = 1;
    			bereich[verschub+0][verschub+2] = 1;
    			bereich[verschub+0][verschub+3] = 1;
    			bereich[verschub+1][verschub+0] = 1;
    			bereich[verschub+1][verschub+1] = 1;
    			bereich[verschub+1][verschub+2] = 1;
    			break;
    		case '5': //Glider
    			bereich[verschub+0][verschub+0] = 1;
    			bereich[verschub+0][verschub+1] = 1;
    			bereich[verschub+0][verschub+2] = 1;
    			bereich[verschub+1][verschub+0] = 1;
    			bereich[verschub+2][verschub+1] = 1;
    			break;
    		case '6': //Spaceship
    			bereich[verschub+0][verschub+1] = 1;
    			bereich[verschub+0][verschub+4] = 1;
    			bereich[verschub+1][verschub+0] = 1;
    			bereich[verschub+2][verschub+0] = 1;
    			bereich[verschub+2][verschub+4] = 1;
    			bereich[verschub+3][verschub+0] = 1;
    			bereich[verschub+3][verschub+1] = 1;
    			bereich[verschub+3][verschub+2] = 1;
    			bereich[verschub+3][verschub+3] = 1;
    			break;
    		case '7': //Die Hard
    			bereich[verschub+0][verschub+6] = 1;
    			bereich[verschub+1][verschub+0] = 1;
    			bereich[verschub+1][verschub+1] = 1;
    			bereich[verschub+2][verschub+1] = 1;
    			bereich[verschub+2][verschub+5] = 1;
    			bereich[verschub+2][verschub+6] = 1;
    			bereich[verschub+2][verschub+7] = 1;
    			break;
    		default:
    			cout << "default";
    			break;
    	}
    }/*Ende der Auswahl*/
    
    
    /*---*/
    
    //Berechnen der Zellennachbarn
    char lebend (int zeile, int spalte){
    	int lebend = 0;
    	
    	//Nachbarn
    	for (int c=zeile - 1; c < zeile + 1; c++)	{
    		for (int d=spalte - 1; d < spalte + 1; d++)	{
    			if (bereich[(c + wieviely) % wieviely][(d + wievielx) % wievielx] != 0){ //Check auf "Torus"
    				lebend++;
    				bereich[c][d]=lebend;
    			}/**/
    		}
    	}
    	
    	//wenn zuvor tot und von den 8 Nachbarzellen 3 lebendig sind
    	if (bereich[zeile][spalte] == 0 && lebend == 3) 
    		return 1;
    	//Bedingung für Tot
    	if (bereich[zeile][spalte] != 0 && (lebend < 2 || lebend > 3))
    		return 0;
    	//bleibt gleich
    	if (bereich[zeile][spalte] == 0)
    		return bereich[zeile][spalte];
    	else 
    		//Lebenspunkt wird erhöht
    		return + 1; 
    }
    
    /*---*/
    
    //neue Werte berechnen
    void berechnen(){	
    	//Helper für Zwischenspeicherung
    	int bereichHelper[wieviely][wievielx]; 
    	//Ints für Schleifen,...
    	int c; 
    	int d;
    	
    	for (c=0; c < wieviely; c++){
    		for (d=0; d < wievielx; d++){
    			bereichHelper[c][d] = lebend (c, d);
    		}
    	}
    	
    	for (c=0; c < wieviely; c++){
    		for (d=0; d < wievielx; d++){
    			if (bereichHelper[c][d] != bereich[c][d]) //umspeichern wenn nicht gleich
    				bereich[c][d] = bereichHelper[c][d];
    		}
    	}
    }
    
    /*---*/
    
    //main methode
    int main (int argc, char * const argv[]) {
    	
    	initArray();
    	auswahl();
    		//Abfrage auf Eingabe; mit Eingabe 0 beendet.
    	char end= '1';
    	
    	while (end != '0'){
    		
    		//Linien
    		for(int i=0; i<wievielx; i++){
    			cout << "_";
    		}
    		cout << endl;
    		
    		//Ausgabe gesamt
    		for(int i=0; i<wieviely; i++){
    			for(int j=0; j<wievielx; j++){
    				if (bereich[i][j]==0){ //wenn bereich 0
    					cout<<' '; //Ausgabe wenn 0
    				}else{
    					cout << bereich[i][j]; //Normale Ausgabe
    				}
    			}
    			cout << endl;
    		}
    		
    		//Linien
    		for(int i=0; i<wievielx; i++){
    			cout << "_";
    		}
    		
    		cout << endl;
    		cout << "Für Ende 0 drücken! \n";
    		
    		berechnen(); //Berechnung
    		
    		cin.get (end); //Abfrage auf Ende => 0
    		
    	}
    	
    	
    	return 0;
    }
    
    
    Ich würde euch auch ein virtuelles Bier o.ä. spendieren! ;)
     
  4. faxe

    faxe Transparent von Croncels

    Dabei seit:
    13.11.06
    Beiträge:
    305
    Aja, ich bekomm meinen "Spielbereich" immer doppelt ausgegeben (also zwei untereinander). Finde den Fehler aber nicht...
     
  5. faxe

    faxe Transparent von Croncels

    Dabei seit:
    13.11.06
    Beiträge:
    305
    EDITIERT um 17:08 !

    Neuer Stand:
    Code:
    #include <iostream>
    using namespace std;
    
    //Größe x und y
    const int wievielx = 40; //Spalten
    const int wieviely = 15; //Zeilen
    
    int bereich[wieviely][wievielx]; //Spielflächenbereich
    int test=0; //für Testzwecke
    
    /*---*/
    
    //Initialisierung Bereich des GameOfLife
    void initArray (){
    	for(int i=0; i<wieviely; i++){
    		for(int j=0; j<wievielx; j++){
    			bereich[i][j]= -1;
    		}
    	}
    }
    
    /*---*/
    
    //Auswahl Start
    void auswahl(){
    	char auswahl;
    	cout << "Bitte Startaufstellung wählen! \n1:Block\n2:Boat\n3:Blinker\n4:Toad\n5:Glider\n6:Spaceship\n7:Die Hard"<< endl;
    	cin.get(auswahl);
    	int verschub= 5; //Verschub bzw Einrückung
    	
    	switch (auswahl) {
    		case '1': //Block
    			bereich[verschub+0][verschub+0] = 0;
    			bereich[verschub+0][verschub+1] = 0;
    			bereich[verschub+1][verschub+0] = 0;
    			bereich[verschub+1][verschub+1] = 0;
    			break;
    		case '2': //Boat
    			bereich[verschub+0][verschub+0] = 0;
    			bereich[verschub+0][verschub+1] = 0;
    			bereich[verschub+1][verschub+0] = 0;
    			bereich[verschub+1][verschub+2] = 0;
    			bereich[verschub+2][verschub+1] = 0;
    			break;
    		case '3': //Blinker
    			bereich[verschub+0][verschub+0] = 0;
    			bereich[verschub+0][verschub+1] = 0;
    			bereich[verschub+0][verschub+2] = 0;
    			break;
    		case '4': //Toad
    			bereich[verschub+0][verschub+1] = 0;
    			bereich[verschub+0][verschub+2] = 0;
    			bereich[verschub+0][verschub+3] = 0;
    			bereich[verschub+1][verschub+0] = 0;
    			bereich[verschub+1][verschub+1] = 0;
    			bereich[verschub+1][verschub+2] = 0;
    			break;
    		case '5': //Glider
    			bereich[verschub+0][verschub+0] = 0;
    			bereich[verschub+0][verschub+1] = 0;
    			bereich[verschub+0][verschub+2] = 0;
    			bereich[verschub+1][verschub+0] = 0;
    			bereich[verschub+2][verschub+1] = 0;
    			break;
    		case '6': //Spaceship
    			bereich[verschub+0][verschub+1] = 0;
    			bereich[verschub+0][verschub+4] = 0;
    			bereich[verschub+1][verschub+0] = 0;
    			bereich[verschub+2][verschub+0] = 0;
    			bereich[verschub+2][verschub+4] = 0;
    			bereich[verschub+3][verschub+0] = 0;
    			bereich[verschub+3][verschub+1] = 0;
    			bereich[verschub+3][verschub+2] = 0;
    			bereich[verschub+3][verschub+3] = 0;
    			break;
    		case '7': //Die Hard
    			bereich[verschub+0][verschub+6] = 0;
    			bereich[verschub+1][verschub+0] = 0;
    			bereich[verschub+1][verschub+1] = 0;
    			bereich[verschub+2][verschub+1] = 0;
    			bereich[verschub+2][verschub+5] = 0;
    			bereich[verschub+2][verschub+6] = 0;
    			bereich[verschub+2][verschub+7] = 0;
    			break;
    		default:
    			cout << "default\n";
    			break;
    	}
    }/*Ende der Auswahl*/
    
    
    /*---*/
    
    //Berechnen der Zellennachbarn
    char lebend (int zeile, int spalte){
    	int lebend = 0;
    	
    	//Nachbarn der Zelle auf Position Zeile Spalte
    	for (int y=zeile - 1; y <= zeile + 1; y++)	{
    		for (int x=spalte - 1; x <= spalte + 1; x++)	{
    			//if (bereich[(y + wieviely) % wieviely][(x + wievielx) % wievielx] != 0){ //Check auf "Torus", (hunzt noch!)
    			if (bereich[y][x]	> -1){ //ohne Torus
    				lebend++;
    			}
    		}
    	}
    	
    	//Bedingung für Geburt
    	if (bereich[zeile][spalte] == -1 && lebend == 3) {
    		return 0;
    	}
    	//Bedingung für Tot
    	if (bereich[zeile][spalte] != -1 && (lebend < 2 || lebend > 3)){
    		return -1;
    	}
    	//bleibt tot
    	if (bereich[zeile][spalte] < 0){
    		return bereich[zeile][spalte];
    	}
    	else {
    		//Lebenspunkt wird erhöht
    		return bereich[zeile][spalte] + 1; 
    	}
    	
    }
    
    /*---*/
    
    //neue Werte berechnen
    void berechnen(){	
    	//Helper für Zwischenspeicherung
    	int bereichHelper[wieviely][wievielx]; 
    	//Ints für Schleifen,...
    	int y; 
    	int x;
    	
    	//Helper befüllen
    	for (y=0; y < wieviely; y++){
    		for (x=0; x < wievielx; x++){
    			bereichHelper[y][x] = lebend (y, x);
    		}
    	}
    	
    	//Zurückspeichern in Ursprungsarray
    	for (y=0; y < wieviely; y++){
    		for (x=0; x < wievielx; x++){
    			bereich[y][x] = bereichHelper[y][x];  //Zurückspeichern
    		}
    	}
    }
    
    /*---*/
    
    //main methode
    int main (int argc, char * const argv[]) {
    	
    	initArray();
    	auswahl();
    		//Abfrage auf Eingabe; mit Eingabe 0 beendet.
    	char end= '1';
    	
    	while (end != '0'){
    		
    		//Linien
    		for(int i=0; i<wievielx; i++){
    			cout << "_";
    		}
    		cout << endl;
    		
    		//Ausgabe gesamt
    		for(int i=0; i<wieviely; i++){
    			for(int j=0; j<wievielx; j++){
    				if (bereich[i][j] < 0){ //wenn Zelle kleiner als 0
    					cout<<' '; //Ausgabe wenn 0
    				}else if(bereich[i][j] < 10){
    					cout << bereich[i][j]; //Normale Ausgabe
    				}else{
    					cout << "*"; //Wenn mehr als 9
    				}
    			}
    			cout << endl;
    		}
    		
    		//Linien
    		for(int i=0; i<wievielx; i++){
    			cout << "_";
    		}
    		
    		cout << endl;
    		cout << "Für Ende 0 drücken! \n";
    		
    		berechnen(); //Berechnung
    		
    		cin.get (end); //Abfrage auf Ende => 0
    		
    	}
    	
    	return 0; //Programm beendet fehlerfrei
    }
    
     
    #5 faxe, 27.10.07
    Zuletzt bearbeitet: 27.10.07
  6. tjp

    tjp Baldwins roter Pepping

    Dabei seit:
    07.07.04
    Beiträge:
    3.255
    Abgesehen vom prozeduralen Programmierstil sieht das doch so weit ok aus.
    Die Funktion "lebend" sollte als Rückgabetyp "int" verwenden, da das besser zum Array paßt und zweitens nicht auf allen Plattformen "char" ein Vorzeichner behafteter Typ ist. D.h. char kann zuweilen auch Werte aus dem Intervall [0..255] annehmen. Also, entweder "signed char" oder "int" verwenden.
     
  7. faxe

    faxe Transparent von Croncels

    Dabei seit:
    13.11.06
    Beiträge:
    305
    Danke erst mal für die Antwort!

    Hier meine soeweit letzen Änderungen. Funktioniert noch nicht ganz super (da der Glider zB "fahren" sollte). Aber ich lass es mal soweit... Wird hoffentlich ein paar Punkte geben!

    Code:
    #include <iostream>
    using namespace std;
    
    //Größe x und y
    const int wievielx = 40; //Spalten
    const int wieviely = 15; //Zeilen
    
    int bereich[wieviely][wievielx]; //Spielflächenbereich
    int test=0; //für Testzwecke
    
    /*---*/
    
    //Initialisierung Bereich des GameOfLife
    void initArray (){
    	for(int i=0; i<wieviely; i++){
    		for(int j=0; j<wievielx; j++){
    			bereich[i][j]= -1; //alle auf tot gesetzt
    		}
    	}
    }
    
    /*---*/
    
    //Auswahl Start
    void auswahl(){
    	char auswahl;
    	cout << "Bitte Startaufstellung wählen! \n1:Block\n2:Boat\n3:Blinker\n4:Toad\n5:Glider\n6:Spaceship\n7:Die Hard"<< endl;
    	cin.get(auswahl);
    	int verschub= 5; //Verschub bzw Einrückung
    	
    	switch (auswahl) {
    		case '1': //Block
    			bereich[verschub+0][verschub+0] = 0;
    			bereich[verschub+0][verschub+1] = 0;
    			bereich[verschub+1][verschub+0] = 0;
    			bereich[verschub+1][verschub+1] = 0;
    			break;
    		case '2': //Boat
    			bereich[verschub+0][verschub+0] = 0;
    			bereich[verschub+0][verschub+1] = 0;
    			bereich[verschub+1][verschub+0] = 0;
    			bereich[verschub+1][verschub+2] = 0;
    			bereich[verschub+2][verschub+1] = 0;
    			break;
    		case '3': //Blinker
    			bereich[verschub+0][verschub+0] = 0;
    			bereich[verschub+0][verschub+1] = 0;
    			bereich[verschub+0][verschub+2] = 0;
    			break;
    		case '4': //Toad
    			bereich[verschub+0][verschub+1] = 0;
    			bereich[verschub+0][verschub+2] = 0;
    			bereich[verschub+0][verschub+3] = 0;
    			bereich[verschub+1][verschub+0] = 0;
    			bereich[verschub+1][verschub+1] = 0;
    			bereich[verschub+1][verschub+2] = 0;
    			break;
    		case '5': //Glider
    			bereich[verschub+0][verschub+0] = 0;
    			bereich[verschub+0][verschub+1] = 0;
    			bereich[verschub+0][verschub+2] = 0;
    			bereich[verschub+1][verschub+0] = 0;
    			bereich[verschub+2][verschub+1] = 0;
    			break;
    		case '6': //Spaceship
    			bereich[verschub+0][verschub+1] = 0;
    			bereich[verschub+0][verschub+4] = 0;
    			bereich[verschub+1][verschub+0] = 0;
    			bereich[verschub+2][verschub+0] = 0;
    			bereich[verschub+2][verschub+4] = 0;
    			bereich[verschub+3][verschub+0] = 0;
    			bereich[verschub+3][verschub+1] = 0;
    			bereich[verschub+3][verschub+2] = 0;
    			bereich[verschub+3][verschub+3] = 0;
    			break;
    		case '7': //Die Hard
    			bereich[verschub+0][verschub+6] = 0;
    			bereich[verschub+1][verschub+0] = 0;
    			bereich[verschub+1][verschub+1] = 0;
    			bereich[verschub+2][verschub+1] = 0;
    			bereich[verschub+2][verschub+5] = 0;
    			bereich[verschub+2][verschub+6] = 0;
    			bereich[verschub+2][verschub+7] = 0;
    			break;
    		default:
    			cout << "default\n";
    			break;
    	}
    }/*Ende der Auswahl*/
    
    /*---*/
    
    //Berechnen der Zellennachbarn
    int lebend (int zeile, int spalte){
    	int lebend = 0;
    	
    	//Nachbarn der Zelle auf Position Zeile Spalte
    	for (int y=zeile - 1; y <= zeile + 1; y++)	{
    		for (int x=spalte - 1; x <= spalte + 1; x++)	{
    			if (bereich[(y + wieviely) % wieviely][(x + wievielx) % wievielx] > -1){ //Check auf "Torus" durch modulo, (hunzt noch!)
    			//if (bereich[y][x]	> -1){ //ohne Torus
    				lebend++;
    			}
    		}
    	}
    	
    	//Bedingung für Geburt
    	if (bereich[zeile][spalte] == -1 && lebend == 3) {
    		cout << "Geburt ";
    		return 0;
    	}
    	//Bedingung für Tot
    	if (bereich[zeile][spalte] != -1 && (lebend < 2 || lebend > 3)){
    		return -1;
    	}
    	//bleibt tot
    	if (bereich[zeile][spalte] < 0){
    		return bereich[zeile][spalte];
    	}
    	else {
    		//Lebenspunkt wird erhöht
    		return bereich[zeile][spalte] + 1; 
    	}
    	
    }
    
    /*---*/
    
    //neue Werte berechnen
    void berechnen(){	
    	//Helper für Zwischenspeicherung
    	int bereichHelper[wieviely][wievielx]; 
    	//Ints für Schleifen,...
    	int y; 
    	int x;
    	
    	//Helper befüllen
    	for (y=0; y < wieviely; y++){
    		for (x=0; x < wievielx; x++){
    			bereichHelper[y][x] = lebend (y, x);
    		}
    	}
    	
    	//Zurückspeichern in Ursprungsarray
    	for (y=0; y < wieviely; y++){
    		for (x=0; x < wievielx; x++){
    			bereich[y][x] = bereichHelper[y][x];  //Zurückspeichern
    		}
    	}
    }
    
    /*---*/
    
    //Linien bei Ausgabe
    void lines(){
    		for(int i=0; i<wievielx; i++){
    			cout << "_";
    		}
    		cout << endl;
    }
    
    /*---*/
    
    //Ausgabe gesamt
    void ausgabe(){
    	for(int i=0; i<wieviely; i++){
    			for(int j=0; j<wievielx; j++){
    				if (bereich[i][j] < 0){ //wenn Zelle kleiner als 0
    					cout<<' '; //Ausgabe wenn 0
    				}else if(bereich[i][j] < 10){
    					cout << bereich[i][j]; //Normale Ausgabe
    				}else{
    					cout << "*"; //Wenn mehr als 9
    				}
    			}
    			cout << endl;
    		}
    }
    
    /*---*/
    
    //main Methode
    int main (int argc, char * const argv[]) {
    	
    	initArray();
    	auswahl();
    		//Abfrage auf Eingabe; mit Eingabe 0 beendet.
    	char end= '1';
    	
    	while (end != '0'){
    		lines();
    		ausgabe();
    		lines();
    		
    		cout << "Für Ende 0 drücken! \n";
    		berechnen(); //Berechnung
    	
    		cin.get (end); //Abfrage auf Ende => 0
    	}
    	return 0; //Programm beendet fehlerfrei
    }
     

Diese Seite empfehlen