Hilfe bei einem Programm



  • Hallo Community,

    Ich habe mal wieder durchgegoogelt und habe diesen Quellcode gefunden. Dieser Code passt in mein eigenes Programm super rein, da ich genau das gebraucht habe. Nur habe ich ein Problem. Ich weis nicht wie ich da etwas reinzeichne, wie z.B. Umrisse mit "-" oder mit "|". Kann mir da jemand helfe?

    Ich Programmiere mit c++ mit dem Devcpp Compiler.

    Der Quellcode:

    #include <cstdio>
    #include <conio.h>
    #include <windows.h>

    const int KEY_UP = 0x48;
    const int KEY_DOWN = 0x50;
    const int KEY_LEFT = 0x4b;
    const int KEY_RIGHT = 0x4d;
    const int KEY_ESCAPE = 0x1b;

    const int CONSOLE_WIDTH = 80;
    const int CONSOLE_HEIGHT = 25;

    enum color
    {
    black,
    darkblue,
    darkgreen,
    darkcyan,
    darkred,
    darkpurple,
    darkgray,
    darkwhite,
    gray,
    blue,
    green,
    cyan,
    red,
    purple,
    yellow,
    white
    };

    ////////////////////////////////////////////////////////////////////
    // sets the cursor position
    ////////////////////////////////////////////////////////////////////
    void gotoxy(int x, int y)
    {
    COORD point;
    point.X = x;
    point.Y = y;
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), point);
    }

    ////////////////////////////////////////////////////////////////////
    // clears the screen
    ////////////////////////////////////////////////////////////////////
    void clrscr()
    {
    CONSOLE_SCREEN_BUFFER_INFO csbi;
    DWORD bufferSize, charsWritten;

    COORD topleft = {0, 0};
    HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);

    GetConsoleScreenBufferInfo(hConsole, &csbi);
    bufferSize = csbi.dwSize.X * csbi.dwSize.Y;
    FillConsoleOutputCharacter(hConsole, TEXT(' '), bufferSize, topleft, &charsWritten);
    GetConsoleScreenBufferInfo(hConsole, &csbi);
    FillConsoleOutputAttribute(hConsole, csbi.wAttributes, bufferSize, topleft, &charsWritten);
    SetConsoleCursorPosition(hConsole, topleft);
    }

    ////////////////////////////////////////////////////////////////////
    // sets foreground and background color
    ////////////////////////////////////////////////////////////////////
    void setcolor(int colorBack, int colorFore)
    {
    int back = 0;
    if (colorBack & 1) back |= BACKGROUND_BLUE;
    if (colorBack & 2) back |= BACKGROUND_GREEN;
    if (colorBack & 4) back |= BACKGROUND_RED;
    if (colorBack & 😎 back |= BACKGROUND_INTENSITY;

    int fore = 0;
    if (colorFore & 1) fore |= FOREGROUND_BLUE;
    if (colorFore & 2) fore |= FOREGROUND_GREEN;
    if (colorFore & 4) fore |= FOREGROUND_RED;
    if (colorFore & 😎 fore |= FOREGROUND_INTENSITY;

    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), back | fore);
    }

    ////////////////////////////////////////////////////////////////////
    // clamps a value between min/max
    ////////////////////////////////////////////////////////////////////
    template<typename T>
    T clamp(const T& min, const T& max, const T& value)
    {
    return (value < min ? min : value > max ? max : value);
    }

    ////////////////////////////////////////////////////////////////////
    // draws a message centered
    ////////////////////////////////////////////////////////////////////
    void centerText(const char *message, int ypos)
    {
    int len = strlen(message);
    if (len > 0)
    {
    int xpos = (CONSOLE_WIDTH - len) / 2;
    gotoxy(xpos, ypos);
    printf(message);
    }
    }

    int main()
    {
    bool exit = false;
    int x = 0;
    int y = 0;

    do
    {
    setcolor(darkblue, yellow);
    centerText("use arrow keys to move or escape to exit...", CONSOLE_HEIGHT-1);

    setcolor(black, green);
    gotoxy(x, y);
    printf("@");

    int key = _getch();
    if (!key || key == 0xe0)
    key = _getch();

    switch (key)
    {
    case KEY_LEFT: --x; break;
    case KEY_RIGHT: ++x; break;
    case KEY_UP: --y; break;
    case KEY_DOWN: ++y; break;
    case KEY_ESCAPE: exit = true; break;
    }

    x = clamp(0, CONSOLE_WIDTH-1, x);
    y = clamp(0, CONSOLE_HEIGHT-2, y);

    clrscr();

    } while (!exit);
    }

    Mit freundlichen Grüßen
    Sincap



  • for (int i = 0; i < width; ++i) putchar('c');
    

    ?



  • philipp2100 schrieb:

    for (int i = 0; i < width; ++i) putchar('c');
    

    Ja so kann ich etwas einzeichnen, aber in diesem Fall kommen alle c an den Anfang. Also ich wenn ich i = 20 mache kommt es trotz allem von 0 bis ende
    Habe es da eingefügt:

    int main()
    {
        bool exit = false;
        int x = 0;
        int y = 0;
            centerText("@", CONSOLE_HEIGHT-3);
    		centerText("@", CONSOLE_HEIGHT-2);
        do
        {
           // setcolor(darkblue, yellow);
    
            setcolor(black, green);
            gotoxy(x, y);
            printf("@");
    
    		int key = _getch();
            if (!key || key == 0xe0)
                key = _getch();
    
            switch (key)
            {
            case KEY_LEFT: --x; break;
            case KEY_RIGHT: ++x; break;
            case KEY_UP: --y; break;
            case KEY_DOWN: ++y; break;
            case KEY_ESCAPE: exit = true; break;
            }
    
            x = clamp(0, CONSOLE_WIDTH-1, x);
            y = clamp(0, CONSOLE_HEIGHT-2, y);
    
            clrscr();
    
    for (int i = 20; i < CONSOLE_WIDTH ; ++i) putchar('c');
    
        } while (!exit);
    }
    


  • Damit lässt du auch nur die Schleife 20 Durchläufe weniger machen und damit 20 Zeichen weniger drucken. In dem Fall brauchst du:

    int lspace = 20;
    for (int i = 0; i < lspace; ++i) putchar(' ');
    for (int i = 0; i < width - lspace; ++i) putchar('c');
    


  • philipp2100 schrieb:

    Damit lässt du auch nur die Schleife 20 Durchläufe weniger machen und damit 20 Zeichen weniger drucken. In dem Fall brauchst du:

    int lspace = 20;
    for (int i = 0; i < lspace; ++i) putchar(' ');
    for (int i = 0; i < width - lspace; ++i) putchar('c');
    

    Kannst du mir das näher erklären, ich verstehe es nicht recht.



  • Das sind zwei Schleifen, die nacheinander ausgeführt werden, mehr zu for-Schleifen kannst du hier nachlesen:
    http://www.cpp-tutor.de/cpp/le05/for.html

    Davor wird noch eine Variable deklariert und mit dem Wert 20 belegt. Dort soll die Größe des linken Randes (in Zeichen) gespeichert werden, in deinem Fall also 20.
    Dann läuft die erste Schleife 20 Mal durch und gibt je ein Leerzeichen aus.
    Nach der zweiten Zeile stehen dort jetzt also 20 Leerzeichen.
    Anschließend läuft die zweite Schleife (dritte Zeile) (width - 20) Mal durch und gibt je ein c aus, nun hast du also insgesamt 20 Leerzeichen gefolt von (width - 20) c's, insgesamt also width Zeichen.
    Wenn du lspace auf einen anderen Wert kleiner oder gleich 20 setzt, wird der Rand größer oder kleiner (es werden mehr oder weniger Leerzeichen ausgegeben), insgesamt hast du aber immer width Zeichen. Jetzt klar?

    Um eine neue Zeile zu beginnen, verwende die Anweisung putchar('\n');
    Das \n-Zeichen ist in C ein besonderes Zeichen, das einen Zeilenumbruch bewirkt.



  • Sincap80 schrieb:

    philipp2100 schrieb:

    Damit lässt du auch nur die Schleife 20 Durchläufe weniger machen und damit 20 Zeichen weniger drucken. In dem Fall brauchst du:

    int lspace = 20;
    for (int i = 0; i < lspace; ++i) putchar(' ');
    for (int i = 0; i < width - lspace; ++i) putchar('c');
    

    Kannst du mir das näher erklären, ich verstehe es nicht recht.

    Wie kann es sein das am 14.10.2013 solche Grundlegenden Dinge noch unklar sind, wo wir bereits
    vor Tagen mit Sincap80 viel kompliziertere Dinge besprochen hatten? 😕

    http://www.c-plusplus.net/forum/320735

    oder auch in anderen Foren

    http://www.spieleprogrammierer.de/18-c-cplusplus-csharp-java-und-andere-sprachen/21261-hilfe-bei-einem-programm-cursor-bewegen-auf-der-console/



  • Evtl. auch kopiert? Mich wunderts auch..


Anmelden zum Antworten