Apfelmännchen in C - Weis nicht wie ich anfangen soll :(



  • Hey Leute bin bisschen am rumprobieren...kann zwar Zeichen ausgeben, aber kriege es nicht hin, wie ich das Bild zeichnen lassen kann.

    char bild[30][30]; //30 ist nur zufällig gewählt, bin nicht sicher obs ok ist
    
    for(i=0; i<30; i++)
    	{
    		for(j=0; j<30; j++)
    		{
    			printf("%c ", bild[i][j]);
    		}
    		printf("\n");
    	}
    

    Ich wüsste aber nicht wie ich die koordinaten wieder zurückgebe, damit er das Bild zeichnen kann...
    Habt ihr eine idee??

    Danke!



  • Standardgröße des Konsolenpuffers sind 8025 Buchstabenzellen. 80 in X- und 25 in Y- Richtung. Bei den meisten neueren Konsolen kann man den auch einstellen.
    Kannst deinen Bildpuffer z.B. char bild[25][80]; deklarieren. Das printf("\n"); in Zeile 9 musst du dann weglassen, das macht die Konsole automatisch, wenn sie 80
    25 groß ist.
    In das Bild kannst du nun deine Zeichen per Koordinaten reinschreiben. Obere linke Ecke des Monitors ist dabei der Nullpunkt. X läuft nach rechts und Y nach unten.
    Da deine Y-Koordinaten von -1.2 bis 1.2 verlaufen, empfiehlt es sich, diese mit 10 multipliziert in deinem Bild abzubilden. Dann hast du also Y-Koordinaten von -12 bis 12 macht also eine Differenz von 24, passt also in deinen Bildpuffer rein.



  • @BigBrother...Danke erstmal für den Tip!!
    Ich grüble gerade wegen den Koordinaten. In der Funktion berechnung() berechne ich ja alles. Also denke ich, dass ich da die Punkte irgendwie zurück geben muss, per return und dann das Bild zeichnen kann.
    Allerdings fehlt mir dazu die idee, wie man das realisieren könnte...

    Hättest du da einen Vorschlag?



  • Du brauchst die Punkte nicht zurück zu geben. Du kannst ja gleich das Ascii-Zeichen dem Array per Koordinaten zuordnen.
    Du beginnst ja mit den Koordinaten (-2.1,-1.2).
    Diese Koordianten rechnest du so um, das dein entstehendes Bild in dein char-Array reinpasst( und ordnest der Anzahl der Iterationsschritte dein Ascii-Zeichen zu ).



  • Ok danke...ich fuchs mich da mal bisschen rein. Hoffe das ich es hinkriege:)
    Danke für die Hilfe!

    Gruß Manda



  • Hallo @BigBrother...brauch mal wieder deine hilfe...Versuche das irgendwie mit den Koordinaten hinzukriegen, aber gibt er einfach nur sterne aus.
    Ich schaffe es nicht, ein Bild darzustellen.

    Könntest du mir vielleicht ein bsp code geben, wie du es meinst, mit koordinaten zuordnen?
    Wäre sehr nett/hilfreich!
    Oder falls jemand anders eine idee hat, wie man es realisieren kann, bin ich für weitere vorschläge offen!!

    Danke schonmal!



  • Habe deinen Code ein bisschen angepasst:

    #include <stdio.h> 
    #include <stdlib.h> 
    #include <math.h> 
    
    #define XUNTEN  -2.1 
    #define XOBEN    0.6 
    #define YUNTEN  -1.2   
    #define YOBEN    1.2 
    #define XSCHRITT 0.5 
    #define YSCHRITT 0.5 
    
    #define SCHRITT 0.1
    #define YCOORD_MOVE 12
    #define XCOORD_MOVE 25
    
    struct punkt 
    { 
        double xwert; 
        double ywert; 
        double betrag; 
        int divergenz_nummer; 
    }; 
    
    void berechnung(struct punkt); 
    void print_apfelmaennchen ();
    
    char bild[25][80] = {0};
    
    int main(void) 
    {    
    	double x, y;
        for( y = YUNTEN; y <= YOBEN; y += SCHRITT )
        { 
            for( x = XUNTEN; x <= XOBEN; x += SCHRITT ) 
            { 
                struct punkt punkt = { x, y, 0, -1 }; 
                berechnung(punkt); 
            } 
        } 
    
      //  printf("divergenz_nummer_max: %d\n", divergenz_nummer_max );
    	print_apfelmaennchen ();
        return 0; 
    } 
    
    void berechnung(struct punkt punkt) 
    { 
        double xanfang = punkt.xwert; 
        double yanfang = punkt.ywert; 
        double xneu    = 0; 
        double yneu    = 0; 
        double xalt    = 0; 
        double yalt    = 0; 
        int i          = 0; 
    
       	do 
        { 
            xneu = (xalt * xalt) - (yalt * yalt) + xanfang; 
            yneu = (2 * xalt * yalt ) + yanfang; 
            i++; 
            xalt = xneu; 
            yalt = yneu; 
            punkt.betrag = sqrt( (xneu * xneu) + (yneu * yneu) ); 
            if(punkt.betrag > 2) 
            { 
                punkt.divergenz_nummer = i; 
    		   //         printf("[%3.f | %3.f]: Divergent ab Iterationsschritt: %d\n", xanfang, yanfang, i); 
    			bild [(int)(yanfang*10)+YCOORD_MOVE][(int)(xanfang*10)+XCOORD_MOVE] = i + 33;
    		} 
        } 
        while( (punkt.divergenz_nummer == -1) && (i <100) ); 
    
        if(punkt.divergenz_nummer == -1) 
        { 
       //     printf("[%3.f | %3.f]: Folge ist konvergent.\n", xanfang, yanfang); 
        } 
    }
    
    void print_apfelmaennchen ()
    {
    	int x, y;
    	for ( y = 0; y < 24; y++ )
    	{
    		for ( x = 0; x < 80; x++ )
    		{
    			putchar(bild[y][x]);
    		}
    	//	puts("");
    	}
    }
    


  • @BigBrother GROßES DANKE!!!
    Kann ich dich nochmal was fragen (wenns denn keine Umstände macht), würde es möglich sein das Apfelmännchen nur mit einen ASCII zeichen auszugeben(bsp: *)?

    Könnte ich das irgendwo angeben, dass er nur das * verwenden soll? Ist nur "nice-to-have".
    Aber ganz herzlichen DANK für deine Hilfe!!!

    /EDIT: kannst mir das " i+33 " noch mal erklären?

    bild[(int)(yanfang*10) + YCOORD_MOVE] [(int)(xanfang*10) + XCOORD_MOVE] = i + 33;
    

    Gibst du hier die ASCII zeichen aus?

    Gruß
    Manda



  • Hab das schon raus bekommen. Aber wieder eine andere Frage (hoffe das es dir nichts aus macht 🙂 )
    Ich hab das einfach so gemacht:

    bild[(int)(yanfang*10) + YCOORD_MOVE] [(int)(xanfang*10) + XCOORD_MOVE] = '1';
    

    So wird es drum herum alles mit einsen dargestellt. Kann man den teil, der dann leer bleibt mit 0 darstellen?
    Oder müsste man es wieder umschreiben? Das er es außenrum einsen schreibt und innen dann nullen.

    Ist nur nice-to-have, frage nur aus interesse!
    Danke



  • Das kriegst du schon hin. Guck mal nach, wo und unter welcher Bedingung Werte ins Array geschrieben werden und ergänze den Code.

    Gruß,
    B.B.


Anmelden zum Antworten