Windows 7 Console Steuerzeichen verwenden?



  • Hi Leute,
    ich arbeite momentan mit dem Buch:
    C++ Lernen und Professionell anwenden. Da bin ich gerade an einer Beispielaufgabe und komme nicht weiter. Bei mir kommen bei dem Programm nur komische Zahlen eigentlich sollte man jedoch einen Ball Springen sehen. Im Buch steht,dass man für Win XP den Treiber ANSI.SYS laden muss bloß wie geht das? Und geht das auch bei Win 7?

    Hier mal der Quellcode

    //  ball1.cpp
    //  Simuliert einen springenden Ball
    //  Hinweis: Programm mit Strg+C beenden.
    //  --------------------------------------------------
    //  Damit die Steuerzeichen wirksam sind, muß ein
    //  entsprechender Bildschirmtreiber geladen sein.
    //  Unter Windows 9x geschieht dies durch folgende
    //  Zeile in der Datei CONFIG.SYS:
    //         DEVICE = C:\Windows\Command\Ansi.sys
    // ---------------------------------------------------
    
    #include <iostream>
    #include <string>
    using namespace std;
    
    #define DELAY  10000000L             // Verzögerung
    #define CLS   (cout << "\033[2J")    // Bildschirm löschen
    #define LOCATE(z,s) (cout <<"\033["<< z <<';'<< s <<'H')
            // Cursor in Zeile z und Spalte s positionieren
    
    int main()
    {
       int x = 2, y = 3, dx = 1, geschw = 0;
       string boden(79, '-'),
              header = "****  SPRINGENDER BALL  ****";
    
       CLS;
       LOCATE(1,25);  cout << header;
       LOCATE(25,1);  cout << boden;
    
       while(true)      // Ball "immer" springen lassen
       {
         LOCATE(y,x);
         cout << 'o' << endl;              // Ball anzeigen
         for( long warten = 0; warten < DELAY; ++warten)
           ;
         if(x == 1 || x == 79) dx = -dx;   // An einer Wand?
         if( y == 24 )                     // Am Boden?
         {
           geschw = - geschw;
           if( geschw == 0 ) geschw = -7;  // Neu anstossen
         }
         geschw += 1;                 // Beschleunigung = 1
    
         LOCATE(y,x); cout <<  ' ';   // Anzeige löschen
         y += geschw;  x += dx;       // Neue Position
       }
    }
    

    gruß
    Shouu



  • Ich hab Dir mal für Windows die Funktionen zum Bildschirmlöschen und zur Cursorpositionierung mittels Windows-Konsole-Funktionen reingeschrieben, damit funktioniert es:

    //  ball1.cpp
    //  Simuliert einen springenden Ball
    //  Hinweis: Programm mit Strg+C beenden.
    //  --------------------------------------------------
    //  Damit die Steuerzeichen wirksam sind, muß ein
    //  entsprechender Bildschirmtreiber geladen sein.
    //  Unter Windows 9x geschieht dies durch folgende
    //  Zeile in der Datei CONFIG.SYS:
    //         DEVICE = C:\Windows\Command\Ansi.sys
    // ---------------------------------------------------
    
    #include <windows.h>
    #include <iostream>
    #include <string>
    using namespace std;
    
    #define DELAY  10000000L             // Verzögerung
    #define CLS   clearScreen()    // Bildschirm löschen
    // #define LOCATE(z,s) (cout <<"\033["<< z <<';'<< s <<'H')
            // Cursor in Zeile z und Spalte s positionieren
    
    void clearScreen(WORD attribute = 7)
    {
        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), attribute,
                                                csbi.dwSize.X * csbi.dwSize.Y,
                                                target, &written);
    }
    
    void LOCATE(int z, int s)
    {
        COORD pos = {s, z};
    
        SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
    }
    
    int main()
    {
       int x = 2, y = 3, dx = 1, geschw = 0;
       string boden(79, '-'),
              header = "****  SPRINGENDER BALL  ****";
    
       CLS;
       LOCATE(1,25);  cout << header;
       LOCATE(25,1);  cout << boden;
    
       while(true)      // Ball "immer" springen lassen
       {
         LOCATE(y,x);
         cout << 'o' << endl;              // Ball anzeigen
         for( long warten = 0; warten < DELAY; ++warten)
           ;
         if(x == 1 || x == 79) dx = -dx;   // An einer Wand?
         if( y == 24 )                     // Am Boden?
         {
           geschw = - geschw;
           if( geschw == 0 ) geschw = -7;  // Neu anstossen
         }
         geschw += 1;                 // Beschleunigung = 1
    
         LOCATE(y,x); cout <<  ' ';   // Anzeige löschen
         y += geschw;  x += dx;       // Neue Position
       }
    }
    


  • hehe, sehr cool 🙂

    vielen Dank^^



  • Hallo Belli,

    ich habe heute aufgrund Deiner Hilfe in dem o.a. Beitrag, nach Tagen auch mein Problem mit dieser Aufgabe gelöst.

    Deshalb möchte auch ich Dir ganz herzlich danken.

    Viele Grüsse von

    boabdil 😃 😃 😃 😃


Log in to reply