Spielkarten zeichnen mit ASCII Zeichen



  • Hallo.

    Ich hab die Aufgabe Spielkarten zu "zeichnen" in C mit ASCII Zeichen. Nun dachte ich mir: einfach printf und gib ihm, aber das war wohl nicht die Intention meines Aufgabengebers.

    Er sagte ich solle es über funktionen mit switch case und putf und schleifen lösen, jedoch weiß ich nicht wie ich das anstellen soll..

    Hat jemand einen Rat wie ich das ganze auf die Beine stellen soll? Ihr braucht mir keinen fertigen Code schicken, einfach nur ein paar Ansätze wie das mit switch case und putf bzw. schleifen möglich ist.

    Tut mir leid, euch mit so einer belanglosen und für euch wahrscheinlich einfachen Aufgabe zu belästigen, aber ich bin absoluter Programmier Anfänger.

    Die Konsole soll diese Karte (ein Ass^^) ausgeben, die Punkte sind Leerzeichen:

    http://fs5.directupload.net/images/160803/temp/khuu7lhr.png



  • SeppJ schrieb:

    Wenn du Code hier im Forum zeigst, dann guckt sich vielleicht auch jemand dein Problem an.

    Wenn ich einen Code hätte^^ Ich habe momentan keine Idee wie ich das machen soll... mein Wissensstand ist ziemlich gering. Ich bräuchte nur ein paar Ratschläge wie man das auf die Beine stellt. Wie gesagt ein paar gute Tipps würden mir reichen, braucht ja nicht gleich der fertige Code sein.


  • Mod

    Ahh, da ist das gewünschte Ergebnis hinter dem Link. Du kannst auch hier im Forum ASCII-Art machen, das erhöht die Sichtbarkeit enorm, denn einem Link zu folgen ist für den Leser eine große Hürde. Siehe meinen vorherigen Kommentar (leider versehentlich gelöscht), der zustande kam, weil ich bewusst dem Link nicht gefolgt bin.

    ."".    ."",
         |  |   /  /
         |  |  /  /
         |  | /  /
         |  |/  ;-._ 
         }  ` _/  / ;
         |  /` ) /  /
         | /  /_/\_/\
         |/  /      |
         (  ' \ '-  |
          \    `.  /
           |      |
           |      |
    

    Zum Problem: Du musst das Aussehen der Karte zeilenweise beschreiben. Ich fange mal an:

    • Die erste Zeile sind (zu faul zum zählen) '#'.
    • Die zweite Zeile geht mit "#." los. Dann kommt der Kartenwert. Dann 5 '.'. Dann der Kartenwert. Dann ".#".
    • Die dritte Zeile geht mit '#' los. Dann kommen (zu faul zum zählen) '.'. Dann '#'
    • Die vierte Zeile ist wie die dritte.
    • ...

    Kannst du das in Code fassen?

    Bei mehr Karten wird das komplizierter, aber nicht unmöglich. Es böte sich aber an, stattdessen ein 2D-Array von chars zu definieren, in das man rein"zeichnet" und dann hinterher das fertige Feld ausgibt. Dann muss man nicht zeilenweise denken, sondern eher so, wie ein Mensch die Karte malen würde, was wesentlich leichter fallen dürfte:

    • Fülle alles mit '.'
    • Setze den Rand auf '#'
    • Setze die Ecken auf den Kartenwert
    • Zeichne die Kartensymbole ein


  • Ja, ich habe auch den Vorschlag gemacht, es mit Feldern zu machen, jedoch sollte ich es eben nicht so machen (leider)^^

    Könntest du mir den Quellcode von dem Peace-Finger zeigen? Würde mal gerne sehen, wie das gelöst ist.


  • Mod

    david1234 schrieb:

    Könntest du mir den Quellcode von dem Peace-Finger zeigen? Würde mal gerne sehen, wie das gelöst ist.

    Das ist kein computergeneriertes Bild. Es dient der Demonstration, wie du dein Bild hier im Forum hättest schön zeigen können.

    Ja, ich habe auch den Vorschlag gemacht, es mit Feldern zu machen, jedoch sollte ich es eben nicht so machen (leider)^^

    Das klingt in deinem ersten Beitrag aber noch ganz anders.



  • SeppJ schrieb:

    Ahh, da ist das gewünschte Ergebnis hinter dem Link. Du kannst auch hier im Forum ASCII-Art machen, das erhöht die Sichtbarkeit enorm, denn einem Link zu folgen ist für den Leser eine große Hürde. Siehe meinen vorherigen Kommentar (leider versehentlich gelöscht), der zustande kam, weil ich bewusst dem Link nicht gefolgt bin.

    ."".    ."",
         |  |   /  /
         |  |  /  /
         |  | /  /
         |  |/  ;-._ 
         }  ` _/  / ;
         |  /` ) /  /
         | /  /_/\_/\
         |/  /      |
         (  ' \ '-  |
          \    `.  /
           |      |
           |      |
    

    Zum Problem: Du musst das Aussehen der Karte zeilenweise beschreiben. Ich fange mal an:

    • Die erste Zeile sind (zu faul zum zählen) '#'.
    • Die zweite Zeile geht mit "#." los. Dann kommt der Kartenwert. Dann 5 '.'. Dann der Kartenwert. Dann ".#".
    • Die dritte Zeile geht mit '#' los. Dann kommen (zu faul zum zählen) '.'. Dann '#'
    • Die vierte Zeile ist wie die dritte.
    • ...

    Kannst du das in Code fassen?

    Bei mehr Karten wird das komplizierter, aber nicht unmöglich. Es böte sich aber an, stattdessen ein 2D-Array von chars zu definieren, in das man rein"zeichnet" und dann hinterher das fertige Feld ausgibt. Dann muss man nicht zeilenweise denken, sondern eher so, wie ein Mensch die Karte malen würde, was wesentlich leichter fallen dürfte:

    • Fülle alles mit '.'
    • Setze den Rand auf '#'
    • Setze die Ecken auf den Kartenwert
    • Zeichne die Kartensymbole ein

    viel zu kompliziert.
    nimm einfach nen texteditor und "male" deine karte.
    dann packst du sie zeilenweise per copy+paste in printf-anweisungen.
    wichtig: monospace-font einstellen.



  • swapper schrieb:

    viel zu kompliziert.
    nimm einfach nen texteditor und "male" deine karte.
    dann packst du sie zeilenweise per copy+paste in printf-anweisungen.
    wichtig: monospace-font einstellen.

    David1234 schrieb:

    Ich hab die Aufgabe Spielkarten zu "zeichnen" in C mit ASCII Zeichen. Nun dachte ich mir: einfach printf und gib ihm, aber das war wohl nicht die Intention meines Aufgabengebers.



  • SG1 schrieb:

    swapper schrieb:

    viel zu kompliziert.
    nimm einfach nen texteditor und "male" deine karte.
    dann packst du sie zeilenweise per copy+paste in printf-anweisungen.
    wichtig: monospace-font einstellen.

    David1234 schrieb:

    Ich hab die Aufgabe Spielkarten zu "zeichnen" in C mit ASCII Zeichen. Nun dachte ich mir: einfach printf und gib ihm, aber das war wohl nicht die Intention meines Aufgabengebers.

    ach herrje. 😞



  • David1234 schrieb:

    Er sagte ich solle es über funktionen mit switch case und putf und schleifen lösen, jedoch weiß ich nicht wie ich das anstellen soll..

    sowas in der richtung?

    void Karte_Zeichnen(char typ)
    {
        int i;
        int j;
    
        for(i=0;i<hoehe;i++)
        {
    
            //erste oder letzte zeile
            if(i==0||i==8)
            {
                //rahmen zeichnen
                for(j=0;j<breite;j++)
                {
                     printf("#");
                }
    
                printf("\n");
            }
    
            //zweite oder vorletzte zeile
            if(i==1 || i==7)
            {
                for(j=0;j<breite;j++)
                {
                    //Kartenwert schreiben
                    if(j==2||j==8)
                    {
                        switch(typ)
                        {
                            case '7':
                                printf("7");
                                break;
                            case '8':
                                printf("8");
                                break;
                            //case '9' usw
                        }
                    }
    
                    //Kartenrand
                    if(j==0||j==10)
                    {
                        printf("#");
                    }
    
                    //Karteninneres
                    if(j==1 || j== 9 || (j<8 &&j>2)
                    {
                        printf(".");               
                    }
                }
    
                printf("\n");
            }
    
            //alle anderen zeilen
            if(i>2&&i<7)
            {
                printf("#");
    
                for(j=0;j<9;j++)
                {
                    printf(".");
                }
    
                printf("#");
    
                printf("\n");
            }
    
        }
    }
    
    int main()
    {
        char typ;
    
        printf("Welche Karte moechten Sie zeichnen? (7,8,9,10,B,D,K,A)");
        scanf("%c",&typ);
        fflush(stdin);
    
        Karte_Zeichnen(typ);
    
        return 0;
    }
    


  • Was passiert, wenn der Anwender bei dir '10' eingibt? SCNR



  • Ja das Problem fiel mir nachher auch auf, Habs ja auch nur schnell zusammen geschrieben und dann gedacht, dass es ja mehr auf die Veranschaulichung der Schleifen etc ankommt, da ich hier ja nicht unbedingt anderer Leute Hausaufgaben machen sollte. Fehlerbehandlung kommt ja auch nicht vor.

    Aber eigentlich sollte das trotzdem funktionieren, da es ja keine 1 im Kartenspiel gibt und die 2. Ziffer damit faktisch überflüssig ist.



  • Dann wird aber nur eine '1' gezeichnet, nicht die '10'.



  • stimmt. Dann muss da wohl noch eine Fallunterscheidung durchgeführt werden.



  • HansKlaus schrieb:

    David1234 schrieb:

    Er sagte ich solle es über funktionen mit switch case und putf und schleifen lösen, jedoch weiß ich nicht wie ich das anstellen soll..

    sowas in der richtung?

    void Karte_Zeichnen(char typ)
    {
        int i;
        int j;
    
        for(i=0;i<hoehe;i++)
        {
    
            //erste oder letzte zeile
            if(i==0||i==8)
            {
                //rahmen zeichnen
                for(j=0;j<breite;j++)
                {
                     printf("#");
                }
    
                printf("\n");
            }
     
            //zweite oder vorletzte zeile
            if(i==1 || i==7)
            {
                for(j=0;j<breite;j++)
                {
                    //Kartenwert schreiben
                    if(j==2||j==8)
                    {
                        switch(typ)
                        {
                            case '7':
                                printf("7");
                                break;
                            case '8':
                                printf("8");
                                break;
                            //case '9' usw
                        }
                    }
                    
                    //Kartenrand
                    if(j==0||j==10)
                    {
                        printf("#");
                    }
    
                    //Karteninneres
                    if(j==1 || j== 9 || (j<8 &&j>2)
                    {
                        printf(".");               
                    }
                }
    
                printf("\n");
            }
    
            //alle anderen zeilen
            if(i>2&&i<7)
            {
                printf("#");
    
                for(j=0;j<9;j++)
                {
                    printf(".");
                }
    
                printf("#");
    
                printf("\n");
            }
    
        }
    }
    
    int main()
    {
        char typ;
    
        printf("Welche Karte moechten Sie zeichnen? (7,8,9,10,B,D,K,A)");
        scanf("%c",&typ);
        fflush(stdin);
    
        Karte_Zeichnen(typ);
    
        return 0;
    }
    

    Wow, danke dir.
    Genau so war das gemeint. Top!



  • Und wenn du jetzt noch switch case verwendest ...

    switch(i)
    {
    case 0:        //erste oder letzte zeile
    case 8:
    
      ...
    
      break;
    

Log in to reply