Register for your free account! | Forgot your password?

Go Back   elitepvpers > Coders Den > C/C++
You last visited: Today at 16:54

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



C++ "Menü"

Discussion on C++ "Menü" within the C/C++ forum part of the Coders Den category.

Reply
 
Old   #1
 
_Roman_'s Avatar
 
elite*gold: 0
Join Date: May 2010
Posts: 1,620
Received Thanks: 237
C++ "Menü"

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
_Roman_ is offline  
Old 03/30/2014, 11:25   #2
 
elite*gold: 1
Join Date: Aug 2013
Posts: 1,898
Received Thanks: 1,346
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);
     }
Black Tiger ツ is offline  
Thanks
1 User
Old 03/30/2014, 12:20   #3


 
elite*gold: 1091
Join Date: Jun 2007
Posts: 19,836
Received Thanks: 7,180
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:

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")
Mostey is offline  
Thanks
3 Users
Old 03/30/2014, 12:59   #4
 
_Roman_'s Avatar
 
elite*gold: 0
Join Date: May 2010
Posts: 1,620
Received Thanks: 237
Danke für die Info 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
_Roman_ is offline  
Old 03/30/2014, 13:07   #5
 
elite*gold: 1
Join Date: Aug 2013
Posts: 1,898
Received Thanks: 1,346
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?
Black Tiger ツ is offline  
Thanks
2 Users
Old 03/30/2014, 13:29   #6


 
elite*gold: 1091
Join Date: Jun 2007
Posts: 19,836
Received Thanks: 7,180
Quote:
Originally Posted by _Roman_ View Post
Danke für die Info 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.
Mostey is offline  
Thanks
2 Users
Reply




All times are GMT +1. The time now is 16:54.


Powered by vBulletin®
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2025 elitepvpers All Rights Reserved.