Problem game of Life



  • Hio 🙂

    hab ein kleines problem mit meinem Game Of Life Programm.

    der Code:

    #include<stdio.h>
    
    //Population in tmp array speichern bzw umgekehrt
    void copyarray(int pop[8][12], int tmp[8][12])
    {
        int j, i;
        for(j=0; j <=7; j++)
        {
            for(i=0; i <= 11; i++)
            {
                tmp[j][i] = pop[j][i];
            }
        }
    
    }
    
    //Angrenzendes Leben Zählen
    int count(int pop[8][12], int j, int i)
    {
        int p = 0;
    
        if(pop[j%8]     [(i+1)%12]  == 1) p++;
        if(pop[j%8]     [(i-1)%12]  == 1) p++; //
    
        if(pop[(j+1)%8] [(i+1)%12]  == 1) p++;
        if(pop[(j+1)%8] [i%12]      == 1) p++;
        if(pop[(j+1)%8] [(i-1)%12]  == 1) p++;
    
        if(pop[(j-1)%8] [(i+1)%12]  == 1) p++;
        if(pop[(j-1)%8] [(i%12)]    == 1) p++; //
        if(pop[(j-1)%8] [(i-1)%12]  == 1) p++; //
    
        return p;
    }
    
    int main(void)
    {
    
        // Population angepasst zum test!!!!
      int pop[8][12] = {
                 {1,0,0,0,0,0,0,0,0,0,0,1},
    		     {1,0,0,0,1,1,1,0,0,0,0,1},
    		     {0,0,0,0,0,0,0,0,0,0,0,0},
    		     {0,0,0,0,0,0,0,0,0,0,0,0},
    		     {0,0,0,0,0,1,0,0,1,1,0,0},
    		     {0,0,0,0,1,0,0,0,1,1,0,0},
    		     {0,0,0,1,0,0,0,0,1,1,0,0},
    		     {0,0,0,0,0,0,0,0,0,0,0,0} };
    
        int tmp[8][12];
    
        copyarray(pop, tmp);
    
        int i, j, p;
    
        for(j=0; j <= 7; j++)
        {
            for(i=0; i <= 11 ; i++)
            {
    
                p = count(pop, j, i); //Angrenzende Zellen
    
                if(p == 3) tmp[j] [i] = 1;
                else if(p < 2 || p > 3) tmp[j][i] = 0;
    
            }
        }
    
        copyarray(tmp, pop);
    
        //Ausgabe
        for(j=0; j <= 7; j++)
        {
            for(i=0; i <= 11 ; i++)
            {
                if(pop[j] [i] == 1) printf("#");
                else printf(".");
            }
            printf("\n");
        }
    
        return 0;
    }
    

    Das problem: Der zähler klappt nicht richtig, ich bekomm falsche werte für manche felder. ( z.b. fürs feld ganz links oben bekomm ich 2 angrenzende bewohner, statt 3, die kommentarstriche zeigen welche nachbarn der erste hat)

    (wir sollen das ganze so entwickeln, dass die ränder zyklisch zusammenhängen.

    Um auch fur die Zellen am Rand des Gitters acht Nachbarn zu erhalten, setzen wir eine
    zyklische Fortsetzung des Gitters voraus, d.h. die Indizes i sind modulo gx, die Indizes j
    sind modulo gy zu zahlen. Anschaulich bedeutet Zyklizitat in x-Richtung, dass der linke
    und der rechte Rand des Gitters verklebt werden, indem man das Gitter zu einem senkrecht
    stehenden "Rohr" verbiegt, und die Zyklizitat in y-Richtung erhalt man, indem man das
    untere und obere Ende des Rohres zusammenfuhrt. Insgesamt ergibt sich also ein Torus.

    fertigen Code hätte ich zwar im netz gefunden, aber bei allem was ich gefunden habe war eben der letzte punkt ( die zyklizität) nicht mit drin, und ich denke, der teil macht mir probleme 😕



  • Bei copyarray(pop, tmp); kopierst du von tmp nach pop.
    Da steht im Prinzip pop = tmp; wenn es ginge.

    Dann schau mal nach wann und wie du copyarray() benutzt



  • is doch im zweiten schritt auch so gedacht? Ich kopier erst ( vorm zählen/streichen) den inhalt aus pop nach tmp und später dann aus tmp nach pop, muss ich doch so machen?



  • In Zeile 60 kopierst du von tmp (in dem noch nichts/zufälliges steht) nach pop.
    Du überschreibst da deine Daten.



  • irgendwie nicht? ich übergeb pop als erstes und tmp als zweites, udn die funktion kopiert aus dem ersten ins zweite?

    udn der teil klappt ja auch, das problem liegt irgendwo in dem abschnitt, wo die benachbarten 1en gezählt werden.

    dazu von mir von woanders:

    2: benutz codeblocks und bin schon 1 für 1 die zählfunktion durchgegangen, udn weiß auch wo nicht richtig gezählt wird (z.B. bei if(pop[j%8] [(i-1)%12] == 1) p++; da bleibt p nämlich gleich, obwohl da einer erhöht werden müsste ( und mri fällt grad auf, dass die kommentarstriche falsch gesetzt sind, ich editiers eben)

    edit:

    grad bemerkt, +1 bekomm ich bei

    if(pop[(j+1)%8] [i%12] == 1) p++;
    if(pop[(j+1)%8] [(i-1)%12] == 1) p++;

    die sidn ja für das ganz links oben erstrecht falsch oO

    für

    if(pop[(j-1)%8] [(i%12)] == 1) p++; //
    if(pop[(j-1)%8] [(i-1)%12] == 1) p++; //

    bekomm ich nix.

    aja, das problem ist scheinbar nur die linke seite... der rest der ausgabe stimmt nämlich nach dem 1. durchlauf. nur da hab ich auch in der 3. zeile 1. spalte ne 1, aber laut aufgabenblatt muss da ne 0 hin. ( außerdem 1. zeile p = 2 statt 3)

    edit: ok, scheint gewesen zu sein, dass gcc i-was mit dem modulo falsch hat... wenn ich bei den -1 +8 bzw +12 addiere, also den mod von der positven zahl hab gehts... wundert mich nur, weil wolframalpha für -1mod8 7 ausgegeben hat, damit hab ichs nämlich getestet, weil ich mir bei -1mod8 nicht sicher war...



  • Stimmt. Google sagt auch -1 mod 8 wäre 7 ... Aber bei gcc ist (-1) % 8 = -1 ?!

    EDIT:
    http://gcc.gnu.org/bugzilla/show_bug.cgi?id=37015 (-a)%b wird zu -(a%b) 💡
    Der Operator % ist nicht der modulo operator, sondern der "Rest operator" (Remainder Operator).

    EDIT2
    Habe mal ein bisschen was probiert, das hier liefert das "echte" Modulo (falls man es mal braucht :D) :

    i < 0 ? (8 + (i % 8)) % 8  : i%8
    


  • jo, nja, so gehts ja jetzt... hat mich nur 2 stunden blöd gucken gekostet...



  • pyhax schrieb:

    EDIT2
    Habe mal ein bisschen was probiert, das hier liefert das "echte" Modulo (falls man es mal braucht :D) :

    i < 0 ? (8 + (i % 8)) % 8  : i%8
    

    Hmm.
    Im Vorliegenden Fall gehts auch viel kleiner. Weil i nur bis -1 runter geht. Mit +8 absichern, daß keine negative Zahl gemodult wird.

    (i+8)%8
    


  • Naja. Im vorliegenden Fall. Man kann auch einfach solange +8 rechnen, bis eine Zahl größer 0 rauskommt 😃



  • pyhax schrieb:

    Naja. Im vorliegenden Fall. Man kann auch einfach solange +8 rechnen, bis eine Zahl größer 0 rauskommt 😃

    Du bist schon wieder aus dem Kontext.
    Im "Problem game of Life" wäre angemessen

    pyhax von volkard gebesserwissert schrieb:

    Naja. Im vorliegenden Fall. Man kann auch einfach (Gegebenenfalls) +8 rechnen, damit (falls nötig) eine Zahl größer 0 rauskommt 😃

    Also if statt while.

    Das if sparte ich mir und die Bedingung in Klammern.



  • Es ist kein Bug. Der Compiler entscheidet sich halt für eine der Lösungsmöglichkeiten. Also entweder positiven oder negativen Rest.

    Hier ist das ganze Problem beschrieben:
    http://de.wikipedia.org/wiki/Division_mit_Rest

    Wenn es die Aufgabe nur den positiven Rest zur Lösung zulassen kann, muss der Quelltext halt entsprechend ergänzt werden.

    Auch andere Compiler verhalten sich wie der gcc. Ob alle?


Anmelden zum Antworten