#include #include #include /* Konstanten fuer die verschiedenen Zustaende des Feldes. Da echte * Buchstaben verwendet werden, kann eine ganze Zeile spaeter als * ein String ausgegeben werden. Das hoechste Bit (0x80) wird * verwendet um anzuzeigen, ob auf dem Feld in der naechsten Runde * ein Bakterie sein wird, will dieses Bit ausblenden, dann kann MASK * verwendet werden. */ #define NOSET ' ' /* Space fuer ein Feld ohne Bakterie */ #define SET '#' /* #-character fuer ein Feld mit Bakterie */ #define MASK 0x7f #define NEXTSET 0x80 /* Das Feld, Speicher wird dynamisch allokiert, wenn bekannt ist, wie * gross das Feld sein soll. */ char ** board; /* Die Groesse des Feldes in i-Richtung (Anzahl Zeilen) und j-Richtung * (Anzahl Spalten). Der default ist 22 Zeilen, 70 Spalten. */ int imax = 22, jmax = 70; int error = 0; /* Wird true, wenn der Rand des Feldes erreicht wurde. */ int tick = 0; /* Die aktuelle Runde. */ /* Liefert true zurueck, wenn sich in Zeile i, Spalte j eine Bakterie * befindet, sonst ist der Rueckgabewert false. Wenn die Koordinaten * ausserhalb des Feldes liegen, wird ebenfalls false zurueckgeliefert. */ int getboard (int i, int j) { if ((i < 0) || (i >= imax)) { return 0; } if ((j < 0) || (j >= jmax)) { return 0; } return (board[i][j] & MASK) == SET; } /* Aktuelles Feld ausgeben. Wenn diese Funktion aufgerufen wird darf das * NEXTSET bit nirgendwo gesetzt sein. */ void showboard () { int i; for (i=0; i 0) && (imax >= 2+initimax)); assert ((initjmax > 0) && (jmax >= 2+initjmax)); /* Speicher um eine Zeile aus der Anfangskonfiguration * einlesen zu koennen. */ line = calloc (initjmax+10, sizeof (char)); /* Speicher fuer das Spielfeld. */ board = calloc (imax, sizeof (char *)); for (i=0; i