Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Conway Game of Life

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
02.12.2011, 13:39 Uhr
~Christian R
Gast


Hallo,
bin gerade dabei Conways Game of Life zu programmieren.
Mein Problem:
Fehlerhafte Ausgabe von Zellen die Tot sind und eigendlich zum Leben kommen müssten.
(Regel: Tote Zelle mit genau 3 nachbarn kommt zum Leben)

hier mein code:


C++:
#include <iostream>
#include <windows.h>
#include <conio.h>

using namespace std;

    const unsigned int hohe = 20;
    const unsigned int breite = 50;

void SetArrayNull(bool ar[hohe][breite])
{
     for(int c = 0; c < hohe; c++)
     {
             for(int n = 0; n < breite; n++)
             {
                     ar[c][n] = 0;
                     }
             }
            
}
void print(bool ar[hohe][breite])
{
     char zelle = 1; //Aussehen der Zellen
     unsigned int pop = 0; //Population
    
     for(int c = 0; c < hohe; c++)
    {
            for(int n = 0; n < breite; n++)
            {
                    if(ar[c][n] == 1) {cout <<zelle; pop++;}
                    else
                    if(ar[c][n] == 0) cout <<" ";
                    }
                    cout <<endl;
            }
            
            
            cout <<endl <<"Population: " <<pop;
}

void calc(bool ar[hohe][breite])
{
    int nachbarn = 0;  //Nachbarn die Jede Zelle hat
    for(int c = 0; c < hohe; c++)
    {
            for(int n = 0; n < breite; n++)
            {
                      
                   //Nachbarn zählen:
                   if(c != 0)
                   {
                        if(n > 0)
                             if(ar[c-1][n-1] == 1)nachbarn++;
                        
                        if(n < (breite-1) )
                             if(ar[c-1][n+1] == 1)nachbarn++;
                        
                        if(ar[c-1][n] == 1)nachbarn++;
                   }
                  
                   if(n > 0)
                        if(ar[c][n-1] == 1)nachbarn++;
                   if(n < (breite-1) )
                        if(ar[c][n+1] == 1)nachbarn++;
                  
                   if(c < (hohe-1) )
                   {
                        if(n > 0)
                             if(ar[c+1][n-1] == 1)nachbarn++;
                        if(ar[c+1][n] == 1)nachbarn++;
                        if(n < (breite-1) )
                             if(ar[c+1][n+1] == 1)nachbarn++;
                   }
                  
                   //Regeln anwenden:
                   if(ar[c][n] == 1 && nachbarn < 2) ar[c][n] = 0;
                   else
                   if(ar[c][n] == 0 && nachbarn == 3 ) ar[c][n] = 1;
                   else
                   if(ar[c][n] == 1 && (nachbarn == 2 || nachbarn == 3) ) ar[c][n] = 1;
                   else
                   if(ar[c][n] == 1 && nachbarn > 3 ) ar[c][n] = 0;
                  
                  
                   nachbarn = 0;
                    }
            }
}


int main()
{
    

    bool Generation[hohe][breite]; //Matrix deklarieren
    SetArrayNull(Generation);      //Matrix initialisieren (Null setzen)
    
    //Ein Paar lebende Zellen setzen lassen:
    //Wahl
    cout <<"Wollen sie die Zellen selber setzen oder" <<endl;
    cout <<"Zufällig berechnen lassen?" <<endl;
    cout <<"Z für Zufall oder p für Selbst bestimmen drücken!" <<endl <<endl;
    
    bool run = true;
    while(run)
    {
              
    char eingabe = getch();
    if(eingabe == 'z')
               {
               int anzahl = 0;
               cout <<"Wieviele Zellen sollen gesetzt werden?: "; cin >> anzahl;
               cout <<endl <<"Danke fuer ihre Telnahme.";
               Sleep(1000);
    
               srand( (unsigned) time (NULL) );
    
               for(int c = 0; c < anzahl; c++)
               {
                       Generation[rand()%hohe][rand()%breite] = 1;
                                                               }
               run = false;
              
              
              
    }
    else if(eingabe == 'p')
    {
         cout <<"Modus wird noch bearbeitet!.." <<endl;
         //Dieser Testdurchlauf tut nicht was er soll:
         Generation[2][2] = 1;
         Generation[2][4] = 1;
         Generation[3][3] = 1;
         Generation[3][4] = 1;
         Generation[4][3] = 1;
         run = false;
     }
    
    }
    
    //Dauernt ausgeben und neu berechnen:
    for(int j = 1; true; j++)
    {
    cout <<j <<". Generation." <<endl;
    print(Generation);
    
    Sleep(50);
    system("cls");
    calc(Generation);
    }
}


Dieser Post wurde am 02.12.2011 um 18:34 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
02.12.2011, 15:42 Uhr
~Christian R
Gast


was ich vergessen habe zu sagen:
den fehler habe ich gemerkt als ich den testdurchlauf gemacht habe, die figur

Generation[2][2] = 1;
Generation[2][4] = 1;
Generation[3][3] = 1;
Generation[3][4] = 1;
Generation[4][3] = 1;

ist ein gleiter. (nach rechts unten gleiten)
aber funktioniert leider nicht, ich find den fehler einfach nicht.

mit dem zufallszahlendurchlauf sieht es halt so aus als wäre alles richtig.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
02.12.2011, 17:10 Uhr
TOSHMAX



Ich kenne mich nicht aus mit diesem Spiel, aber ich denke dein Fehler ist, dass du sie der Reihe nach durchgehst und somit alle Nachfolgenden beeinflusst. Es geht aber darum alle zum selben Zeitpunkt zu beleben/töten.

Ein Ansatz wäre die vorhandene Generation zu kopieren und die Neue in anderes Array zu speichern. Die Nachbarn überprüfst du mit der alten Generation und belebst sie in der Neuen.
Bei meinem Test hat sich der Gleiter dann zumindest bewegt.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
02.12.2011, 17:22 Uhr
~Christian R
Gast


Ich danke dir für deine Antwort!
Ich denke du könntest damit recht haben,
habe heute leider keine Zeit mehr das umzuändern und zu testen.
Werd ich mich die Tage nochmal ransetzen
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
04.12.2011, 20:06 Uhr
~Christian R
Gast


So habs geändert. Genau daran lag es ist eig vollkommen logisch ^^

Gruß C.R.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: