C++ "Menü"

03/29/2014 23:29 _Roman_#1
Hi,

ich hab da ein Anliegen. Undzwar möchte ich demnächst ein Programm in C++ schreiben. Was für eins tut hier nicht zur Sache. Jedenfalls basiert es auf der Konsole und ich würde gerne ein "Startmenü" haben, sprich mehrere Auswahlen für gewisse Aktionen. Dabei möchte ich auch die Funktion haben, aus diesen einzelnen "Untermenüs" mithilfe einer bestimmten Taste wieder ins Startmenü zu kommen. Nun ist meine Frage, wie löst man dieses Problem am sinnvollsten? Mir fällt da nur ein, das ganze mit while-Schleifen zu verknoten, aber ich glaub das wäre so die schlechteste Lösung.

MfG
Roman
03/30/2014 11:25 Black Tiger ツ#2
Eine fußgesteuerte Schleife und für die Abfragen am besten switch-case benutzen.

Code:
#include <iostream>

using namespace std;

int GetInput();
void DisplayMainMenu();
void DisplayOptionsMenu();
void Options();

int main ( int arc, char **argv ){
    int select = 0;

     do
     {
        system("cls");
        DisplayMainMenu();
        select = GetInput();
        switch(select) {
            case 1:
                cout << "Spiel gestartet!\n";
                break;
             case 2: 
                Options();
                break;
             case 3: 
                cout << "Bye!";
                break;
             default: 
                break;
        }
     } while(select!=3);
     
    system("PAUSE");
         
return 0;
}

  int GetInput()
     {
         int select;    
         cin >> select;
         return select;
     }

     void DisplayMainMenu()
     {
         cout << "Spiel Menu\n";
         cout << "Waehle aus...\n";
         cout << "1 - Starte Spiel\n";
         cout << "2 - Optionen\n";
         cout << "3 - Exit\n";
         cout << "Eingabe: ";
     }

     void DisplayOptionsMenu()
     {
         cout << "Spiel Menu\n";
         cout << "Waehle aus...\n";
         cout << "1 - Level\n";
         cout << "2 - Sound\n";
         cout << "3 - Zurueck\n";
         cout << "Eingabe: ";
     }

     void Options()
     {
        int select = 0;
        do
        {
            system("cls");
            DisplayOptionsMenu();
            select = GetInput();
            switch(select)
            {
                case 1:
                    cout << "level optionen";
                    break;
                case 2:
                    cout << "sound optionen";
                    break;
                case 3:
                    break;
                default:
                    break;
            }
        } while(select!=3);
     }
03/30/2014 12:20 Mostey#3
Quote:
Originally Posted by Black Tiger ツ View Post
Eine fußgesteuerte Schleife und für die Abfragen am besten switch-case benutzen.

Code:
#include <iostream>

using namespace std;

int GetInput();
void DisplayMainMenu();
void DisplayOptionsMenu();
void Options();

int main ( int arc, char **argv ){
    int select = 0;

     do
     {
        system("cls");
        DisplayMainMenu();
        select = GetInput();
        switch(select) {
            case 1:
                cout << "Spiel gestartet!\n";
                break;
             case 2: 
                Options();
                break;
             case 3: 
                cout << "Bye!";
                break;
             default: 
                break;
        }
     } while(select!=3);
     
    system("PAUSE");
         
return 0;
}

  int GetInput()
     {
         int select;    
         cin >> select;
         return select;
     }

     void DisplayMainMenu()
     {
         cout << "Spiel Menu\n";
         cout << "Waehle aus...\n";
         cout << "1 - Starte Spiel\n";
         cout << "2 - Optionen\n";
         cout << "3 - Exit\n";
         cout << "Eingabe: ";
     }

     void DisplayOptionsMenu()
     {
         cout << "Spiel Menu\n";
         cout << "Waehle aus...\n";
         cout << "1 - Level\n";
         cout << "2 - Sound\n";
         cout << "3 - Zurueck\n";
         cout << "Eingabe: ";
     }

     void Options()
     {
        int select = 0;
        do
        {
            system("cls");
            DisplayOptionsMenu();
            select = GetInput();
            switch(select)
            {
                case 1:
                    cout << "level optionen";
                    break;
                case 2:
                    cout << "sound optionen";
                    break;
                case 3:
                    break;
                default:
                    break;
            }
        } while(select!=3);
     }
Von using namespace std würde ich persönlich abraten. Da hat es schon durchaus einige Male Probleme gegeben, weil es die Funktion in einem anderen Namespace bereits gegeben hat und der Compiler nicht wusste, welche Funktion gemeint war.

system() ist auch nicht gerade zu empfehlen, wenn man weiß, was eigentlich dabei passiert: [Only registered and activated users can see links. Click Here To Register...]

Code:
std::cout << std::string( 100, '\n' );
wäre eine Alternative zu system("CLS").

Code:
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); // um den Buffer zu leeren
std::cin.get()
wäre eine Alternative zu system("PAUSE")
03/30/2014 12:59 _Roman_#4
Danke für die Info :D Wusste bisher nie Alternativen. Diese Methode für mein Anliegen würdest du auch verwenden, Mostey? Oder hast du noch eine andere Idee im Kopf
03/30/2014 13:07 Black Tiger ツ#5
Quote:
Originally Posted by Mostey View Post
Code:
std::cin.get()
wäre eine Alternative zu system("PAUSE")
Wäre da nicht:

Code:
std::cin.clear(); 
std::cin.ignore(cin.rdbuf()->in_avail()); 
std::cin.get();
angebracht?
03/30/2014 13:29 Mostey#6
Quote:
Originally Posted by _Roman_ View Post
Danke für die Info :D Wusste bisher nie Alternativen. Diese Methode für mein Anliegen würdest du auch verwenden, Mostey? Oder hast du noch eine andere Idee im Kopf
Ich hätte das ganze vielleicht eher mit OOP umgesetzt, damit das etwas übersichtlicher und wartbarer wird. Sonst fällt mir da auch keine andere Methode ein, wie die von Black Tiger. Um Schleifen kommst du dabei sowieso nicht herum.

Quote:
Originally Posted by Black Tiger ツ View Post
Wäre da nicht:

Code:
std::cin.clear(); 
std::cin.ignore(cin.rdbuf()->in_avail()); 
std::cin.get();
angebracht?
Danke für den Hinweis. :)

Code:
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
reicht hier denke ich vor dem std::cin.get() aus um den Buffer zu leeren.