Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » 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
28.04.2004, 15:24 Uhr
~1Stein
Gast


Hab folgendes Problem: Ich müss für die Schule ein Programm schreiben (in C++, Konsolenanwendung), dass die Lebenszyklen nach dem Game of Life Prinzib berechnet und ausgibt.
Genaueres zum Game of Life: www.math.com/students/wonders/life/life.html

Hab mal ein proggi geschrieben, funtzt aber net so wie es soll...

Hier der Code:

C++:
#include <iostream>
#include <conio>
#include <windows>
using namespace std;

const int Q=12;

int nb(int, int, int);
bool arr[Q][Q][2];

void main()
{   // W(rite)=new, R(ead)=old
    int R=0,W=1,zuf,i,j,anz;

//1. Feld anfüllen W=[1]
    //randomize();
    for(i=1;i<=(Q-1);i++)
    {   for(j=1;j<=(Q-1);j++)
        {   zuf=rand()%2;
        if(zuf==1) arr[i][j][W]=true;
        else       arr[i][j][W]=false;
        }
    }

//Rand in beiden Feldern mit false füllen
    for(i=0;i<2;i++)
    {   for(j=0;j<12;j++)
        {   arr[0][j][i]=false;
            arr[j][0][i]=false;
            arr[11][j][i]=false;
            arr[j][11][i]=false;
        }
    }
    
//eigentliches Programm
    do
    {   clrscr();

      //Feld-switch => W(rite)=new, R(ead)=old
        if(R==1)
        {   W=1;
            R=0;
        }
        else
        {   W=0;
            R=1;
        }

      //Ausgabe
        for(i=1;i<(Q-1);i++)
        {   for(j=1;j<(Q-1);j++)
            {   if(arr[i][j][R]) cout<<"O";
                else             cout<<" ";
            }
            cout<<endl;
        }

      //Neue Generation berechnen
        for(i=1;i<(Q-1);i++)
        {   for(j=1;j<(Q-1);j++)
            {   anz=nb(i,j,R);
                if(anz<2)
                   arr[i][j][W]=false;
                if(anz==3)
                   arr[i][j][W]=true;
                if(anz>3)
                   arr[i][j][W]=false;
            }
        }

      //Kurze Unterbrechung
        //Sleep(300);
        getch();
    }while(!kbhit());
}

int nb(int x, int y, int r)
{   int anz=0;
    for(int i=(x-1);i<=(x+1);i++)
    {   for(int j=(y-1);j<=(y+1);j++)
        {   if(arr[i][j][r])
             if(!(i==x && j==y))
              anz++;
        }
    }
    return anz;
}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
28.04.2004, 22:56 Uhr
KaraHead



Wo liegt denn jetzt genau das Problem?
Oder was gibt es denn für Fehlermeldungen?

Ohne richtig nachzudenken seh ich nur "void main" muss aber

C++:
int main()
{
...
return 0;
}


heißen. Nicht jeder Compiler nimmt void main an.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
28.04.2004, 23:02 Uhr
KaraHead



So sollte es gehen:

C++:
#include <iostream>
#include <conio.h> //das .h muss dran
#include <windows.h> //das .h muss dran
using namespace std;

const int Q=12;

int nb(int, int, int);
bool arr[Q][Q][2];

int main()  //int main muss sein, wegen des Standards
{
    int R=0,W=1,zuf,i,j,anz;

    for(i=1;i<=(Q-1);i++)
    {  for(j=1;j<=(Q-1);j++)
        {  zuf=rand()%2;
        if(zuf==1) arr[ i ][j][W]=true;
        else      arr[ i ][j][W]=false;
        }
    }

    for(i=0;i<2;i++)
    {  for(j=0;j<12;j++)
        {  arr[0][j][ i ]=false;
            arr[j][0][ i ]=false;
            arr[11][j][ i ]=false;
            arr[j][11][ i ]=false;
        }
    }
    
    do
    {  system("cls"); //ist zwar nicht portabel aber es geht dir ja eh nur um Windows

        if(R==1)
        {  W=1;
            R=0;
        }
        else
        {  W=0;
            R=1;
        }

        for(i=1;i<(Q-1);i++)
        {  for(j=1;j<(Q-1);j++)
            {  if(arr[ i ][j][R]) cout<<"O";
                else            cout<<" ";
            }
            cout<<endl;
        }

        for(i=1;i<(Q-1);i++)
        {  for(j=1;j<(Q-1);j++)
            {  anz=nb(i,j,R);
                if(anz<2)
                  arr[ i ][j][W]=false;
                if(anz==3)
                  arr[ i ][j][W]=true;
                if(anz>3)
                  arr[ i ][j][W]=false;
            }
        }

        getch();
    }while(!kbhit());
}

