Zum Inhalt springen

Game of Life Problem (Übergabe von Arrays an Funktionen)


Empfohlene Beiträge

Geschrieben

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

Geschrieben
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.

Geschrieben

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?

Geschrieben
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.

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...