Zwei Strings nebeneinander?



  • Hallo Leute!

    Ich arbeite an einem Poker-Programm in C und muss darum mehrere Karten gleichzeitig darstellen lassen.

    Jetzt hat der Spieler zum Beispiel ein Karo-4 und ein Treff-2:

    char t2[] = '+---------+\n| \x05 |\n| |\n| |\n| |\n| |\n| |\n| \x05 |\n+---------+\n\n\n';
    
    char t2[] = '+---------+\n|       \x05 |\n|         |\n|         |\n|         |\n|         |\n|         |\n| \x05       |\n+---------+\n\n\n';
    

    Wie könnte ich diese beiden Karten nebeneinander darstellen lassen?

    Etwa so:
    http://oi47.tinypic.com/2pzxz5f.jpg

    Hinweis: Die Karten werden zufällig ausgewählt...
    Es wäre zu aufwändig alle Kombinationen selber zu designen...

    Irgend welche Vorschläge? 🙂

    Lg Rogon



  • Hier noch mal die Karten-Codes:

    char k4[] = '+---------+\n| \x04     \x04 |\n|         |\n|         |\n|         |\n|         |\n|         |\n| \x04     \x04 |\n+---------+\n\n\n';
    
    char t2[] = '+---------+\n|       \x05 |\n|         |\n|         |\n|         |\n|         |\n|         |\n| \x05       |\n+---------+\n\n\n';
    


  • Wie könnte ich diese beiden Karten nebeneinander darstellen lassen?

    Erst von beiden Karten die erste Zeile, dann von beiden Karten die zweite Zeile usw.



  • Bashar schrieb:

    Erst von beiden Karten die erste Zeile, dann von beiden Karten die zweite Zeile usw.

    Das wäre natürlich eine Idee, die leider nicht realisierbar ist, da die Karten zufällig ausgewählt werden und es wäre zu aufwändig alle Kombinationen selber zu designen...



  • Rogon schrieb:

    Bashar schrieb:

    Erst von beiden Karten die erste Zeile, dann von beiden Karten die zweite Zeile usw.

    Das wäre natürlich eine Idee, die leider nicht realisierbar ist

    Aber selbstverständlich ist das realisierbar.

    da die Karten zufällig ausgewählt werden

    Vollkommen egal, wie die ausgewählt werden.

    und es wäre zu aufwändig alle Kombinationen selber zu designen...

    Wer sagt was von selber designen?



  • Wer sagt was von selber designen?

    Du hast etwas vor 😉

    Was ist der Plan?



  • Du suchst aus der ersten Karte die erste Zeile raus, gibst sie aus. Dann ein paar Leerzeichen. Dann tust du dasselbe für erste Zeile der zweiten Karte. Und so weiter. Das kann man problemlos auf beliebig viele Karten ausweiten. Funktion etwa so:

    void schreibNebeneinander(const char *karten[], int anzahlKarten, int zwischenraum)
    {
      // Implementation: Deine Aufgabe
    }
    


  • Speicher eine Karte nicht so wie Du:

    char t2[] = "Alle Zeilen hintereinander in einem C-String\n";
    

    sondern so:

    char t2[11][] = {"Zeile1", "Zeile2", "Zeile3", ..., "Zeile11"};
    

    dann hat jede Karte 11 Zeilen, die Du schön nach Bashars Vorschlag ausgeben kannst.



  • Ich dachte eigentlich schon daran, jeweils bis zum nächsten '\n' zu scannen.



  • Naja, ich hätte in den einzelnen Zeilen gar keinen Zeilenvorschub und würde dann einfach via WinAPI meine Schreibposition bestimmen und ausgeben. Dann könnte ich sogar jede Karte einzeln ganz ausgeben und trotzdem beliebig viele nebeneinander oder wohin auf die Konsole auch immer darstellen.



  • Ungefähr so:

    #include <windows.h>
    
    void SetWindowExt(int x, int y, int yMulti = 1)
    {
        SMALL_RECT sr_window = {0, 0, x - 1, y - 1};
        COORD      extension;
        CONSOLE_SCREEN_BUFFER_INFO csbi;
    
        GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi);
    
        extension.X = max(x, csbi.dwMaximumWindowSize.X);
        extension.Y = max(y, csbi.dwMaximumWindowSize.Y);
    
        SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE), extension);
        SetConsoleWindowInfo(GetStdHandle(STD_OUTPUT_HANDLE), TRUE, &sr_window);
    
        extension.X = x;
        extension.Y = y * yMulti;
        SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE), extension);
    }
    
    void ClearScreen(void)
    {
        CONSOLE_SCREEN_BUFFER_INFO csbi;
        COORD target = {0, 0};
        DWORD written;
    
        GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi);
        FillConsoleOutputCharacter(GetStdHandle(STD_OUTPUT_HANDLE), ' ',
                                                csbi.dwSize.X * csbi.dwSize.Y,
                                                target, &written);
        FillConsoleOutputAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7,
                                                csbi.dwSize.X * csbi.dwSize.Y,
                                                target, &written);
    }
    
    void DruckSimpleText(int x, int y, char const *text)
    {
        COORD target = {x, y};
        DWORD written;
    
        WriteConsoleOutputCharacter(GetStdHandle(STD_OUTPUT_HANDLE), text,
                                                strlen(text),
                                                target, &written);
    }
    
    int main()
    {
    	ClearScreen();
    	SetWindowExt(40, 30);
    	DruckSimpleText(2, 8, "Zeile1");
    	DruckSimpleText(7, 3, "Zeile2");
    	DruckSimpleText(4, 6, "Zeile3");
    }
    


  • Wow, danke Belli!! 😃

    Dein Code ist wirklich sehr hilfreich!
    Danke für deine Mühe, ich kann den Code wirklich sehr gut gebrauchen! 👍
    Mal schauen, ob ich mein Projekt jetzt realisieren kann! 😉

    Lg Rogon


Anmelden zum Antworten