• Hallo Besucher!

    Du bist neu im Forum? Dann registriere dich hier, um Diskussionen beizutreten oder eigene Themen zu erstellen. Für die Registrierung ist es erforderlich, dass du einen Spielaccount bei Die Stämme hast.

    Andernfalls kannst du dich hier direkt einloggen.

    Falls du dein Passwort vergessen hast, kannst du hier ein neues Passwort anfordern.

Game of Life - C++/SDL

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
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:

DeletedUser

Gast
Du hast in Next() für den Fall, dass matrix[x][y] true ist, vergessen zu schreiben, was passiert wenn population==3 ist. Dann ist da danach nämlich auch ne lebende Zelle. Wäre zumindest ein Fehler, den ich auf die Schnelle gesehen hab.
 

DeletedUser

Gast
Oh. Beim Populationszählen hast du else if genommen, if wär eigentlich richtig. ;)

Btw,
Code:
            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;
                }
            }
lässt sich stark kürzen.
Code:
            if(population == 3) newmatrix[x][y] = true;
            else if(population == 2) newmatrix[x][y] = matrix[x][y];
            else newmatrix[x][y] = false; /* population < 2 || population > 3 */
oder
Code:
            newmatrix[x][y] = population == 3 || (population == 2 && matrix[x][y]);
 
Zuletzt bearbeitet von einem Moderator:

Vidirat

Gast
Fühle dich bedankt ;-) Jetzt funktionierts.

-

Jetzt habe ich aber leider doch noch ein Problem: Am linkem und rechtem Rand des Fensters sind aus welchem Grund auch immer weiße Pixel, die sich natürlich auch ausbreiten. Das sieht zwar schön aus, nervt aber, wenn man was ausprobieren möchte.
Ich hatte erst gedacht, dass das am deklarieren des Arrays
Code:
int newmatrix[640][480];
liegt, daher habe ich das so ergänzt:
Code:
int newmatrix[640][480] = {false};
Das hat aber nur bedingt was gebracht. Jetzt sieht das ganze so aus:
Ein paar Pixel sind weg, aber eben auch nur ein paar. Es wäre nett, wenn man mir noch mal helfen könnte :mrgreen:

Tschüss,
Ratte

e: Doppelpost fusioniert
 
Zuletzt bearbeitet:

DeletedUser

Gast
Beim Abfragen der Nachbarzellen liest du über die Arraygrenzen hinaus. matrix[0-1][0-1] ist halt nicht mehr im array drin und matrix[639+1][479+1] auch nicht. Da müsstest du vor dem Lesen noch überprüfen, welche Felder du überhaupt auslesen darfst/musst.
 

Vidirat

Gast
Am Anfang hatte ich das auch gedacht, aber ist es nicht so, dass überschrittene Arraygrenzen einfach nur false zurückliefern? Ich werde es trotzdem nochmal probieren ;)

Danke,
Ratte
 

DeletedUser86497

Gast
Am Anfang hatte ich das auch gedacht, aber ist es nicht so, dass überschrittene Arraygrenzen einfach nur false zurückliefern? Ich werde es trotzdem nochmal probieren ;)

Danke,
Ratte
Nein, du greifst damit einfach auf Speicher zu, der dir nicht gehört. Das kann sich entweder gar nicht bemerkbar machen, oder im besten Fall durch einen Absturz.
 

Vidirat

Gast
Perfekt! Du darfst dich erneut von mir bedankt sehen :mrgreen: Dafür printe ich deinen Namen ganz groß in die Credits ;)

Das der Fehler da liegt, hätte ich nicht gedacht - viel mehr, dass es an irgentwelchen Speicherresten liegt, aber nun weiß ich's ja ;)

Falls jmd. Lust hat, könnte er diesen Wulst hier noch ein bisschen schöner machen:

