[C++]Conways Spiel des Lebens

AcidR4in

Ensign
Registriert
Juli 2005
Beiträge
175
hi leute ich bin dabei ganz einfach ein spiel des lebens zuprogramieren falls jemand nicht weiß was das ist link

nur habe ich irgendwo ein bug/denkfehler ich weiß es nicht, ich hoffe ihr könnt mir helfen

Code:
//////////////////////////////////////////////////////////////////////////
//////////////////////////conways game of life////////////////////////////
//////////////////////////////////////////////////////////////////////////

#include <iostream>
using namespace std;

//////////////////////////////////////////////////////////////////////////
//////////////////////umgebungs counter///////////////////////////////////
//////////////////////////////////////////////////////////////////////////

int life[20][20]={};

int zaehler(int x,int y){
    int zaehl = 0;
    
    if (life [x-1][y-1] ==1) {
             zaehl=zaehl+1;
             }
    if (life [x-1][y] ==1) {
             zaehl=zaehl+1;
             }
    if (life [x-1][y+1] ==1) {
             zaehl=zaehl+1;
             }
    if (life [x][y-1] ==1) {
             zaehl=zaehl+1;
             }
    if (life [x][y+1] ==1) {
             zaehl=zaehl+1;
             }
    if (life [x+1][y-1] ==1) {
             zaehl=zaehl+1;
             }
    if (life [x+1][y] ==1) {
             zaehl=zaehl+1;
             }
    if (life [x+1][y+1] ==1) {
             zaehl=zaehl+1;
             }
    return(zaehl);
}


//////////////////////////////////////////////////////////////////////////
//////////////////////generations berechner///////////////////////////////
//////////////////////////////////////////////////////////////////////////


int gen(int n) {
    int x=0,y=0,zaehlgen=0;
    if (n>0) {
       do {
           if(life[x][y]==0){                                               // freies feld
             // zaehlgen=zaehler(x,y);
                if (zaehler(x,y)==3){
                life[x][y]=1;
                }
                else;
              }
           else {                                                             // organismus
            //  zaehlgen=zaehler(x,y);
                if ((zaehler(x,y)!= 3) && (zaehler(x,y)!= 2)){                         
                life[x][y]=0;
                }
                else;
              }     
       x=x+1;
          if (x==20){
             x=0;
             y=y+1; 
          }
       } while(x<=20 && y<=20);
       do{                                                                         // ausgabe
         if (life[x][y]== 1) {
              cout << "X|";
              }
         else {
              cout << " |";
              }
      x=x+1;
         if (x==20){
            cout << "\n";
            x=0;
            y=y+1; 
            }
    } while(x<=20 && y<=20);
       return (gen(n-1));
    }                                                                            // ende der obersten if-anweisugn
    else
       do {
           if(life[x][y]==0){                                               // freies feld
              zaehlgen=zaehler(x,y);
                if (zaehlgen==3){
                life[x][y]=1;
                }
              }
           else {                                                             // organismus
              zaehlgen=zaehler(x,y);
                if ((zaehlgen!= 3) && (zaehlgen!= 2)){                         
                life[x][y]=0;
                }
              }     
       x=x+1;
          if (x==20){
             x=0;
             y=y+1; 
          }
       } while(x<=20 && y<=20);
       do{                                                                         // ausgabe
         if (life[x][y]== 1) {
              cout << "X|";
              }
         else {
              cout << " |";
              }
      x=x+1;
         if (x==20){
            cout << "\n";
            x=0;
            y=y+1; 
            }
    } while(x<=20 && y<=20);
}

//////////////////////////////////////////////////////////////////////////
//////////////////////////main////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////



int main () {
    
int n,x=0,y=0;
  while(1) {    
    while ((x>=0 && x<=20)&& (y>=0 && y<=20)) {                                 // beschriften 
          cout << "Bitte geben Sie die lebenden organismen an (x,y): ";
          cin >> x >> y;
          life[x][y] = 1;
          }
    x=0;
    y=0;
    do{                                                                         // ausgabe
       if (life[x][y]== 1) {
            cout << "X|";
            }
       else {
            cout << " |";
            }
    x=x+1;
       if (x==20){
          cout << "\n";
          x=0;
          y=y+1; 
          }
    } while(x<=20 && y<=20);
    x=y=0;    
    cout << "Fuer wieviele Generationen soll das Game of life berechnert werden? ";
    cin >> n;
    cout << gen(n);
    //cout << zaehler(0,0);
    system("pause");
    do{                                                                         // array leeren
       life[x][y] = 0;
    x=x+1;
       if (x==20){
          x=0;
          y=y+1; 
          }
    } while(x<=20 && y<=20);
    x=0;
    y=0;
} 
}

also ich bin mir fast sicher dass der fehler in der funktion gen liegt aber ich weiß nicht genau wo vielleicht könnt ihr mir helfen

ps wenn mann aus dem organismen eintippen rauswill was über 20 eigeben (wird aber noch geändert)
 
es wäre viel einfacher dir zu helfen wenn du dein problem kurz schildern würdest ;).

ansonsten solltest du dir fürs nächstemal mal klassen ansehen. mit c++ hat das relativ wenig zutun, und globale variablen sind aufjedenfall böseTM ;).
 
Hallo,

das erste Problem hast Du bereits in der Eingabe:

Code:
    while ((x>=0 && x<=20)&& (y>=0 && y<=20)) {                                 // beschriften 
          cout << "Bitte geben Sie die lebenden organismen an (x,y): ";
          cin >> x >> y;
          life[x][y] = 1;
          }

Ich habe es jedenfalls geschafft das daraus eine Endlosschleife wurde. Die Eingabe ist in keinster Weise fehlertolerant. Vielleicht hat das Komma dabei eine Rolle gespielt.

Danach passiert eigentlich gar nichts. D.h. Du siehst das richtig das in der Funktion gen irgendetwas nicht stimmt. Sie macht nämlich nichts.

Noch ein paar Anmerkungen:

- die Funktion zaehlgen, verletzt gerne mal die Arraygrenzen, z.B. bei zaehlgen(0,0)
- Das Array life wird nicht initialisiert, zumindest nicht von Dir. Eine explizite Initialisierung auf 0 wäre besser.
- Die Funktion gen gibt nicht immer einen Wert zurück!

Das hier bringt zumindest mal die Ausgabe ans laufen:

Code:
int gen(int n) {
    int x=0,y=0,zaehlgen=0;
    if (n>0) {
       do {
           if(life[x][y]==0){                                               // freies feld
             // zaehlgen=zaehler(x,y);
                if (zaehler(x,y)==3){
                life[x][y]=1;
                }
                else;
              }
           else {                                                             // organismus
            //  zaehlgen=zaehler(x,y);
                if ((zaehler(x,y)!= 3) && (zaehler(x,y)!= 2)){                         
                life[x][y]=0;
                }
                else;
              }     
       x=x+1;
          if (x==20){
             x=0;
             y=y+1; 
          }
       } while(x<=20 && y<=20);
       x = 0;
       y = 0;

Ob die Ausgabe aber korrekt ist, das musst Du selber beurteilen. In Life wollte ich mich jetzt nicht einlesen.

Ansonsten hilft eine stärkere Gliederung der Funktionialitäten in Funktionen stark die Übersicht zu behalten.
Das waren ziemlich viele whiles und ifs in einer Funktion, von der unübersichtlichen Formatierung mal ganz abgesehen.

MfG

Arnd
 
Zuletzt bearbeitet:
naja ich habs gelöst waren doch einige denkfehler drinnen

aber danke für eure hilfe
 
Ich hab das programm jetzt fertig wer sichs anschaun will ich hängs mal an

exe und cpp datei

nochmal vielen dank
 

Anhänge

Hallo AcidR4in,

ich habe mal eine Blick hinein geworfen. Falls Dich meine Kommentare interessieren:

- Du hast Dir in der Funktion zaehler unheimlich viel Mühe gegeben bestimmte Konstellationen abzufangen, aber ein Wert von z.B. -40,-33 führt immer noch zu einer Arrayverletzung.
Es wäre effizienter eine mehr allgemeine Abfrage bzw. Berechnungsroutine zu finden und nicht 9 mal der selbe Code in leichten Variationen.
Vor allem 9 returns in einer Funktion, das ist imho kein guter Programmierstil.

- gen liefert immer noch nicht in allen Fällen einen Returnwert zurück.

- Die Quellcode Formatierung sollte überarbeitet werden, es liest sich dann leichter im Code.

- Mehr Funktionen einbauen damit nicht immer doppelter Code ausgeführt werden muss.

- Was ich als positiv empfunden habe, das Programm ist bedienbar geworden, und es kommt nachvollziehbarer Output.

Aber gib mal ein Komma (z.B. 10, 20) am Anfang ein. Dann wird es interessant :-).

Was noch fehlt ist eine Möglichkeit das Programm zu beenden, z.B. mit Esc oder eine Abfrage.

MfG

Arnd
 
Zurück
Oben