Spiel des Lebens! HILFEE!!!!!
-
II) Eine lebende Zelle bleibt lebendig, wenn sie 2 oder 3 lebendige (von max. 8 möglichen)
Nachbarn besitzt, andernfalls stirbt sie wegen Überbevölkerung bzw. Vereinsamung.
III) Grenzen drei lebendige Zellen (Vater, Mutter, Hebamme) an einen gemeinsamen unbewohnten
Gitterpunkt, so wird dort eine Kind-Zelle geboren.
Die Regeln II) und III) werden in jedem Takt des fortlaufenden Lebens umgesetzt.AUFGABE: Schreibt eine Funktion mit Signatur int update_Array(int A[][M]), welche die Populationsregeln II) und III) eines Zeittaktes auf das Array A anwendet. Der Rückgabewert soll dabei
1 sein, wenn sich nichts geändert hat, d.h. wenn ein stationärer Populationszustand erreicht
wurde, andernfalls soll 0 zurückgegeben werden.so jetzt haben wir uns hingesetzt und folgendes Programm geschrieben:
#include <stdio.h> #include <stdlib.h> #define N 4 #define M 4 void rand_array(int A[][M], int p){ int i,j,r; for(i=0; i<N; i++){ /* durchläuft die Zeile */ for(j=0; j<M; j++){ /* durchläuft die Spalte */ r=rand(); if (r<RAND_MAX/100*p) { A[i][j]=1; } else { A[i][j]=0; } } } return 0; } int update_Array(int A[][M]) { int mask[N][M]; int i,j; int pop; int ret_value=1; for(i=0; i<N; i++){ /* durchläuft die Zeile */ for(j=0; j<M; j++){ /* durchläuft die Spalte */ mask[i][j]=0; } } for(i=0; i<N; i++){ /* durchläuft die Zeile */ //printf("\n"); for(j=0; j<M; j++){ /* durchläuft die Spalte */ pop=0; if (j==M){ printf("test"); } if ((A[i-1][j-1]==1)&&(i!=0)&&(j!=0)) pop++; if ((A[i-1][j]==1)&&(i!=0)) pop++; if ((A[i-1][j+1]==1)&&(i!=0)&&(j!=M)) pop++; if ((A[i][j-1]==1)&&(j!=0)) pop++; if ((A[i][j+1]==1)&&(j!=M)) pop++; if ((A[i+1][j-1]==1)&&(i!=N)&&(j!=0)) pop++; if ((A[i+1][j]==1)&&(i!=N)) pop++; if ((A[i+1][j+1]==1)&&(i!=N)&&(j!=M)) pop++; mask[i][j]=pop; display_array(mask); if (pop==3) { A[i][j]=1; ret_value = 0; } if ((pop<2)||(pop>3)) { ret_value = 0; A[i][j]=0; } display_array(A); } } display_array(mask); return ret_value; } void display_array(int A[][M]) { int i,j; for(i=0; i<N; i++){ /* durchläuft die Zeile */ for(j=0; j<M; j++){ /* durchläuft die Spalte */ printf(" %d",A[i][j]); } printf("\n"); } printf("\n"); } int main (void){ int A[N][M]; int i,j; srand((unsigned int) time(NULL)); /* Initialisierung der Zufallszahlen*/ rand_array(A,50); display_array(A); update_Array(A); display_array(A); return 0; }
aber die letzte Zeile wird immer falsch ausgegeben.....
BITTE HELFT UNS!!!
-
aber die letzte Zeile wird immer falsch ausgegeben.....
Erläutere das mal. Das Programm macht ja komplexe Sachen und ich mag nicht alles auf dem Papier nachrechnen. Was soll rauskommen, wieso denkt ihr, dass dies rauskommen soll und was kommt stattdessen raus.
-
Was mir aber direkt als Fehler auffällt:
if ((A[i-1][j-1]==1)&&(i!=0)&&(j!=0)) pop++; if ((A[i-1][j]==1)&&(i!=0)) pop++; if ((A[i-1][j+1]==1)&&(i!=0)&&(j!=M)) pop++; if ((A[i][j-1]==1)&&(j!=0)) pop++; if ((A[i][j+1]==1)&&(j!=M)) pop++; if ((A[i+1][j-1]==1)&&(i!=N)&&(j!=0)) pop++; if ((A[i+1][j]==1)&&(i!=N)) pop++; if ((A[i+1][j+1]==1)&&(i!=N)&&(j!=M)) pop++;
Typischer Fehler: i und j können in der Schleife auch 0, bzw. 3 werden, überleg mal, was dann wohl passiert.
-
wir haben das jetzt für N 3 und M4 auf folgendes geändert
if ((i!=0)&&(j!=0)&&(B[i-1][j-1]==1)) pop++; if ((i==N-1)&&(j==M-1)&&(B[i-2][j-1]==1)) pop++; if ((i==N-1)&&(j==M-1)&&(B[i-2][j]==1)) pop++; if ((i==N-1)&&(j==M-1)&&(B[i][j]==1)) pop++; if ((i!=0)&&(i!=N-1)&&(B[i][j]==1)) pop++; if ((j!=M-1)&&(B[i-1][j+1]==1)&&(i!=0)) pop++; if ((j!=0)&&(B[i-1][j]==1)) pop++; if ((j!=M-1)&&(B[i][j]==1)) pop++; if ((i!=N-1)&&(j!=0)&&(B[i+1][j-1]==1)) pop++; if ((i!=N-1)&&(B[i+1][j]==1)) pop++; if ((i!=N-1)&&(j!=M-1)&&(B[i+1][j+1]==1)) pop++;
und array a auf ein 2. array kopiert also jetzt nochmal das ganze programm:
/* * fdfd.c * * Created on: Nov 23, 2010 * Author: semc1568 */ #include <stdio.h> #include <stdlib.h> #include <time.h> #define N 3 #define M 4 void rand_array(int A[][M], int p){ int i,j,r; srand((unsigned int) time(NULL)); for(i=0; i<N; i++){ /* durchläuft die Zeile */ for(j=0; j<M; j++){ /* durchläuft die Spalte */ r=rand(); if (r<RAND_MAX/100*p) { A[i][j]=1; } else { A[i][j]= 0; } } } } void display_array(int A[][M]) { int i,j; for(i=0; i<N; i++){ /* durchläuft die Zeile */ for(j=0; j<M; j++){ /* durchläuft die Spalte */ printf(" %d",A[i][j]); } printf("\n"); } printf("\n"); } int update_Array(int A[][M]) { int B[N][M]; int mask[N][M]; int i,j; int pop; int ret_value=1; for(i=0; i<N; i++){ for(j=0; j<M; j++){ B[i][j]=A[i][j]; } } for(i=0; i<N; i++){ /* durchläuft die Zeile */ for(j=0; j<M; j++){ /* durchläuft die Spalte */ mask[i][j]=0; } } for(i=0; i<N; i++){ /* durchläuft die Zeile */ for(j=0; j<M; j++){ /* durchläuft die Spalte */ pop=0; if ((i!=0)&&(j!=0)&&(B[i-1][j-1]==1)) pop++; if ((i==N-1)&&(j==M-1)&&(B[i-2][j-1]==1)) pop++; if ((i==N-1)&&(j==M-1)&&(B[i-2][j]==1)) pop++; if ((i==N-1)&&(j==M-1)&&(B[i][j]==1)) pop++; if ((i!=0)&&(i!=N-1)&&(B[i][j]==1)) pop++; if ((j!=M-1)&&(B[i-1][j+1]==1)&&(i!=0)) pop++; if ((j!=0)&&(B[i-1][j]==1)) pop++; if ((j!=M-1)&&(B[i][j]==1)) pop++; if ((i!=N-1)&&(j!=0)&&(B[i+1][j-1]==1)) pop++; if ((i!=N-1)&&(B[i+1][j]==1)) pop++; if ((i!=N-1)&&(j!=M-1)&&(B[i+1][j+1]==1)) pop++; mask[i][j]=pop; display_array(mask); if (pop==3) { A[i][j]=1; ret_value = 1; } if ((pop<2)||(pop>3)) { ret_value = 0; A[i][j]= 0; } display_array(A); } } display_array(mask); return ret_value; } int main (void){ int A[N][M]; srand((unsigned int) time(NULL)); /* Initialisierung der Zufallszahlen*/ rand_array(A,50); update_Array(A); return 0; }
aber die ergebnisse sind immernoch falsch!!!!!!!!
helft uns bitte!
-
Lass dir in jeder Zeile mit printf die Werte ausgeben und vergleiche sie mit den auf Papier berechneten Werten. Dann findet ihr die Zeile, in der der Fehler ist.
-
Ein weiterer typischer Fehler beim GameOfLife ist, dass ihr auf dem gleichen Array arbeitet, wenn ich das recht überblicke. Ihr überschreibt euch also während der Berechnung die Ausgangsdaten.
Richtiges Vorgehen:
- Berechnung mit altem Array -> Ergbnis in neues Array
- Nach der Berechnung das neue Array als altes Array für den nächsten Durchlauf übernehmenBTW: Mit "HELFT UNS!!!" und ähnlichen Sprüchen, deute ich auf eine Schulaufgabe. Warum fragst du nicht den Lehrer?
-
DarthZiu schrieb:
BTW: Mit "HELFT UNS!!!" und ähnlichen Sprüchen, deute ich auf eine Schulaufgabe. Warum fragst du nicht den Lehrer?
Ich tippe auf Übungsaufgabe an einer (Fach-?)Hochschule und dies ist eine bewertete Hausaufgabe. Wollen wir um ein Internet wetten?
P.S.: Natürlich könnte man auch in diesem Fall den Tutor/Prof um Hilfe fragen.
-
Die Maske wird falsch berechnet. Ihr solltet euch zuerst darauf konzentrieren, bevor ihr euch um das entfernen und hinzufügen von Zellen kümmert.
-
Mir war langweilig ich werde euch erlösen...
#include <stdio.h> #include <stdlib.h> #include <time.h> #define N 10 #define M 10 void rand_array(int A[][M]) { for(int i = 0; i < N; i++) for(int j = 0; j < M; j++) A[i][j] = rand() % 2; } void display_array(const int arr[][M]) { for(int i = 0; i < N; i++) { for(int j = 0; j < M; j++) { printf(" %d", arr[i][j]); } printf("\n"); } printf("\n"); } void update_Array(int A[][M]) { int temp[N][M]; for(int i = 0; i < N; i++) { for(int j = 0; j < M; j++) { temp[i][j] = A[i][j]; } } int mask[N][M]; for(int i = 0; i < N; i++) { for(int j = 0; j < M; j++) { mask[i][j] = 0; } } for(int i = 0; i < N; i++) { for(int j = 0; j < M; j++) { //Angrenzende lebende Zellen zählen (ES GIBT NUR 8 ANGRENZENDE ZELLEN ALSO AUCH NUR 8 BEDINGUNGEN!) if(temp[i-1][j-1] == 1 && i > 0 && j > 0) ++mask[i][j]; if(temp[i ][j-1] == 1 && j > 0) ++mask[i][j]; if(temp[i-1][j ] == 1 && i > 0 ) ++mask[i][j]; if(temp[i-1][j+1] == 1 && i > 0 && j + 1 < M) ++mask[i][j]; if(temp[i ][j+1] == 1 && j + 1 < M) ++mask[i][j]; if(temp[i+1][j ] == 1 && i + 1 < N ) ++mask[i][j]; if(temp[i+1][j-1] == 1 && i + 1 < N && j > 0) ++mask[i][j]; if(temp[i+1][j+1] == 1 && i + 1 < N && j + 1 < M) ++mask[i][j]; if(mask[i][j] < 2 || mask[i][j] > 3) A[i][j] = 0; //Sterben durch Vereinsamung/Überbevölkerung else if(mask[i][j] == 3) A[i][j] = 1; //Neues Leben schaffen } } } int main(void) { srand((unsigned int) time(NULL)); int A[N][M]; rand_array(A); int runde = 1; while(getchar()) { update_Array(A); printf(" Runde %i\n", runde); display_array(A); ++runde; } return 0; }
-
vielen vielen vielen dank an "IchErlöseEuch!"
-
problemkinder schrieb:
vielen vielen vielen dank an "IchErlöseEuch!"
Ich an eurer Stelle wäre nicht so dankbar. Jetzt habt ihre bei der aufgabe nichts gelernt und die nächste Aufgabe wird ganz bestimmt schwerer und setzt das voraus, was hier gelernt werden sollte.
-
SeppJ schrieb:
problemkinder schrieb:
vielen vielen vielen dank an "IchErlöseEuch!"
Ich an eurer Stelle wäre nicht so dankbar. Jetzt habt ihre bei der aufgabe nichts gelernt und die nächste Aufgabe wird ganz bestimmt schwerer und setzt das voraus, was hier gelernt werden sollte.
wenn man sich das programm anguckt versteht man das eigentlich,
aber du hast recht wir sollten selber auf die richtige lösung kommen
-
Moin!
ich hab mal das von "IchErlöseEuch" versucht auszugeben, aber bei mir kommt irgendwie eine endlosschleife dabei raus.Hab ich da jetzt was falsch gemacht oder is in dem programm einfach noch was falsch?
-
ah^^ Problem gefunden^^ ich muss das Programm über die eingabeaufforderung öffnen, damit er mir das ausgibt^^
-
und jetzt das ganze bitte für c# *heul* ich raff das einfach nicht...