PHP:
//Zählen der Nachbarn
if (x != 0	&& y != 0										   && matrix[x-1][y-1]) population++;
if (x != 0														&& matrix[x-1][ y ]) population++;
if (x != 0								   && y + 1 != MATRIX_H && matrix[x-1][y+1]) population++;
if (		     y != 0										   && matrix[ x ][y-1]) population++;
if (										    y + 1 != MATRIX_H && matrix[ x ][y+1]) population++;
if (		     y != 0 && x + 1 != MATRIX_W					  && matrix[x+1][y-1]) population++;
if (				       x + 1 != MATRIX_W					  && matrix[x+1][ y ]) population++;
if (					   x + 1 != MATRIX_W && y + 1 != MATRIX_H && matrix[x+1][y+1]) population++;

Muss aber nicht sein. Was If Sachen angeht, bin ich gerne umständlich :mrgreen:

Tschüss,
ratte

@PI: Dich habe ich ganz übersehen ;) Durch dich habe ich wieder was gelernt, auch du darft dich von mir bedankt fühlen ;-)
 
Zuletzt bearbeitet:

DeletedUser

Gast
Code:
#include <algorithm>

//...

for(int i = std::max(x - 1, 0), i_bound = std::min(x + 1, MATRIX_W - 1); i < i_bound; ++i)
{
    for(int j = std::max(y - 1, 0), j_bound = std::min(y + 1, MATRIX_H - 1); j < j_bound; ++j)
    {
        if(i != x || j != y)
        {
            population += matrix[i][j];
        }
    }
}
Naja - so wirklich schöner ists nicht :D
 

Vidirat

Gast
Ok o_O Auf sowas wäre ich nie gekommen ;-) Aber deine Lösung benötigt 10 Zeilen + include meine nur 8 :mrgreen:
 

DeletedUser86497

Gast
Code:
#include <algorithm>

//...

for(int i = std::max(x - 1, 0), i_bound = std::min(x + 1, MATRIX_W - 1); i < i_bound; ++i)
    for(int j = std::max(y - 1, 0), j_bound = std::min(y + 1, MATRIX_H - 1); j < j_bound; ++j)
        if(i != x || j != y)
            population += matrix[i][j];

4 Zeilen :mrgreen:
 

Vidirat

Gast
Braucht man aber nicht mehr Speicherplatz, wenn man eine Datei inkludiert? :mrgreen:
 

DeletedUser

Gast
Wenns dir um Kürze geht, okay :>
Code:
for(int i = std::max(x - 1, 0); i < std::min(x + 1, MATRIX_W - 1); ++i)
    for(int j = std::max(y - 1, 0); j < std::min(y + 1, MATRIX_H - 1); ++j)
        population += (i != x || j != y) && matrix[i][j];

// Edit: ich merk grad, das - 1 ist ziemlich sicher nichtmal nötig. also
Code:
for(int i = std::max(x - 1, 0); i < std::min(x + 1, MATRIX_W); ++i)
    for(int j = std::max(y - 1, 0); j < std::min(y + 1, MATRIX_H); ++j)
        population += (i != x || j != y) && matrix[i][j];
;)
 
Zuletzt bearbeitet von einem Moderator:

Vidirat

Gast
Code:
events.h(123) : error C2589: '(': Ungültiges Token auf der rechten Seite von '::'
events.h(123) : error C2059: Syntaxfehler: '::'
events.h(123) : error C2589: '(': Ungültiges Token auf der rechten Seite von '::'
events.h(123) : error C2065: 'i_bound': nichtdeklarierter Bezeichner
events.h(123) : error C2143: Syntaxfehler: Es fehlt ';' vor ')'
events.h(123) : error C2143: Syntaxfehler: Es fehlt ';' vor ')'
events.h(124) : error C2589: '(': Ungültiges Token auf der rechten Seite von '::'
events.h(124) : error C2589: '(': Ungültiges Token auf der rechten Seite von '::'
events.h(124) : error C2065: 'j': nichtdeklarierter Bezeichner
events.h(124) : error C2065: 'j_bound': nichtdeklarierter Bezeichner
events.h(124) : error C2065: 'j': nichtdeklarierter Bezeichner
events.h(124) : error C2143: Syntaxfehler: Es fehlt ';' vor ')'
events.h(124) : error C2143: Syntaxfehler: Es fehlt ';' vor ')'
---

