Subato

Life

Ziel dieser Aufgabe ist es eine einfache Version von
»Conways Spiel des Lebens«  in C zu implementieren.

Das Spielfeld wird dargestellt durch quadratische Matrizen, deren Einträge entweder belegt (bevölkert), oder nicht belegt sind. Ein Eintrag an Position (i, j) in einer Matrix wird durch seine Zeile i und sein Spalte j bezeichnet, wobei die Zählung der Zeilen und Spalten bei 0 beginnt.

Implementieren Sie die folgende C-Header Datei:

#ifndef LIFE__H
#define LIFE__H

#include <stdbool.h>

//Einfach zu benutzen um minmum und maximum eines Vergleichs zu bekommen.
#define MIN(X, Y) (((X) < (Y)) ? (X) : (Y))
#define MAX(X, Y) (((X) > (Y)) ? (X) : (Y))


/** Eine Matrix besteht aus einer Kantenlänge und einem zweidimensionalen
    Array von Wahrheitswerten. 
**/
typedef struct{
  unsigned int length;
  bool** data;
} Matrix;

/**
   Erzeugt ein neues quadratisches Matrixobjekt mit Kantenlänge length.
   Auf allen Koordinaten wird der Wert false gesetzt.
*/
Matrix newMatrix(unsigned int length); 

/**
  Löscht alle Daten des Objekts komplett auf dem Heap. 
*/
void deleteMatrix(Matrix m);


/**
  Erzeugt einen String mit soviel Zeilen, wie die quadratische Matric
  hat. In jeder Zeile wird der Wert true durch das Zeichen '*' und der  
  Wert false durch das Zeichen ' ' dargestellt.

  Der erzeugte String wird in den Parameter geschrieben. Es wird davon 
  ausgegangen, dass dieser eine ausreichende Länge an Speicherplatz 
  beinhaltet.
*/
void showMatrixIn(Matrix m,char* result);

/**
  Erzeugt einen String mit soviel Zeilen, wie die quadratische Matric
  hat. In jeder Zeile wird der Wert true durch das Zeichen '*' und der  
  Wert false durch das Zeichen ' ' dargestellt.
*/
char* showMatrix(Matrix m);

/** 
  Gibt an, wieviel der maximal 8 benachbarten Felder mit true belegt sind.
*/
unsigned int anzahlBelegterNachbarn(Matrix m,unsigned int x, unsigned int y);

/** 
  Erzeugt eine neue Matrix die nach den Regeln des Spiels wie folgt belegt ist:

  Für eine Matrix-Zelle, die belegt ist:
      Jede Zelle mit einem oder keinem Nachbarn stirbt.
      Jede Zelle mit vier oder mehr Nachbarn stirbt.
      Jede Zelle mit zwei oder drei Nachbarn überlebt.

  Für eine Matrix-Zelle, die leer ist:
      Jede Zelle mit drei Nachbarn wird belegt.

Hier bedeutet ”stirbt“: nicht belegt in der Matrix (false); 
und überlebt“: belegt in der Matrix (true).


  Das Ergebnis wird in den Parameter result geschrieben. Dabei wird davon
  ausgegangen, dass m.length==result.length ist.
*/
void zugGOLIn(Matrix m, Matrix result);


/**
   Wie zugGOLIn, jedoch wird jetzt eine neue Matrix als Ergebnis erzeugt
   und zurück gegeben.
*/
Matrix zugGOL(Matrix m);

#endif

Auf einem Unix-Terminal lassen sich mit folgenden kleinen Test, nach und nach alle Generationen einer Startpopulation anzeigen:

#include "Life.h"
#include <stdio.h>
#include <unistd.h>

int main(){
  Matrix m1 ;
  Matrix m2 = newMatrix(20);

  Matrix oktagon = newMatrix(20);
  int i;
  for (i=4;i<8;i++){
    oktagon.data[3][i] = true;
    oktagon.data[8][i] = true;
    oktagon.data[i][3] = true;
    oktagon.data[i][8] = true;    
  }

  for (i=5;i<7;i++){
    oktagon.data[4][i] = true;
    oktagon.data[7][i] = true;
    oktagon.data[i][4] = true;
    oktagon.data[i][7] = true;    
  }
  
  char* ms = showMatrix(oktagon);
  printf("%s\n",ms);
  m1 = oktagon;
  printf("\033[H\033[J");
  while(true){
    printf("\033[%d;%dH",1,1);
    printf("%s\n",ms);
    zugGOLIn( m1, m2);
    showMatrixIn(m1,ms);    
    Matrix tmp = m1;
    m1=m2;
    m2=tmp;
    sleep(1);
  }
  return 0;
}

 


#include "Life.h" Matrix newMatrix(unsigned int length){ } void deleteMatrix(Matrix m){ } char* showMatrix(Matrix m){ } void showMatrixIn(Matrix m,char* result){ } unsigned int anzahlBelegterNachbarn(Matrix m,unsigned int x, unsigned int y){ } Matrix zugGOL(Matrix m){ } void zugGOLIn(Matrix m, Matrix result){ }
c
You are not logged in and therefore you cannot submit a solution.