Koordinatensystem in der Konsole



  • Ich wollte einmal fragen ob es möglich ist, die Konsole als ein Koordinatensystem darzustellen.

    So das man per if Abfrage, ein Zeichen wie zb ein "0" im auf der x oder y Achse wandern lassen könnte.

    also im Prinzip so...

    if(a=8)
    x+1
    if(a=2)
    x-1
    if(a=4)
    y-1
    if(a=6)
    y+1

    Weiß jemand wie/ob das geht?

    mfg



  • Zusatz: ich Programmiere in Ansi C



  • Klar, jedes Terminal hat einen Bildschirmpuffer mit einer bestimmten Groesse (z.B. 80 x 25). Der Wertebereich des Koordinatensystems betraegt bei 80 x 25 Zeichen auf der X-Achse 80 Zeichen, und auf der Y-Achse 25 Zeichen. Damit kann man schon was anstellen.

    Wenn Du eine Konsolen-Bibliothek benutzt (je nach Betriebssystem und Entwicklungsumgebung unterschiedlich), dann kannst Du auch direkt einzelne Positionen auf dem Bildschirm anfahren.

    Andernfalls, also wenn Du reines, portables ANSI C programmieren willst, musst Du Annahmen ueber die Groesse des Bildschirms machen, und dann immer den Bildschirm komplett neu ausgeben (nach dem Dumb-Terminal Modell).



  • Ja ist möglich.
    Wenn ich dich richtig verstanden habe, solltest du mal die Improved Console anschaun.



  • Gibt es da irgend ein Tutorial in welchem das ein wenig beschrieben ist?

    Oder kann mir jemand die Funktion sagen, mit der man etwas an einer Bestimmten stelle ausgeben kann.



  • Welches Betriebssystem benutzt Du? Windows, Linux, MS-DOS, MacOS, etc.? Bei Windows: welche Version (95,98,ME,NT,2000,XP,Vista)?



  • http://ic.sidewindershome.net/index.php?page=gettingstarted bzw. für Anfänger besser: http://ic.sidewindershome.net/index.php?page=newbies

    Hier dann die Mover-Demo downloaden und den Quelltext ansehen
    http://ic.sidewindershome.net/index.php?page=demos

    danach sollte alles klar sein 🙂

    MfG SideWinder



  • Power Off schrieb:

    Welches Betriebssystem benutzt Du? Windows, Linux, MS-DOS, MacOS, etc.? Bei Windows: welche Version (95,98,ME,NT,2000,XP,Vista)?

    Die Kombination des Forennamens + der Nennung "Konsole" in seinem Posting lässt nur noch Win32-Konsole zu. Unter welcher Windows-Version diese ausgeführt wird ist für das Positionieren des Cursor vollkommen irrelevant.

    MfG SideWinder



  • habe Windows XP...



  • mh... das ist alles mit C++, ich Programmiere in Ansi C



  • -> Solange dein Compiler (zB MSVC) auch C++ kann ist das kein Problem, einfach nur shorties verwenden

    -> Kann er das nicht ist die Notlösung (bis zu einer C-Version (für die ich leider keine Zeit finde)) die Methoden aus der Klasse herauszukopieren.

    MfG SideWinder



  • Wo gibt es diese C Klasse zum rauskopieren? habe den Compiler:

    Icc Win 32 - reiner C Compiler



  • Probier das mal:

    #include <windows.h>
    
    #include <stdlib.h>
    #include <stdio.h>
    
    /* ... */
    
    /* Diese Funktion setzt die Cursor-Position auf Spalte x Zeile y (Ursprung: 1 1) */
    void gotoxy( int x, int y ) {
       HANDLE                     hCon;        /* Konsole-Handle                */
       CONSOLE_SCREEN_BUFFER_INFO csbi;        /* Bildschirmpufferinformationen */
       COORD                      coProspect;  /* zu erwartende Cursor-Position */
       /* Diese Funktion ermittelt das Standard-Ausgabe-Handle. Dies muss nicht unbedingt eine Konsole sein.
       *  Der Einfachheit halber soll es aber erstmal genuegen, da Konsole-API-Funktionen auf Nicht-Konsole Handles eh fehlschlagen.
       */ 
       hCon = GetStdHandle( STD_OUTPUT_HANDLE );
       /* Jetzt Informationen ueber den Bildschirmpuffer der Konsole einholen. */
       if ( !GetConsoleScreenBufferInfo( hCon, &csbi ) ) return; /* Rueckkehr ohne Aktion bei Fehlern */
       /* Zunaechst die gewuenschte bzw. erwartete Cursorposition berechnen. */
       coProspect.X = (SHORT)( x - 1 );  /* -1 wegen 0-Urpsrung bei Konsole-API */
       coProspect.Y = (SHORT)( y - 1 );
       /* Pruefen, ob Cursorposition jenseits der Grenzen des Konsole-Puffers. In dem Fall Clipping durchfuehren. */
       if ( coProspect.X < (SHORT) 0 ) coProspect.X = (SHORT) 0;
       else if ( coProspect.X >= csbi.dwSize.X ) coProspect.X = csbi.dwSize.X - (SHORT) 1;
       if ( coProspect.Y < (SHORT) 0 ) coProspect.Y = (SHORT) 0;
       else if ( coProspect.Y >= csbi.dwSize.Y ) coProspect.Y = csbi.dwSize.Y - (SHORT) 1;
       /* Pruefen, ob Cursorposition bereits stimmt. In dem Fall, nichts unternehmen */
       if ( csbi.dwCursorPosition.X == coProspect.X && csbi.dwCursorPosition.Y == coProspect.Y ) return;
       /* Andernfalls, Cursorposition setzen. */
       SetConsoleCursorPosition( hCon, coProspect );  
    }
    
    /* das war's auch schon ... jetzt ein Testprogramm */
    
    int main( int argc, char** argv ) {
    
       gotoxy( 5, 5 );
       printf( "hello world!\n" );
    
       return EXIT_SUCCESS;
    }
    

    Beim Verlassen des Programms steht der Cursor uebrigens dort, wo er zuletzt hingesetzt wurde. Will man das nicht haben, muss man den Console-Puffer zu Beginn sichern und am Ende wiederherstellen.


Anmelden zum Antworten