Ich hab die neue Version vergessen:

Code:
events.h(123) : error C2589: '(': Ungültiges Token auf der rechten Seite von '::'
events.h(123) : error C2059: Syntaxfehler: '::'
events.h(123) : error C2589: '(': Ungültiges Token auf der rechten Seite von '::'
events.h(123) : error C2059: Syntaxfehler: '::'
events.h(123) : error C2143: Syntaxfehler: Es fehlt ';' vor ')'
events.h(123) : error C2143: Syntaxfehler: Es fehlt ';' vor ')'
events.h(124) : error C2589: '(': Ungültiges Token auf der rechten Seite von '::'
events.h(124) : error C2065: 'j': nichtdeklarierter Bezeichner
events.h(124) : error C2589: '(': Ungültiges Token auf der rechten Seite von '::'
events.h(124) : error C2059: Syntaxfehler: '::'
events.h(124) : error C2065: 'j': nichtdeklarierter Bezeichner
events.h(124) : error C2143: Syntaxfehler: Es fehlt ';' vor ')'
events.h(124) : error C2143: Syntaxfehler: Es fehlt ';' vor ')'
---

e2: Wenn ich die std:: weglasse, gibt es keine Fehler, allerdings funktioniert das Zählen dann nicht mehr ;)

--- e3: Spoiler machen die Übersicht ;) ---

e4: Ich nehm einfach meine Version, das ist glaub ich einfacher ;) In der (über-)nächsten Woche stelle ich dann das Resultat vor ;)
 
Zuletzt bearbeitet:

DeletedUser

Gast
Ah, du inkludierst die windows.h. Die ist leider so blöd und nutzt makros die min und max umdefinieren. Schreib mal #define NOMINMAX vor #include <windows.h> (oder nimm die windows.h gleich raus - ich seh da grad keinen Grund warum die da drin sein muss)

// Edit: gut, kann sein, dass da n Logikfehler drin ist, ich teste den Kram nicht, bevor ich ihn poste. Wenn du ihn findest, sag Bescheid, ich seh grad keinen. :)
// Edit2: hab ihn:
Code:
for(int i = std::max(x - 1, 0); i < std::min(x + 2, MATRIX_W); ++i)
    for(int j = std::max(y - 1, 0); j < std::min(y + 2, MATRIX_H); ++j)
        population += (i != x || j != y) && matrix[i][j];
// Edit3: auch gut. Ich frag mich, was jemand anders denkt, wenn er das hier liest. Reinstes Edit-chaos.
 
Zuletzt bearbeitet von einem Moderator:

Vidirat

Gast
Ich brauche die windows.h leider später für Mausposition etc. außerdem für Timer [Sleep();]

Wenn ich jetzt [#define NOMINMAX] davor setze, geht der Timer leider auch nicht mehr, der Tickt dann keine Millisekunden mehr, sondern Sekunden :(

---

edit :mrgreen: Hab dein edit3 übersehen :D. Dann belassen wir es einfach bei meiner Version, das ist glaube ich für alle einfacher ;)
 

DeletedUser

Gast
Kenn mich jetzt nicht wirklich mit VB aus, und die Antwort kommt auch etwas spät, aber bei euch sieht das i-wie sehr umständlich aus.
Ich hab grad weniger als 30min in Delphi7 rumgeproggt und bin dann dazu gekommen:
(Das Spielfeld ist 100x100 Felder groß und der der Rand ist einfach tot)

Code:
unit game;

interface

[COLOR="Red"]uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls;

