Insane355 Geschrieben 9. November 2009 Geschrieben 9. November 2009 Hi! Ich muss für mein Studium das Game of Life implementieren. Das Grundgerüst ist soweit schon mal fertig, allerdings stehe ich jetzt vor dem Problem, dass ich es nicht schaffe das zweidimensionale array an die verschiedenen Funktionen zu übergeben. #include <stdio.h> #include <stdlib.h> #include <windows.h> void show(int breite, int hoehe); void advance(int breite, int hoehe); int check(int breite, int hoehe); void start(int breite, int hoehe); int main() { int breite; int hoehe; int neustart=0; int feld[breite][hoehe]; while(neustart==0) { printf("\n\t\t\t\tGame of Life\n________________________________________________________________________________\n\n"); int time; //Eingaben werden abgefragt und eingelesen printf("Feldbreite: "); scanf("%d", &breite); fflush(stdin); printf("Feldhoehe: "); scanf("%d", &hoehe); printf("Generationsabstand in ms: "); scanf("%d", &time); //Eingabe wird überprüft if(check(breite, hoehe)==1) break; start(breite,hoehe); advance(breite,hoehe); show(breite, hoehe); system("pause"); } system("pause"); return 0; } //Das Game of Life wird nach den Regeln berechnet. void advance(int breite, int hoehe) { int feld[breite][hoehe]; int calcfeld[breite][hoehe]; int nachbar; printf("\n\nVor Berechnung:%d\n", feld[4][4]); for(int y=0; y<hoehe; y++) { for(int x=0; x<breite; x++) { //Eckzellen und Randzellen: if(((y==0)&&(x==0))||((y==0)&&(x==breite-1))||((y==hoehe-1)&&(x==0))||((y==hoehe-1)&&(x==breite-1))||(y==0)||(x==breite-1)||(y==0)||(y==hoehe-1)) { if((y==0)&&(x==0)) //Eckzelle links oben { if(calcfeld[x+1][y]==1) nachbar++; if(calcfeld[x+1][y+1]==1) nachbar++; if(calcfeld[x][y+1]==1) nachbar++; if(calcfeld[x][hoehe-1]==1) nachbar++; if(calcfeld[x+1][hoehe-1]==1) nachbar++; if(calcfeld[breite-1][y]==1) nachbar++; if(calcfeld[breite-1][y+1]==1) nachbar++; if(calcfeld[breite-1][hoehe-1]==1) nachbar++; } if((y==0)&&(x==breite-1)) //Eckzelle rechts oben { if(calcfeld[breite-2][0]==1) nachbar++; if(calcfeld[breite-2][1]==1) nachbar++; if(calcfeld[breite-1][1]==1) nachbar++; if(calcfeld[0][0]==1) nachbar++; if(calcfeld[0][1]==1) nachbar++; if(calcfeld[0][hoehe-1]==1) nachbar++; if(calcfeld[breite-1][hoehe-1]==1) nachbar++; if(calcfeld[breite-2][hoehe-1]==1) nachbar++; } if((y==hoehe-1)&&(x==breite-1)) //Eckzelle rechts unten { if(calcfeld[breite-2][hoehe-1]==1) nachbar++; if(calcfeld[breite-2][hoehe-2]==1) nachbar++; if(calcfeld[breite-1][hoehe-2]==1) nachbar++; if(calcfeld[0][hoehe-1]==1) nachbar++; if(calcfeld[0][hoehe-2]==1) nachbar++; if(calcfeld[0][0]==1) nachbar++; if(calcfeld[breite-1][0]==1) nachbar++; if(calcfeld[breite-2][0]==1) nachbar++; } if((y==hoehe-1)&&(x==0)) //Eckzelle links unten { if(calcfeld[1][hoehe-1]==1) nachbar++; if(calcfeld[1][hoehe-2]==1) nachbar++; if(calcfeld[0][hoehe-2]==1) nachbar++; if(calcfeld[0][0]==1) nachbar++; if(calcfeld[1][0]==1) nachbar++; if(calcfeld[breite-1][0]==1) nachbar++; if(calcfeld[breite-1][hoehe-1]==1) nachbar++; if(calcfeld[breite-1][hoehe-2]==1) nachbar++; } if((x==0)&&(y!=0)&&(y!=hoehe-1)) //Randzellen links { if(calcfeld[x][y-1]==1) nachbar++; if(calcfeld[x][y+1]==1) nachbar++; if(calcfeld[x+1][y-1]==1) nachbar++; if(calcfeld[x+1][y]==1) nachbar++; if(calcfeld[x+1][y+1]==1) nachbar++; if(calcfeld[breite-1][y]==1) nachbar++; if(calcfeld[breite-1][y-1]==1) nachbar++; if(calcfeld[breite-1][y+1]==1) nachbar++; } if((y==0)&&(x!=0)&&(x!=breite-1)) //Randzellen oben { if(calcfeld[x-1][y]==1) nachbar++; if(calcfeld[x-1][y+1]==1) nachbar++; if(calcfeld[x][y+1]==1) nachbar++; if(calcfeld[x+1][y]==1) nachbar++; if(calcfeld[x+1][y+1]==1) nachbar++; if(calcfeld[x-1][hoehe-1]==1) nachbar++; if(calcfeld[x][hoehe-1]==1) nachbar++; if(calcfeld[x+1][hoehe-1]==1) nachbar++; } if((x==breite-1)&&(y!=0)&&(y!=hoehe-1)) //Randzellen rechts { if(calcfeld[x-1][y]==1) nachbar++; if(calcfeld[x-1][y-1]==1) nachbar++; if(calcfeld[x-1][y+1]==1) nachbar++; if(calcfeld[x][y-1]==1) nachbar++; if(calcfeld[x][y+1]==1) nachbar++; if(calcfeld[0][y-1]==1) nachbar++; if(calcfeld[0][y]==1) nachbar++; if(calcfeld[0][y+1]==1) nachbar++; } if((y==hoehe-1)&&(x!=0)&&(x!=breite-1)) //Randzellen unten { if(calcfeld[x-1][y]==1) nachbar++; if(calcfeld[x-1][y-1]==1) nachbar++; if(calcfeld[x-1][0]==1) nachbar++; if(calcfeld[x][y-1]==1) nachbar++; if(calcfeld[x][0]==1) nachbar++; if(calcfeld[x+1][y-1]==1) nachbar++; if(calcfeld[x+1][y]==1) nachbar++; if(calcfeld[x+1][0]==1) nachbar++; } } else { //reguläre Zelle: if(calcfeld[x-1][y]==1) nachbar++; if(calcfeld[x-1][y-1]==1) nachbar++; if(calcfeld[x-1][y+1]==1) nachbar++; if(calcfeld[x][y-1]==1) nachbar++; if(calcfeld[x][y+1]==1) nachbar++; if(calcfeld[x+1][y-1]==1) nachbar++; if(calcfeld[x+1][y]==1) nachbar++; if(calcfeld[x+1][y+1]==1) nachbar++; } //Anzahl der Nachbarn wird ausgewertet if((feld[x][y]==0)&&(nachbar==3)) feld[x][y]=1; if((feld[x][y]==1)&&(nachbar<2)) feld[x][y]=1; if((feld[x][y]==1)&&((nachbar==2)||(nachbar==3))) feld[x][y]==1; if((feld[x][y]==1)&&(nachbar<3)) feld[x][y]==0; } } printf("\n\nNach Berechnung:%d\n", feld[4][4]); } //Wird zu beginn einmal ausgeführt, um alle werte im array zuerst auf null zu setzen und dann mit 0 oder 1 zu besetzen. void start(int breite, int hoehe) { int feld[breite][hoehe]; printf("\n\nVor Nullsetzung: %d\n", feld[4][4]); //Werte werden auf 0 gesetzt for (int y=0; y<hoehe; y++) { for(int x=0; x<breite; x++) { feld[x][y]=0; } } printf("\n\nNach Nullsetzung: %d\n", feld[4][4]); //Werte werden zufällig auf 0 oder 1 gesetzt for(int x=0; x<breite; x++) { for(int y=0; y<hoehe; y++) { feld[x][y]=rand()%2; } } printf("\n\nNach Zufall: %d\n", feld[4][4]); } //Die für das Array berechneten Werte werden ausgegeben (x für 1 und . für 0) void show(int breite, int hoehe) { int feld[breite][hoehe]; printf("\n\nVor Show:%d\n", feld[4][4]); for (int y=0; y<hoehe; y++) { for(int x=0; x<breite; x++) { if (feld[x][y]==1) { printf("x "); } else { printf(". "); } } printf("\n"); } printf("\n\nNach Show:%d\n", feld[4][4]); } //Die Eingabe wird überprüft. (min 3x3, max 20x20) int check(int breite, int hoehe) { if(hoehe<3||breite<3) { printf("\nFeld zu klein!"); return 1; } if(hoehe>20||breite>20) { printf("\nFeld zu groß"); return 1; } return 0; } Die printfs in den Funktionen dienen mir nur zur Kontrolle der werte zu verschiedenen Zeitpunkten. So läuft das Programm zwar, allerdings nicht sinnvoll, da jede Funktion das Array "feld" neu deklariert und die verschiedenen Funktionen daher nicht, wie gewünscht, am selben Array arbeiten. Ich hoffe es blickt wer durch Danke im Vorraus!! Bernhard Zitieren
Bubble Geschrieben 9. November 2009 Geschrieben 9. November 2009 Hi! Das Grundgerüst ist soweit schon mal fertig, allerdings stehe ich jetzt vor dem Problem, dass ich es nicht schaffe das zweidimensionale array an die verschiedenen Funktionen zu übergeben. Kein Wunder, denn das geht so einfach auch nicht. Im Prinzip können nur Pointer auf Speicherbereiche übergeben werden. Zitieren
Insane355 Geschrieben 9. November 2009 Autor Geschrieben 9. November 2009 Ja ich hab auch schon einiges mit zeigern ausprobiert, hat aber nicht funktioniert. Die verweist man mit einem zeiger auf ein mehrdimensionales array und übergibt diesen zeiger dann auf die funktion? Zitieren
Bubble Geschrieben 9. November 2009 Geschrieben 9. November 2009 Die verweist man mit einem zeiger auf ein mehrdimensionales array und übergibt diesen zeiger dann auf die funktion? Man verweist mit dem Zeiger auf den Beginn des Speicherblockes. Eventuell bei der Interpretation dieses Speicherbereiches zu berücksichtigende Dimensionsangaben müssen gesondert übergeben werden. Wenn man mag, kann man das natürlich in einer geeigneten Datenstruktur oder in in einer C++-Klasse kapseln. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.