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