type
  TForm1 = class(TForm)
    Timer1: TTimer;
    Button1: TButton;
    Label1: TLabel;
    procedure Timer1Timer(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;[/COLOR]
  a:array[0..99,0..99] of boolean;
  z:byte;
  za:word;

implementation

{$R *.dfm}

procedure TForm1.Timer1Timer(Sender: TObject);
var x,y,xx,yy:byte;
begin
za := za +1;
label1.caption := inttostr(za);
for x := 0 to 99 do
begin
for y := 0 to 99 do
begin
if canvas.pixels[(x-1)*5,(y-1)*5] = clblack then z := z+1;
if canvas.pixels[x*5,(y-1)*5] = clblack then z := z+1;
if canvas.pixels[(x+1)*5,(y-1)*5] = clblack then z := z+1;
if canvas.pixels[(x-1)*5,y*5] = clblack then z := z+1;
if canvas.pixels[(x+1)*5,y*5] = clblack then z := z+1;
if canvas.pixels[(x-1)*5,(y+1)*5] = clblack then z := z+1;
if canvas.pixels[x*5,(y+1)*5] = clblack then z := z+1;
if canvas.pixels[(x+1)*5,(y+1)*5] = clblack then z := z+1;

if canvas.pixels[x*5,y*5] = clblack then
begin
if ( z <2) or (z>3) then
a[x,y] := false;
end;
if z = 3 then a[x,y] := true;
z := 0;
end;
end;
for xx := 0 to 99 do
begin
for yy := 0 to 99 do
begin
if a[xx,yy] = true then
begin
canvas.Brush.Color := clblack;
canvas.Pen.Color := clblack;
canvas.rectangle(xx*5,yy*5,xx*5+4,yy*5+4)
end
else
begin
canvas.Brush.Color := clwhite;
canvas.Pen.color := clwhite;
canvas.rectangle(xx*5,yy*5,xx*5+4,yy*5+4);
end;
end;
end;

end;

procedure TForm1.Button1Click(Sender: TObject);
var x:byte;
begin

canvas.brush.color := clblack;
canvas.pen.color := clblack;
[COLOR="Blue"]x := 4;
if x = 1 then
begin
a[30,30] := true;
a[31,30] := true;
a[32,30] := true;
a[33,30] := true;
a[34,30] := true;
a[30,31] := true;
a[31,31] := true;
a[32,31] := true;
a[33,31] := true;
a[34,31] := true;
a[30,32] := true;
a[31,32] := true;
a[32,32] := true;
a[33,32] := true;
a[34,32] := true;
a[30,33] := true;
a[31,33] := true;
a[32,33] := true;
a[33,33] := true;
a[34,33] := true;
a[30,34] := true;
a[31,34] := true;
a[32,34] := true;
a[33,34] := true;
a[34,34] := true;

a[40-5,40-5] := true;
a[41-5,40-5] := true;
a[42-5,40-5] := true;
a[43-5,40-5] := true;
a[44-5,40-5] := true;
a[40-5,41-5] := true;
a[41-5,41-5] := true;
a[42-5,41-5] := true;
a[43-5,41-5] := true;
a[44-5,41-5] := true;
a[40-5,42-5] := true;
a[41-5,42-5] := true;
a[42-5,42-5] := true;
a[43-5,42-5] := true;
a[44-5,42-5] := true;
a[40-5,43-5] := true;
a[41-5,43-5] := true;
a[42-5,43-5] := true;
a[43-5,43-5] := true;
a[44-5,43-5] := true;
a[40-5,44-5] := true;
a[41-5,44-5] := true;
a[42-5,44-5] := true;
a[43-5,44-5] := true;
a[44-5,44-5] := true;


a[40-5,40-15] := true;
a[41-5,40-15] := true;
a[42-5,40-15] := true;
a[43-5,40-15] := true;
a[44-5,40-15] := true;
a[40-5,41-15] := true;
a[41-5,41-15] := true;
a[42-5,41-15] := true;
a[43-5,41-15] := true;
a[44-5,41-15] := true;
a[40-5,42-15] := true;
a[41-5,42-15] := true;
a[42-5,42-15] := true;
a[43-5,42-15] := true;
a[44-5,42-15] := true;
a[40-5,43-15] := true;
a[41-5,43-15] := true;
a[42-5,43-15] := true;
a[43-5,43-15] := true;
a[44-5,43-15] := true;
a[40-5,44-15] := true;
a[41-5,44-15] := true;
a[42-5,44-15] := true;
a[43-5,44-15] := true;
a[44-5,44-15] := true;

a[40,40-10] := true;
a[41,40-10] := true;
a[42,40-10] := true;
a[43,40-10] := true;
a[44,40-10] := true;
a[40,41-10] := true;
a[41,41-10] := true;
a[42,41-10] := true;
a[43,41-10] := true;
a[44,41-10] := true;
a[40,42-10] := true;
a[41,42-10] := true;
a[42,42-10] := true;
a[43,42-10] := true;
a[44,42-10] := true;
a[40,43-10] := true;
a[41,43-10] := true;
a[42,43-10] := true;
a[43,43-10] := true;
a[44,43-10] := true;
a[40,44-10] := true;
a[41,44-10] := true;
a[42,44-10] := true;
a[43,44-10] := true;
a[44,44-10] := true;

a[35,30] := true;
a[36,30] := true;
a[37,30] := true;
a[38,30] := true;
a[39,30] := true;
a[35,31] := true;
a[39,31] := true;
a[35,32] := true;
a[39,32] := true;
a[35,33] := true;
a[39,33] := true;
a[35,34] := true;
a[36,34] := true;
a[37,34] := true;
a[38,34] := true;
a[39,34] := true;
end;
if x = 2 then
begin
a[33,34] := true;
a[34,34] := true;
a[35,34] := true;
a[34,33] := true;
a[34,35] := true;

a[33+9,34+9] := true;
a[34+9,34+9] := true;
a[35+9,34+9] := true;
a[34+9,33+9] := true;
a[34+9,35+9] := true;

a[33,34+9] := true;
a[34,34+9] := true;
a[35,34+9] := true;
a[34,33+9] := true;
a[34,35+9] := true;

a[33+9,34] := true;
a[34+9,34] := true;
a[35+9,34] := true;
a[34+9,33] := true;
a[34+9,35] := true;
end;
if x = 3 then
begin
a[30,30] := true;
a[30,31] := true;
a[30,32] := true;
a[30,33] := true;
a[30,34] := true;
a[30,35] := true;
a[30,36] := true;
a[30,37] := true;
a[30,38] := true;
a[30,39] := true;

a[39,30] := true;
a[39,31] := true;
a[39,32] := true;
a[39,33] := true;
a[39,34] := true;
a[39,35] := true;
a[39,36] := true;
a[39,37] := true;
a[39,38] := true;
a[39,39] := true;

a[48,30] := true;
a[48,31] := true;
a[48,32] := true;
a[48,33] := true;
a[48,34] := true;
a[48,35] := true;
a[48,36] := true;
a[48,37] := true;
a[48,38] := true;
a[48,39] := true;
end;
if x = 4 then
begin
a[30,30] := true;
a[31,31] := true;
a[32,32] := true;
a[33,33] := true;
a[34,34] := true;
a[35,35] := true;
a[36,36] := true;
a[37,37] := true;
a[38,38] := true;
a[39,39] := true;
a[40,40] := true;
a[41,41] := true;
a[42,42] := true;
a[43,43] := true;
a[44,44] := true;

a[31,30] := true;
a[32,31] := true;
a[33,32] := true;
a[34,33] := true;
a[35,34] := true;
a[36,35] := true;
a[37,36] := true;
a[38,37] := true;
a[39,38] := true;
a[40,39] := true;
a[41,40] := true;
a[42,41] := true;
a[43,42] := true;
a[44,43] := true;

a[31,29] := true;
a[32,30] := true;
a[33,31] := true;
a[34,32] := true;
a[35,33] := true;
a[36,34] := true;
a[37,35] := true;
a[38,36] := true;
a[39,37] := true;
a[40,38] := true;
a[41,39] := true;
a[42,40] := true;
a[43,41] := true;
a[44,42] := true;
a[45,43] := true;

end;[/COLOR]               

button1.Visible := false;
timer1.Enabled := true;
end;

end.

Das in blau stehende, ist dabei nur die inizialisierung der farbigen/lebenden Zellen.
Das rote, ist der Teil, der in jedem Delphi prog steht(Uniteinbindung,Initialisierung,...)
 
Zuletzt bearbeitet von einem Moderator:
Oben