"Spiel des Lebens" in C
-
Moin!
Das ist meine Aufgabe, zu der ich ein paar Fragen habe!
Unter init_world steht, dass ich die Startmatrix initialisiern soll. Und dann steht da, dass ich in die Lebensraum-Matrix ein Lebwesen setzen soll,oder?!?
ich verstehe nicht genau, wie ich die beiden Matrizen zu initialisieren habe.
Ich weiß nur, dass ich zwei Matrizen habe und diese eben zur Lösung brauche!Kann mir jemand helfen, was ich da jetzt genau machen soll?! Was soll in die erste und was in die zweite Matrix?
gruß Sheddy
-
[quote="sheddy"]Moin!
Unter init_world steht, dass ich die Startmatrix initialisiern soll. Und dann steht da, dass ich in die Lebensraum-Matrix ein Lebwesen setzen soll,oder?!?
[quote]
Genau das sollst du. Du musst dir halt irgendeine Konvention überlegen z.B.
0 = kein Lebewesen
1 = Lebewesen auf dem Platz
Nach dem Progrmmstart ist der Lebensraum leer (du legst ein 10x10 Array an, und schreibst überall 0 rein) dann von der Concole einlesen wo ein Lebewesen sitz (an die eingegebenen Stellen z.B. eine 1 schreiben)Und warum 2 Matrizen, solltest du durch etwas nachdenken draufkommen. Wenn du die nächste Generation berechnest (in ein paar for-schleifen), löscht du ja Lebewesen oder setzt neue dazu. Aber diese Änderungen sollen sich ja erst auf den Lebensraum auswirken, wenn die komplette Berechnung abgeschlossen ist...
HTH Andy
-
das war mir keine hilfe!
wenn ich eine Matrix habe und lasse dort ein Lebewesen reinschreiben, dann wird dieses sofort sterben!
Also müsste ich doch die erste Matrix zufällig mit Lebewesen besetzen und in die zweite Matrix per Console das Lebewesen einlesen lassen,oder?!
Dann beide miteinander vergleichen und Abfahrt, sodass der Lebenszyklus nach den oben genannten Kriterien ablaufen kann.
Oder habe ich das ws falsch verstanden??
-
sheddy schrieb:
wenn ich eine Matrix habe und lasse dort ein Lebewesen reinschreiben, dann wird dieses sofort sterben!
Nein erst im übergang zum nächsten Zyklus
Also müsste ich doch die erste Matrix zufällig mit Lebewesen besetzen und in die zweite Matrix per Console das Lebewesen einlesen lassen,oder?!
Nein, mehrere für die erste einlesen
Dann beide miteinander vergleichen und Abfahrt, sodass der Lebenszyklus nach den oben genannten Kriterien ablaufen kann.
Oder habe ich das ws falsch verstanden??
ja, eine prüfen und die zweite daraus erstellen, nicht vergleichen
-
hmm....ein lebewesen wird natüprlich erst zum übergang in den nächsten lebensraum sterben!
Also soll die erste Matrix mit mehrern Lebewesen per Console "gefüttert" werden und die zweite Matrix soll der nachfolgende Lebensraum sein, in dem der neue nach den 3 Kriterien berechnete Lebensraum gespeichert wird,ne?!
-
Ich fand das Ganze recht interessant und hab mal was kleines zusammengeschrieben. Allerdings noch ohne richtige Fehlerbehandlung. Ich hoffe mal das ist was du brauchst, jedenfalls hab ich die Aufgabenstellung so verstanden.
#include <stdio.h> #include <stdlib.h> #define ZEILEN 10 #define SPALTEN 10 #define GENERATIONEN 10 void init_world(int **array) { int z, s, l, i = 0; printf("Wieviele Lebewesen sollen erstellt werden?: "); scanf("%d", &l); while(i < l) { printf("Lebewesen %d [Zeile Spalte]: ", i + 1); scanf("%d %d", &z, &s); if(z < ZEILEN && z >= 0 && s < SPALTEN && s >= 0) { array[z][s] = 1; i++; } else { fprintf(stderr, "Fehleingabe!\n"); exit(EXIT_FAILURE); } } printf("\n"); } void next_gen(int **array1, int **array2) { int i, j, count = 0; for(i = 0; i < ZEILEN; i++) { for(j = 0; j < SPALTEN; j++) { count = 0; if(i - 1 >= 0 && j - 1 >= 0) { if(array1[i - 1][j - 1] == 1) /*oben links*/ count++; } if(i - 1 >= 0) { if(array1[i - 1][j] == 1) /*oben*/ count++; } if(i - 1 >= 0 && j + 1 < SPALTEN) { if(array1[i - 1][j + 1] == 1) /*oben rechts*/ count++; } if(j - 1 >= 0) { if(array1[i][j - 1] == 1) /*links*/ count++; } if(j + 1 < SPALTEN) { if(array1[i][j + 1] == 1) /*rechts*/ count++; } if(i + 1 < ZEILEN && j - 1 >= 0) { if(array1[i + 1][j - 1] == 1) /*unten links*/ count++; } if(i + 1 < ZEILEN) { if(array1[i + 1][j] == 1) /*unten*/ count++; } if(i + 1 < ZEILEN && j + 1 < SPALTEN) { if(array1[i + 1][j + 1] == 1) /*unten rechts*/ count++; } if(count < 2 || count > 3) array2[i][j] = 0; else if(count == 3) array2[i][j] = 1; else array2[i][j] = array1[i][j]; } } for(i = 0; i < ZEILEN; i++) { for(j = 0; j < SPALTEN; j++) array1[i][j] = array2[i][j]; } } void put_world(int **array) { int i, j; printf("\n "); for(i = 0; i < SPALTEN; i++) printf("%2d ", i); printf("\n "); for(i = 0; i < SPALTEN; i++) printf("---"); printf("\n"); for(i = 0; i < ZEILEN; i++) { printf("%2d|", i); for(j = 0; j < SPALTEN; j++) { if(array[i][j]) printf(" * "); else printf(" "); } printf("\n"); } printf("\n"); } int main(void) { int **matrix1 = NULL, **matrix2 = NULL; int i, j; if((matrix1 = malloc(ZEILEN * sizeof(int *))) == NULL) return EXIT_FAILURE; for(i = 0; i < ZEILEN; i++) { if((matrix1[i] = calloc(SPALTEN, sizeof(int))) == NULL) return EXIT_FAILURE; } if((matrix2 = malloc(ZEILEN * sizeof(int *))) == NULL) return EXIT_FAILURE; for(i = 0; i < ZEILEN; i++) { if((matrix2[i] = calloc(SPALTEN, sizeof(int))) == NULL) return EXIT_FAILURE; } init_world(matrix1); printf("Ursprung:\n"); put_world(matrix1); for(i = 0; i < GENERATIONEN; i++) { next_gen(matrix1, matrix2); printf("Folgegeneration %d:\n", i + 1); put_world(matrix1); } for(i = 0; i < ZEILEN; i++) { if(matrix1[i] != NULL) free(matrix1[i]); if(matrix2[i] != NULL) free(matrix2[i]); } if(matrix1 != NULL) free(matrix1); if(matrix2 != NULL) free(matrix2); return EXIT_SUCCESS; }
-
Danke für deine Mühe!
Ich darf das gar nicht zu genau angucken, da ich das selber programmieren möchte! Und "copy+paste" kann ja jeder
Ich werde mir mal deine init_world angucken, damit ich endlich weiß, wie die blöden Matrizen benutzt werden!