c++ GameOfLife ...Bitte rettet mich!

faxe

Transparent von Croncels
Registriert
13.11.06
Beiträge
306
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!
 

tjp

Altgelds Küchenapfel
Registriert
07.07.04
Beiträge
4.057
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.
 

faxe

Transparent von Croncels
Registriert
13.11.06
Beiträge
306
@ 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! ;)
 

faxe

Transparent von Croncels
Registriert
13.11.06
Beiträge
306
Aja, ich bekomm meinen "Spielbereich" immer doppelt ausgegeben (also zwei untereinander). Finde den Fehler aber nicht...
 

faxe

Transparent von Croncels
Registriert
13.11.06
Beiträge
306
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
}
 
Zuletzt bearbeitet:

tjp

Altgelds Küchenapfel
Registriert
07.07.04
Beiträge
4.057
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.
 

faxe

Transparent von Croncels
Registriert
13.11.06
Beiträge
306
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
}