Langtons Ameise



  • Nabend!
    Ich habe ein Programm geschrieben, dass quasi eine Ameise über ein Spielfeld laufen lässt. Das ganze soll so ablaufen, dass man die Länge des (quadratischen) Spielfelds eingibt sowie die Anzahl der Schritte, die die Ameise laufen soll.
    Die Ameise startet dabei in Spielfeldmitte und sieht nach unten.

    Leider mache ich irgendwo einen Fehler, der so unauffällig ist, dass er mir nicht auffällt. Hier erstmal der Code:

    int main ()
    {
      int laenge;
      printf ("Groesse Spielfeld: ");
      scanf ("%d", &laenge);
      if (laenge < 1)
      {
        printf ("Zu klein!\n");
        return 9997;
      }
      printf ("\n");
    
      int anzSchritte;
      printf ("Anzahl Schritte: ");
      scanf ("%d", &anzSchritte);
      if (anzSchritte < 1)
      {
        printf ("Zu klein!\n");
        return 9998;
      }
      printf ("\n");
    
      struct Ameise krabbler = {laenge/2, laenge/2, 2};
      struct Ameise* krabblerZeiger = &krabbler;
    
      char raster[laenge][laenge];
      initArea (laenge, raster);
      showArea (laenge, raster);
    
      for(int i = 0; i < anzSchritte; i++)
      {
          nextStep(krabblerZeiger, laenge, raster);
      }
      showArea (laenge, raster);
    
      return 0;
    }
    

    Die Regeln: Steht die Ameise auf einem leeren Feld, wird es schwarz (#), sie dreht sich nach rechts und geht einen Schritt vor. Steht sie auf einem schwarzen, wird es weiß (Leerstelle), sie dreht sich nach links und geht wieder einen Schritt vor.
    Irgendwo hier sollte der Fehler liegen, da kein # im Spielfeld sichtbar wird. 😕

    struct Ameise
    {
        int x;
        int y;
        int blick; // oben: 0, rechts: 1, unten: 2, links: 3
    };
    
    int nextStep(struct Ameise* meineAmeise, int len, char meinRaster[][len])
    {
        if(meinRaster[meineAmeise->y][meineAmeise->x] == ' ')
        {
            meinRaster[meineAmeise->y][meineAmeise->x] = '#';
            meineAmeise->blick = (meineAmeise->blick +1) %4;
        }
        if(meinRaster[meineAmeise->y][meineAmeise->x] == '#')
        {
            meinRaster[meineAmeise->y][meineAmeise->x] = ' ';
            meineAmeise->blick = (meineAmeise->blick +3) %4;
        }
    
        if(meineAmeise->blick == 0) meineAmeise->y = meineAmeise->y+1;
        if(meineAmeise->blick == 1) meineAmeise->x = meineAmeise->x+1;
        if(meineAmeise->blick == 2) meineAmeise->y = meineAmeise->y-1;
        if(meineAmeise->blick == 3) meineAmeise->x = meineAmeise->x-1;
    
        return 0;
    }
    

    initArea füllt das Spielfeld mit Leerstellen, showArea gibt das Spielfeld aus

    void initArea(int len, char feld[][len])
    {
        for(int i = 0; i < len; i++)
        {
            for(int j = 0; j < len; j++)
            {
                feld[i][j] = ' ';
            }
        }
    }
    
    void showArea(int len, char feld[][len])
    {
        printf("+");
        for(int i = 0; i < len; i++) printf("-");
        printf("+\n");
    
        for(int j = 0; j < len; j++)
        {
            printf("|");
            for(int k = 0; k < len; k++)
            {
                printf("%c", feld[j][k]);
            }
            printf("|\n");
        }
    
        printf("+");
        for(int i = 0; i < len; i++) printf("-");
        printf("+\n\n");
    
    }
    


  • if(meinRaster[meineAmeise->y][meineAmeise->x] == ' ')
        {
            meinRaster[meineAmeise->y][meineAmeise->x] = '#';
            meineAmeise->blick = (meineAmeise->blick +1) %4;
        }
        if(meinRaster[meineAmeise->y][meineAmeise->x] == '#')
        {
            meinRaster[meineAmeise->y][meineAmeise->x] = ' ';
            meineAmeise->blick = (meineAmeise->blick +3) %4;
        }
    

    Evtl. ein else if ?



  • Ah, na klar! 😮
    Danke 😃



  • Denkst du, dass du dir SO auch die 3 Bonuspunkte verdienen kannst? Die RUB sieht alles 😃


Anmelden zum Antworten