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+1Weiß 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=demosdanach 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.