C- Spiel des Lebens

sheddy

Cadet 2nd Year
Registriert
Nov. 2005
Beiträge
17
Moin!

ich muss folgende Aufgabe programmieren:

1-sdl.JPG


Ich weiß jedoch nicht, ob ich jetzt fertig bin bzw. ob das jetzt so richtig ist! Das Programm funktioniert ohne zu mucken. Aber ich bin mir mit dem zufallsgenerato rnoch nicht so im reinen!

hier erst mal mein programmcode:

Code:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>


#define X 10 /* Zeile */
#define Y 10 /* Spalte */

void init_world(char (*)[Y]);
void next_gen(char (*)[Y], char (*)[Y]);
void put_world(char (*)[Y]);

int main(void)
{
	int x=0;
	char gen1[X][Y];
	char gen2[X][Y];
	srand(45); /* Zufallsgenerator bei der Zahl 45 starten */

	init_world(gen1);
	put_world(gen1); /* (KANN AUCH ENTFALLEN)Ausgabe der ersten Zufallsmatrix / Zur Kontrolle, ob sie zufällig initialisiert wurde */
	do
	{
		next_gen(gen1,gen2); 
		put_world(gen1);
		x++;

	}while(x<10);

	getchar();
	return 0;
}

void init_world(char (*world)[Y])
{
	int i, k;

	for(i=0; i<X; i++)
	{
		for(k=0; k<Y; k++)
		{
			world[i][k]=rand()%2; /* Zufallsgenerator weist dem array 0 oder 1 zu */
		}
	}

}


void next_gen(char (*now)[Y], char (*next)[Y])
{
	int i, k, star=0;
	for(i=0; i<X; i++)
	{
		for(k=0; k<Y; k++)
		{

			if((i-1>=0)&&(k-1>=0))		/* oben links */
			{
				if(now[i-1][k-1]==1)
				{
					star++;
				}
			}
			if(i >= 0)					/* oben */
			{
				if(now[i-1][k]==1)
				{
					star++;
				}
			}
			if((i-1>=0)&&(k+1<=Y))		/* oben rechts*/
			{
				if(now[i-1][k+1]==1)
				{
					star++;
				}
			}
			if(k-1>=0)					/* links */
			{
				if(now[i][k-1]==1)
				{
					star++;
				}
			}
			if(k+1<=Y)					/* rechts */
			{
				if(now[i][k+1]==1)
				{
					star++;
				}
			}
			if((i+1<=X)&&(k-1>=0))		/* unten links */
			{
				if(now[i+1][k-1]==1)
				{
					star++;
				}
			}
			if(i+1<X)					/* unten */
			{
				if(now[i+1][k]==1)
				{
					star++;
				}
			}
			if((i+1<=X)&&(k+1<=Y))		/* unten rechts */
			{
				if(now[i+1][k+1]==1)
				{
					star++;
				}
			}

			/* Leben oder Tod */

			if((star < 2) || (star > 3) )
			{
				next[i][k]=0;
			}
			else if(star == 3)
			{
				next[i][k]=1;
			}
			else if(star == 2)
			{
				next[i][k]=now[i][k];
			}
		}
	}
	for(i=0; i<X; i++)
	{
		for(k=0; k<Y; k++)
		{
			now[i][k]=next[i][k];
		}
	}



}

void put_world(char (*pgen)[Y])
{
	int i, k;
	for(i=0; i<X; i++)
	{
		for(k=0; k<Y; k++)
		{
			if(pgen[i][k] == 0)
			{
				printf("%c",' ');

			}
			else
			{
				printf("%c",'*');

			}
		 }
		printf("\n");

	}
	printf("\n--------------\n");

}

Also ich habe das mit dem Zufallsgenerator so verstanden, dass srand() den Zufallsgen, initialisiert. ich starte den Zufallsgenerator also mit der Zahl 45 (srand(45))!
Also fängt der Zufallsgenerator doch erst ab der Zahl 45 an,oder?!
habe ichd as so richtig verstanden???

und könnte jemand das Programm mal ausprobieren, ob ich meine Aufgabe so richtig gelöst habe?
ich weiß echt nicht weiter und das Ergebnis sieht echt komisch aus!

Danke schon mal!

Gruß Sheddy
 
Nein, srand() bekommt den sog. Seed für die zukünftigen Zahlen. Das heisst nicht, dass die Zahlen immer mit 45 anfängt. Das Problem ist, dass du immer die gleichen Zufallszahlen in deinem Programm erhalten wirst, wenn du den gleichen seed benutzt (hier 45). Normalerweise löst man das so, dass man srand((unsigned)time(NULL)); aufruft. Dadurch dass der Rückgabewert von time jedes Mal ein anderer ist, werden sich die Sequenzen der Zufallszahlen nicht wiederholen.
 
ähm...

ich galube, ich weiß, was du meinst!

du meinst, dass ich immer wieder die gleichen Sequenzen an Zufallszahlen bekommen,ne?!

Aber das ist ja noch nicht mal der fall bei mir!

ich bekomme als 1. matrix immer wieder die gleiche Matrix! Das kann ja nicht sein, dass immer wieder "zufällig" die gleiche Zufallszahl erzeugt wird und so die erste Startmatrix immer wieder gleich aussieht!

Das kommt mir irgendwie spanisch vor.

Was habe ich da falsch gemacht! Kannst ja einfach mal den Code ausprobieren, dann wirste sehen, was ich meine!
 
Um dann Zahlen zwischen zwei Grenzen a und b zu erhalten benutzt du dann die Addition und den Modulo Operator:
Code:
srand((unsigned)time(NULL));
int neu = rand()%a+b; //ergibt eine zahl b<=neu<=a

Überigens ist es manchmal erwünschenswert srand() mit einer konstanten zu Initialisieren. Dann erhälst du während du testest immer die gleichen "Zufallszahlen". Das kann während du testest SEHR nützlich sein...
 
ich bekomme als 1. matrix immer wieder die gleiche Matrix! Das kann ja nicht sein, dass immer wieder "zufällig" die gleiche Zufallszahl erzeugt
Eben doch. Es sind ja nur Pseudozahlen, die mit Hilfe einer Formel berechnet werden, für die eben der Seed, den du an srand übergibst, herangezogen wird.
 
Okay, ich habe sie ja jetzt mit der konstanten 45 initialisiert.

Dann kommt immer die gleiche Startmatrix. Das habe ich jetzt verstanden! ;)

Wenn das programm richtig funktioniert, werde ich den Zufallsgenerator mit der Systemzeit initialisieren, wie ihr das gemacht habt.

In meinem programm wird ja di matrix dann eh ja nur mit der 0 oder 1 initialisiert, dabei ist es ja egal, wie große die zahlen sind!


Aber könntet ihr euch das Programm mal ansehen und mir sagen, ob ich das jetzt richtig gelöst habe?

Denn nach der Startmatrix fallen sofort alle Lebewesen bis auf eins weg und die matrix darauf, ist fast ganz komplett voll etc.!

ich weiß ja auch nicht, wie ich das überprüfen soll, ob es denn richtig ist, versteht ihr?!

Deshalb würde ich gerne noch ne Meinung einholen, dass ich mich bestätigt sehe :D
 
Wenn du den Zufallsgenerator immer mit der gleichen Zahl initialisierst, bekommst du auch immer den gleichen Ablauf. ;)

Probier doch andere Werte, dann siehst du ja, ob die Generationen länger leben.

Am besten machst du eine festdefinierte erste Generation und schaust mal per Hand, wie es weiter gehen würde und vergleichst es mit dem Ergebnis des Programmes.
 
Zurück
Oben