Smiley bewegen



  • Hi Leute,

    ich habe mich mal etwas mit der Funktion gotoxy() beschäftigt und habe mir gedacht, dass ich es mal versuchen könnte einen Smiley in der Konsole bewegen zu lassen. Wenn ich zum Beispiel die linke Pfeiltaste drücke, soll sich der Smiley auch nach links bewegen, aber ich weiß nicht wie ich das machen kann. Wie könnte ich das anstellen? Ich wäre euch dankbar.

    MfG René



  • Hi,

    ich hätte da vielleicht eine Idee. Ich weiß aber nicht, ob sie funktioniert.
    Ich füge zuerst ein Stück Code an, den man für deine Zwecke noch modifizieren müsste.

    #include <conio.h> 
    #include <iostream> 
    
    using namespace std; 
    
    int GetKey () 
    { 
        int Key = getch (); 
        if (Key == 0 || Key == 224) 
        { 
            Key = 256 + getch (); 
        } 
        return Key; 
    } 
    
    int main () 
    { 
        int Key = 0; 
    
        while (Key != 27)   // solange nicht Escape gedrückt wurde 
        { 
            Key = GetKey (); 
    
            switch (Key) 
            { 
            case 328:   // Pfeiltaste nach oben 
                { 
                    cout << "Up!" << endl; 
                } 
                break; 
    
            case 336:   // Pfeiltaste nach unten 
                { 
                    cout << "Down!" << endl; 
                } 
                break; 
    
            case 333:   // Pfeiltaste nach rechts 
                { 
                    cout << "Right!" << endl; 
                } 
                break; 
    
            case 331:   // Pfeiltaste nach links 
                { 
                    cout << "Left!" << endl; 
                } 
                break; 
    
            default:   // Taste (noch) nicht definiert 
                { 
                    cout << "  >>>" << Key << endl; 
                } 
            } 
        } 
    
        return 0; 
    }
    

    Du müsstest anstatt oben, unten, links oder rechts zu schreiben deine Position des Smileys verändern. Dies geht eventuell mit der Datei conioex, welche ich im folgenden anhänge. In ihr gibt es Funktionen um den aktuellen Cursorpunkt zu bestimmen. Dieser muss dann je nach eingabe verändert werden. Dann muss über die gotoxy() der neue Cursorpunkt dem Compiler genannt werden.

    // ########################################################################### 
    // Datei:        conioex.hpp 
    // ########################################################################### 
    // Autor:        Patrick Ullmann 
    // Erstellt:     27.06.2005 
    // Änderungen:   27.06.2005 (Patrick) Datei erstellt 
    // ########################################################################### 
    // Beschreibung: Portierung der <conio.h> für den VC++ 
    
    #if (_MSC_VER > 1000) 
    #pragma once 
    #endif // VC++ Include Guard 
    
    #if !defined(__conioex_h__) 
    #define __conioex_h__ 
    
    // I N C L U D E S ########################################################### 
        // Allgemeine conio inkludieren 
    #include <conio.h> 
    
    // D E F I N I T I O N E N ################################################### 
        // Nur für Non-Borland Compiler benötigen wir folgende Implementierung 
    #if !defined(__BORLANDC__) 
    
        // Nur Win32-Konsolen werden unterstützt 
    #if !defined(_WIN32) || (defined(_MSC_VER) && !defined(_CONSOLE)) 
    #error Only Win32-Console-Targets supported 
    #endif 
    
        // Farben definieren wenn nötig 
    #if !defined(__COLORS) 
    #define __COLORS 
        // Die Farben 
    enum COLORS 
    { 
            // Dunkle Farben 
        BLACK, 
        BLUE, 
        GREEN, 
        CYAN, 
        RED, 
        MAGENTA, 
        BROWN, 
    
            // Helle Farben 
        LIGHTGRAY, 
        DARKGRAY, 
        LIGHTBLUE, 
        LIGHTGREEN, 
        LIGHTCYAN, 
        LIGHTRED, 
        LIGHTMAGENTA, 
        YELLOW, 
        WHITE 
    }; 
    #endif 
    
          // Cursortypen für _setcursortype() 
    const unsigned long _NOCURSOR     = 0; 
    const unsigned long _SOLIDCURSOR  = 1; 
    const unsigned long _NORMALCURSOR = 2; 
    
        // Makro für die Erstellung von Textattributen 
    #if !defined(BUILD_TEXTATTR) 
    #define BUILD_TEXTATTR(f, b) static_cast<int>((((b) & 15) << 4) | ((f) & 15)) 
    #endif 
    
        // Leert den Inhalt des Bildschirms und setzt den Cursor auf 1x1 
    void __cdecl clrscr (void); 
    
        // Leert die Aktuelle Zeile, Cursor wird nicht verschoben 
    void __cdecl clreol (void); 
    
        // Setzt den Cursor an die Position X und Y 
    void __cdecl gotoxy (int x, int y); 
    
        // Gibt die aktuelle X-Position des Cursors wieder 
    int __cdecl wherex (void); 
    
        // Gibt die aktuelle Y-Position des Cursors wieder 
    int __cdecl wherey (void); 
    
        // Fügt eine neue Zeile hinzu. 
    void __cdecl insline (void); 
    
        // Löscht eine Zeile 
    void __cdecl delline (void); 
    
        // Setzt eine Textfarbe 
    void __cdecl textcolor (int color); 
    
        // Setzt eine Hintergrundfarbe für den Text 
    void __cdecl textbackground (int color); 
    
        // Setzt ein Attribut für den Text 
    void __cdecl textattr (int attr); 
    
        // Aktiviert helle Farben 
    void __cdecl highvideo (void); 
    
        // Deaktiviert helle Farben 
    void __cdecl lowvideo (void); 
    
        // Verändert den Cursortyp 
    void __cdecl _setcursortype (unsigned long cur_t); 
    
    #endif 
    
    #endif
    

    Und nun die zugehörige cpp.Datei

    // ########################################################################### 
    // Datei:        conioex.cpp 
    // ########################################################################### 
    // Autor:        Patrick Ullmann 
    // Erstellt:     27.06.2005 
    // Änderungen:   27.06.2005 (Patrick) Datei erstellt 
    // ########################################################################### 
    // Beschreibung: Portierung der <conio.h> für den VC++ 
    
    // I N C L U D E S ########################################################### 
        // Nur für Non-Borland Compiler gilt diese Implementierung 
    #if !defined(__BORLANDC__) 
    #include <windows.h> 
    #include "conioex.hpp" 
    
    // F U N K T I O N E N ####################################################### 
    
    // /////////////////////////////////////////////////////////////////////////// 
    // PUBLIC 
    // 
    // Leert den Inhalt des Bildschirms und setzt den Cursor auf 1x1 
    // /////////////////////////////////////////////////////////////////////////// 
    void __cdecl clrscr (void) 
    { 
            // Hilfsvariablen /- strukturen 
        CONSOLE_SCREEN_BUFFER_INFO  info; 
        HANDLE                      out; 
        unsigned long               written; 
        COORD                       coord; 
    
            // Informationen holen 
        if ((out = ::GetStdHandle(STD_OUTPUT_HANDLE)) == INVALID_HANDLE_VALUE) 
            return; 
        if (!::GetConsoleScreenBufferInfo(out, &info)) 
            return; 
    
            // Cursor verschieben 
        coord.X = 0; 
        coord.Y = 0; 
    
            // Konsole manipulieren 
        ::FillConsoleOutputAttribute (out, info.wAttributes, 
                                           info.dwSize.X*info.dwSize.Y, 
                                           coord, 
                                           &written); 
    
        ::FillConsoleOutputCharacter (out, TEXT(' '), 
                                           info.dwSize.X*info.dwSize.Y, 
                                           coord, 
                                           &written); 
    
            // Cursorposition setzen 
        ::SetConsoleCursorPosition   (out, coord); 
    } 
    
    // /////////////////////////////////////////////////////////////////////////// 
    // PUBLIC 
    // 
    // Leert die Aktuelle Zeile, Cursor wird nicht verschoben 
    // /////////////////////////////////////////////////////////////////////////// 
    void __cdecl clreol (void) 
    { 
            // Hilfsvariablen /- strukturen 
        CONSOLE_SCREEN_BUFFER_INFO  info; 
        HANDLE                      out; 
        unsigned long               written; 
    
            // Informationen holen 
        if ((out = ::GetStdHandle(STD_OUTPUT_HANDLE)) == INVALID_HANDLE_VALUE) 
            return; 
        if (!::GetConsoleScreenBufferInfo(out, &info)) 
            return; 
    
            // Konsole manipulieren 
        ::FillConsoleOutputAttribute (out, info.wAttributes, 
                                      (info.dwSize.X - info.dwCursorPosition.X), 
                                      info.dwCursorPosition, 
                                      &written); 
    
        ::FillConsoleOutputCharacter (out, TEXT(' '), 
                                      (info.dwSize.X - info.dwCursorPosition.X), 
                                      info.dwCursorPosition, 
                                      &written); 
    
            // Cursor setzen 
        ::SetConsoleCursorPosition   (out, info.dwCursorPosition); 
    } 
    
    // /////////////////////////////////////////////////////////////////////////// 
    // PUBLIC 
    // 
    // Setzt den Cursor an die Position X und Y 
    // /////////////////////////////////////////////////////////////////////////// 
    void __cdecl gotoxy(int x, int y) 
    { 
            // Sicherheitsabfrage 
        if(HIWORD(x) || HIWORD(y)) 
            return; 
    
            // Hilfsstruktur 
        COORD  coord; 
    
            // Cursor verschieben 
        coord.X = LOWORD(x - 1); 
        coord.Y = LOWORD(y - 1); 
    
            // Cursor setzen 
        ::SetConsoleCursorPosition (::GetStdHandle(STD_OUTPUT_HANDLE), coord); 
    } 
    
    // /////////////////////////////////////////////////////////////////////////// 
    // PUBLIC 
    // 
    // Gibt die aktuelle X-Position des Cursors wieder 
    // /////////////////////////////////////////////////////////////////////////// 
    int __cdecl wherex(void) 
    { 
            // Hilfsvariablen /- strukturen 
        CONSOLE_SCREEN_BUFFER_INFO  info; 
    
            // Informationen holen 
        if (!::GetConsoleScreenBufferInfo(::GetStdHandle(STD_OUTPUT_HANDLE),&info)) 
            return 0; 
    
            // Position zurück geben 
        return (info.dwCursorPosition.X + 1); 
    } 
    
    // /////////////////////////////////////////////////////////////////////////// 
    // PUBLIC 
    // 
    // Gibt die aktuelle Y-Position des Cursors wieder 
    // /////////////////////////////////////////////////////////////////////////// 
    int __cdecl wherey(void) 
    { 
            // Hilfsvariablen /- strukturen 
        CONSOLE_SCREEN_BUFFER_INFO  info; 
    
            // Informationen holen 
        if (!::GetConsoleScreenBufferInfo(::GetStdHandle(STD_OUTPUT_HANDLE),&info)) 
            return 0; 
    
            // Position zurück geben 
        return (info.dwCursorPosition.Y + 1); 
    } 
    
    // /////////////////////////////////////////////////////////////////////////// 
    // PUBLIC 
    // 
    // Fügt eine neue Zeile hinzu. 
    // /////////////////////////////////////////////////////////////////////////// 
    void __cdecl insline(void) 
    { 
            // Hilfsvariablen /- strukturen 
        CONSOLE_SCREEN_BUFFER_INFO  info; 
        SMALL_RECT                  rect; 
        CHAR_INFO                   char_info; 
        HANDLE                      out; 
        COORD                       coord; 
    
            // Informationen holen 
        if ((out = ::GetStdHandle(STD_OUTPUT_HANDLE)) == INVALID_HANDLE_VALUE) 
            return; 
        if (!::GetConsoleScreenBufferInfo(out, &info)) 
            return; 
    
            // Unicode oder nicht? 
        #if defined(UNICODE) 
          char_info.Char.UnicodeChar = L' '; 
        #else 
          char_info.Char.AsciiChar   =  ' '; 
        #endif 
    
            // Attribute sichern 
        char_info.Attributes = info.wAttributes; 
    
            // Rechteck ausrechnen 
        rect.Left   = 0; 
        rect.Top    = LOWORD(info.dwCursorPosition.Y); 
        rect.Right  = LOWORD(info.dwSize.X - 1); 
        rect.Bottom = LOWORD(info.dwSize.Y - 1); 
    
            // Position setzen 
        coord.X    = 0; 
        coord.Y    = LOWORD(info.dwCursorPosition.Y + 1); 
    
            // Konsole manipulieren 
        ::ScrollConsoleScreenBuffer (out, &rect, NULL, coord, &char_info); 
    } 
    
    // /////////////////////////////////////////////////////////////////////////// 
    // PUBLIC 
    // 
    // Löscht eine Zeile 
    // /////////////////////////////////////////////////////////////////////////// 
    void __cdecl delline(void) 
    { 
            // Hilfsvariablen /- strukturen 
        CONSOLE_SCREEN_BUFFER_INFO  info; 
        SMALL_RECT                  rect; 
        CHAR_INFO                   char_info; 
        HANDLE                      out; 
        COORD                       coord; 
    
            // Informationen holen 
        if ((out = ::GetStdHandle(STD_OUTPUT_HANDLE)) == INVALID_HANDLE_VALUE) 
            return; 
        if (!::GetConsoleScreenBufferInfo(out, &info)) 
            return; 
    
            // Unicode oder nicht? 
        #if defined(UNICODE) 
          char_info.Char.UnicodeChar = L' '; 
        #else 
          char_info.Char.AsciiChar   =  ' '; 
        #endif 
    
            // Attribute sichern 
        char_info.Attributes = info.wAttributes; 
    
            // Rechteck ausrechnen 
        rect.Left   = 0; 
        rect.Top    = LOWORD(info.dwCursorPosition.Y + 1); 
        rect.Right  = LOWORD(info.dwSize.X - 1); 
        rect.Bottom = LOWORD(info.dwSize.Y - 1); 
    
            // Position setzen 
        coord.X    = 0; 
        coord.Y    = LOWORD(info.dwCursorPosition.Y); 
    
            // Konsole manipulieren 
        ::ScrollConsoleScreenBuffer (out, &rect, NULL, coord, &char_info); 
    } 
    
    // /////////////////////////////////////////////////////////////////////////// 
    // PUBLIC 
    // 
    // Setzt eine Textfarbe 
    // /////////////////////////////////////////////////////////////////////////// 
    void __cdecl textcolor (int color) 
    { 
            // Hilfsvariablen /- strukturen 
        CONSOLE_SCREEN_BUFFER_INFO  info; 
        HANDLE                      out; 
    
            // Informationen holen 
        if ((out = ::GetStdHandle(STD_OUTPUT_HANDLE)) == INVALID_HANDLE_VALUE) 
            return; 
        if (!::GetConsoleScreenBufferInfo(out, &info)) 
            return; 
    
            // Konsole manipulieren 
        ::SetConsoleTextAttribute (out, 
                    static_cast<unsigned short>((info.wAttributes & ~0x0F) | 
                    static_cast<unsigned short>(color & 0x0F))); 
    } 
    
    // /////////////////////////////////////////////////////////////////////////// 
    // PUBLIC 
    // 
    // Setzt eine Hintergrundfarbe für den Text 
    // /////////////////////////////////////////////////////////////////////////// 
    void __cdecl textbackground (int color) 
    { 
            // Hilfsvariablen /- strukturen 
        CONSOLE_SCREEN_BUFFER_INFO  info; 
        HANDLE                      out; 
    
            // Informationen holen 
        if ((out = ::GetStdHandle(STD_OUTPUT_HANDLE)) == INVALID_HANDLE_VALUE) 
            return; 
        if (!::GetConsoleScreenBufferInfo(out, &info)) 
            return; 
    
            // Konsole manipulieren 
        ::SetConsoleTextAttribute (out, 
                    static_cast<unsigned short>((info.wAttributes & ~0xF0) | 
                    static_cast<unsigned short>((color & 0x0F) << 4))); 
    } 
    
    // /////////////////////////////////////////////////////////////////////////// 
    // PUBLIC 
    // 
    // Setzt ein Attribut für den Text 
    // /////////////////////////////////////////////////////////////////////////// 
    void __cdecl textattr (int attr) 
    { 
            // Hilfsvariablen /- strukturen 
        CONSOLE_SCREEN_BUFFER_INFO  info; 
        HANDLE                      out; 
    
            // Informationen holen 
        if ((out = ::GetStdHandle(STD_OUTPUT_HANDLE)) == INVALID_HANDLE_VALUE) 
            return; 
        if (!::GetConsoleScreenBufferInfo(out, &info)) 
            return; 
    
            // Konsole manipulieren 
        ::SetConsoleTextAttribute (out, 
                    static_cast<unsigned short>((info.wAttributes & ~0xFF) | 
                    static_cast<unsigned short>(attr & 0xFF))); 
    } 
    
    // /////////////////////////////////////////////////////////////////////////// 
    // PUBLIC 
    // 
    // Aktiviert helle Farben 
    // /////////////////////////////////////////////////////////////////////////// 
    void __cdecl highvideo (void) 
    { 
            // Hilfsvariablen /- strukturen 
        CONSOLE_SCREEN_BUFFER_INFO  info; 
        HANDLE                      out; 
    
            // Informationen holen 
        if ((out = ::GetStdHandle(STD_OUTPUT_HANDLE)) == INVALID_HANDLE_VALUE) 
            return; 
        if (!::GetConsoleScreenBufferInfo(out, &info)) 
            return; 
    
            // Konsole manipulieren 
        ::SetConsoleTextAttribute (out, 
            static_cast<unsigned short>(info.wAttributes | FOREGROUND_INTENSITY)); 
    } 
    
    // /////////////////////////////////////////////////////////////////////////// 
    // PUBLIC 
    // 
    // Deaktiviert helle Farben 
    // /////////////////////////////////////////////////////////////////////////// 
    void __cdecl lowvideo (void) 
    { 
            // Hilfsvariablen /- strukturen 
        CONSOLE_SCREEN_BUFFER_INFO  info; 
        HANDLE                      out; 
    
            // Informationen holen 
        if ((out = ::GetStdHandle(STD_OUTPUT_HANDLE)) == INVALID_HANDLE_VALUE) 
            return; 
        if (!::GetConsoleScreenBufferInfo(out, &info)) 
            return; 
    
            // Konsole manipulieren 
        ::SetConsoleTextAttribute (out, 
            static_cast<unsigned short>(info.wAttributes | ~FOREGROUND_INTENSITY)); 
    } 
    
    // /////////////////////////////////////////////////////////////////////////// 
    // PUBLIC 
    // 
    // Verändert den Cursortyp 
    // /////////////////////////////////////////////////////////////////////////// 
    void __cdecl _setcursortype (unsigned long type) 
    { 
            // Hilfsstruktur 
        CONSOLE_CURSOR_INFO info; 
    
            // Größe verändern 
             if ((type == _NOCURSOR) || (type == _NORMALCURSOR)) 
             info.dwSize = 25; 
        else if (type == _SOLIDCURSOR) 
             info.dwSize = 100; 
        else 
             return; 
    
            // Cursor sichtbar? 
        info.bVisible = (type == _NOCURSOR) ? false : true; 
    
            // Konsole manipulieren 
        ::SetConsoleCursorInfo (::GetStdHandle(STD_OUTPUT_HANDLE), &info); 
    } 
    
    #endif
    

    Ich hoffe es funktioniert !!!



  • Probiers mal mit Ansi-Sequenzen.
    Schau am besten in dem thread farbige shell nach unten da steht wie das mit dem cusor funktioniert



  • Das kannst du machen, ist aber kein Standard C++. Schau bei den Konsolen, da wurde das schon zigmal beantwortet.

    Bye, TGGC (Das Jahr des Helden)



  • Storm.Xapek.de schrieb:

    Probiers mal mit Ansi-Sequenzen.
    Schau am besten in dem thread farbige shell nach unten da steht wie das mit dem cusor funktioniert

    hallo.. beachte bitte, dass die ansi sequencen ab größer win98 nicht mehr funktionieren unter windows.
    informier dich bitte auch im konsolenfaq.

    so long 😉



  • unter linux ist das gang und gebe, völlig normal.
    Warum sind eigentlich alle immer so auf windows bedacht?



  • Storm.Xapek.de schrieb:

    unter linux ist das gang und gebe, völlig normal.
    Warum sind eigentlich alle immer so auf windows bedacht?

    Weil Windows besser ist als Linux.



  • 😕 😕 😕 😕

    LOL zum letzten Beitrag!



  • Mit windows zu arbeiten, ist so als würde mal täglich "Bild" lesen.



  • Storm.Xapek.de schrieb:

    unter linux ist das gang und gebe, völlig normal.
    Warum sind eigentlich alle immer so auf windows bedacht?

    wenn du zu linux was sagst, schreib es in den unterbereich linux hier im forum.
    wenn zu windows-winapi, dann in diesen bereich.
    wenn zu dos-win32 konsole, dann in diesen bereich.

    und wenn zu standard c++, lass alles rund um farbe, positionierung, oder sonstige betriebssystemspezifische dinge: WEG.
    c++ standard gilt für überall. hier geht es rein um die sprache.

    dafür ist die unterteilung da.. jahrelang dran gefeilt *g

    und akzeptiere, dass die win32 konsole ab win2000 keine ansi sequenzen mehr hat. leider.

    grüße 🙂



  • Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum DOS und Win32-Konsole verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • @ spacegaier

    Danke für dein Script. Ich habe es etwas verändert und nun funktioniert es. Danke dir.

    MfG René


Anmelden zum Antworten