Vidirat
Gast
Moin!
Kennt jemand zufällig von euch John Conway's Game of Life? Wenn nicht: Wikipedia / Zum Ausprobieren (online)
...und genau das wollte ich mit C++/SDL basteln. Ich bin leider noch relativ unerfahren mit C++ und hoffe jetzt, dass mir hier einer helfen kann. Das Programm ist bisher noch nicht sehr ausgereift (kein Menü für Größe/Geschwindigkeit etc.) und als Ausgangsformation liegt nur ein Glider vor, der sich bewegen soll, wie er es normalerweise tut.
Normalerweise sollte sich der Glider diagonal nach unten-rechts bewegen. Tut er aber nicht . Die Farben invertieren sich nur; also aus schwarz wird weiß und umgekehrt. Am besten ihr probierts aus. Hier ist der Code:
main.cpp
events.h
Das Auskommentierte in events.h (void events::Next()) war eine andere Methode zum Zählen der Nachbarn. Beide funktionieren nicht
Hilfe wäre sehr hilfreich
Danke im Vorraus,
Ratte
P.S.
point.bmp = 1x1px weiß
background.bmp = 640x480px schwarz
Kennt jemand zufällig von euch John Conway's Game of Life? Wenn nicht: Wikipedia / Zum Ausprobieren (online)
...und genau das wollte ich mit C++/SDL basteln. Ich bin leider noch relativ unerfahren mit C++ und hoffe jetzt, dass mir hier einer helfen kann. Das Programm ist bisher noch nicht sehr ausgereift (kein Menü für Größe/Geschwindigkeit etc.) und als Ausgangsformation liegt nur ein Glider vor, der sich bewegen soll, wie er es normalerweise tut.
Normalerweise sollte sich der Glider diagonal nach unten-rechts bewegen. Tut er aber nicht . Die Farben invertieren sich nur; also aus schwarz wird weiß und umgekehrt. Am besten ihr probierts aus. Hier ist der Code:
main.cpp
PHP:
#include <SDL.h>
#include <windows.h>
#include "events.h"
int main(int argc, char* args[])
{
events events;
while (events.RunningState())
{
events.Menu();
events.Next();
events.Draw();
events.Aktualize();
Sleep(200);
}
events.Quit();
return 0;
}
events.h
PHP:
class events
{
private:
SDL_Surface *screen;
SDL_Surface *background;
bool matrix[640][480];
bool Running;
public:
events();
void Delete();
void CleanScreen();
void Draw();
void Initialize(int seed);
void Change(int x, int y, bool alive);
void Next();
void Quit();
void Menu();
void Aktualize();
bool RunningState();
};
events::events()
{
//Start SDL
SDL_Init(SDL_INIT_VIDEO);
//Fenster generieren
screen = SDL_SetVideoMode(640, 480, 8, SDL_SWSURFACE);
//Titel & Icon
SDL_WM_SetCaption("Game of Life", NULL); //Kein Icon
Running = true;
Delete();
matrix[301][298] = true;
matrix[302][299] = true;
matrix[300][300] = true;
matrix[301][300] = true;
matrix[302][300] = true;
}
void events::Delete()
{
for (int x = 0; x < 640; x++)
{
for (int y = 0; y < 480; y++)
{
matrix[x][y] = false;
}
}
}
void events::CleanScreen()
{
SDL_Surface *bg;
bg = SDL_LoadBMP("background.bmp");
SDL_Rect rect;
rect.x = 0;
rect.y = 0;
SDL_BlitSurface(bg, NULL, screen, &rect);
}
void events::Draw()
{
CleanScreen();
SDL_Surface *point;
point = SDL_LoadBMP("point.bmp");
SDL_Rect rect;
for (int x = 0; x < 640; x++)
{
for (int y = 0; y < 480; y++)
{
if (matrix[x][y])
{
rect.x = x;
rect.y = y;
SDL_BlitSurface(point, NULL, screen, &rect);
}
}
}
}
void events::Initialize(int seed)
{
}
void events::Change(int x, int y, bool alive)
{
matrix[x][y] = alive;
}
void events::Next()
{
bool newmatrix[640][480];
int population;
for (int x = 0; x < 640; x++)
{
for (int y = 0; y < 480; y++)
{
population = 0;
//Zählen der Nachbarn
if (matrix[x-1][y-1]) population++;
else if (matrix[x-1][ y ]) population++;
else if (matrix[x-1][y+1]) population++;
else if (matrix[ x ][y-1]) population++;
else if (matrix[ x ][y+1]) population++;
else if (matrix[x+1][y-1]) population++;
else if (matrix[x+1][ y ]) population++;
else if (matrix[x+1][y+1]) population++;
/*for (int row = 0; row < 3; row++) //Die Reihe | y // +0---------------
{ // 0 Z = Zelle die geprüft werden soll
for (int column = 0; column < 3; column++) //Die Spalte | x // | x, y = 0 to 2
{ // |
if (matrix[x-column-1][y+row-1]) // | y-1 \ | / =-1 da y=0
{ // | y --Z-- = 0 da y=1
population++; // | y+1 / | \ =+1 da y=2
} // | x x x
} // | - + bei x das Gleiche
}*/ // | 1 1
if (matrix[x][y])
{
if (population < 2)
{
//Unterpopulation -> rip
newmatrix[x][y] = false;
}
else if (population == 2)
{
//Nichts
newmatrix[x][y] = true;
}
else if (population > 3)
{
//Überpopulation -> rip
newmatrix[x][y] = false;
}
}
else
{
if (population == 3)
{
//Geburt -> *
newmatrix[x][y] = true;
}
}
}
}
//Die temporäre Matrix umschreiben
for (int ux = 0; ux < 640; ux++)
{
for (int uy = 0; uy < 480; uy++)
{
matrix[ux][uy] = newmatrix[ux][uy];
}
}
}
void events::Quit()
{
SDL_Quit();
}
void events::Menu()
{
SDL_Event event;
if (SDL_PollEvent(&event))
{
//Schliessen
if (event.type == SDL_QUIT) { Running = false; }
}
}
void events::Aktualize()
{
SDL_Flip(screen);
}
bool events::RunningState()
{
return Running;
}
Das Auskommentierte in events.h (void events::Next()) war eine andere Methode zum Zählen der Nachbarn. Beide funktionieren nicht
Hilfe wäre sehr hilfreich
Danke im Vorraus,
Ratte
P.S.
point.bmp = 1x1px weiß
background.bmp = 640x480px schwarz
Zuletzt bearbeitet: