Spiel des Lebens! HILFEE!!!!!



  • 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 übernehmen

    BTW: Mit "HELFT UNS!!!" und ähnlichen Sprüchen, deute ich auf eine Schulaufgabe. Warum fragst du nicht den Lehrer?


  • Mod

    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!" 👍


  • Mod

    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...


Anmelden zum Antworten