int nb(int x, int y, int r)
{  int anz=0;
    for(int i=(x-1);i<=(x+1);i++)
    {  for(int j=(y-1);j<=(y+1);j++)
        {  if(arr[ i ][j][r])
            if(!(i==x && j==y))
              anz++;
        }
    }
    return anz;
}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
29.04.2004, 06:57 Uhr
1Stein



wenn man das prgramm so wies oben steht, laufen lasst (ohne entkommantiertem randomize(), dann bekommt man irgentwann folgende stellung (is irgentwo rechts am Rand)

Code:
*
*
*


das müsste laut den regeln zu

Code:

***



werden. Bei mir wirds zu

Code:
  *
* *



keine Ahnung warum.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
29.04.2004, 08:30 Uhr
(un)wissender
Niveauwart


Ich klatsch dir das jetzt mal hin, haben ich vor ca. 2(?) Jahren gemacht, dass funktioniert auch...vieleicht hilft dir das was.



C++:
class Field {
    private:
        struct cell {
            int livingNextEpisode;
            int life;
        };
        unsigned int episodeCounter;
        const static unsigned int rows = 14;
        const static unsigned int cols = 8;
        cell field[cols][rows];
    
    public:
        Field();      
        void reset();
        void computeNextEpisode();
        inline bool isCellLiving(int cols_, int row_);
        inline void aktivateCell(int cols_, int row_);
        inline void aktivateCell(int cell);
        friend ostream& operator<<(ostream& stream, Field& out);
        unsigned int getCounter() {
            return episodeCounter;
        }
};

Field :: Field() : episodeCounter(0) {
    reset();
}

void Field :: reset() {
    for(unsigned int i = 0; i < cols; i++)
        for(unsigned int j = 0; j < rows; j++) {
            field[i][j].life = 0;
            field[i][j].livingNextEpisode = 0;
        }
    episodeCounter = 0;
}

void Field :: computeNextEpisode() {      
    for(unsigned int i = 0; i < cols; i++)
        for(unsigned int j = 0; j < rows; j++) {
            int neighbours = 0;                            
            
            if(i > 0) {
                if(j > 0) {
                    neighbours += field[i - 1][j - 1].life;                
                }
                
                neighbours += field[i - 1][j].life;              
              
                if(j < rows - 1) {
                    neighbours += field[i - 1][j + 1].life;              
                }                              
            }
            
            if(j < rows - 1) {
               neighbours += field[i][j + 1].life;                
           }            
            
            if(j > 0) {
                neighbours += field[i][j - 1].life;              
            }
                                      
            if(i < cols - 1) {
                if(j > 0) {
                    neighbours += field[i + 1][j - 1].life;                
                }              
                
                neighbours += field[i + 1][j].life;
                                                  
                if(j < rows - 1) {
                    neighbours += field[i + 1][j + 1].life;                  
                }                              
            }
                  
            if(neighbours != 2)
                field[i][j].livingNextEpisode = neighbours == 3 ? 1 : 0;                          
        }
    
    for(unsigned int i = 0; i < cols; i++)
        for(unsigned int j = 0; j < rows; j++)
            field[i][j].life = field[i][j].livingNextEpisode;
            
   episodeCounter++;
}

inline bool Field :: isCellLiving(int cols_, int row_) {
    return field[cols_][row_].life;
}

inline void Field :: aktivateCell(int cell) {
    div_t division = div(cell, 14);    
    aktivateCell(division.quot, division.rem);    
}
inline void Field :: aktivateCell(int cols_, int row_) {
    field[cols_][row_].life = 1;
    field[cols_][row_].livingNextEpisode = 1;
}

ostream& operator<<(ostream& stream, Field& out) {
    stream << '\n' << " Episode: " << out.episodeCounter << '\n';    
    for(unsigned int i = 0; i < out.cols; i++) {
        for(unsigned int j = 0; j < out.rows; j++) {
            stream << ' ' << out.field[i][j].life;
        }
        stream << '\n';
    }        
    stream << '\n';
    return stream;  
}


--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
29.04.2004, 09:57 Uhr
virtual
Sexiest Bit alive
(Operator)


Guck mal hier, da gibnt es ein paar Lösungen:
www.fun-soft.de/showtopic.php?threadid=618
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
29.04.2004, 14:51 Uhr
1Stein



danke, hat mir auf jedenfall um einiges weitergeholfen.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (WinAPI, Konsole) ]  


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: