eine funktion aussführen



  • Ich habe eine Frage und zwar bei meinem Code zu einer Nachfrage ob man das Programm wirklich schließen will.
    Wenn man auf Ja drückt dann schließt sich das Programm und wenn man auf Nein drückt dann soll man zurück zum Menü kommen aber wie mache ich das?
    Es geht um Line 71 und man soll halt das Menü wieder aufrufen(Line 96)
    Bitte nicht meckern das es nicht der eleganteste Code ist ich bin neu im Codingbuissnes 🙂
    Hier mein Code:

    #include <iostream>
    #include <stdio.h>
    #include <time.h>
    #include <Windows.h>
    
    using namespace std;
    
    const int maxNumber = 100;
    
    char Menu()
    {
    	char input = ' ';
    	cout << endl << "Menu" << endl << endl;
    	cout << "(P)lay" << endl;
    	cout << "(Q)uit" << endl;
    	cout << "Eingabe: ";
    	cin >> input;
    	system("cls");
    	return input;
    }
    
    int GetUserGuess()
    {
    	int guess = 0;
    	cout << "Deine Vermutung: ";
    	cin >> guess;
    	return guess;
    }
    
    bool ValidateUserGuess(int guess, int rightResult)
    {
    	if (guess == rightResult)
    	{
    		cout << "Richtig!, die Zahl ist: '" << guess << "'" << endl << endl;
    		return true;
    	}
    	else if (guess < rightResult)
    	{
    		cout << "Die Zahl ist groesser als: '" << guess << "'" << endl << endl;
    		return false;
    	}
    	else if (guess > rightResult)
    	{
    		cout << "Die Zahl ist kleiner als: '" << guess << "'" << endl << endl;
    		return false;
    	}
    	else
    	{
    		cout << "Ungueltige Eingabe: '" << guess << "'" << endl;
    	}
    }
    
    void ExitGame()
    {
    	int zahl(0);
    
    	A:
    	cout << "Möchtest du wirklich beenden?" << endl;
    	cout << "(1) Ja" << endl;
    	cout << "(2) Nein" << endl;
    	cin >> zahl;
    	if (zahl == 1)
    	{
    		system("cls");
    		system("COLOR C");
    		cout << "Spiel wird geschlossen ..." << endl;
    		Sleep(1500);
    	}
    	else if (zahl == 2)
    	{
    		main();
    	}
    	else
    	{
    		cout << "Ungueltige Eingabe!" << endl;
    		goto A;
    	}
    
    
    }
    
    void RunGame()
    {
    	int randomNumber = rand() % maxNumber + 1;
    	int guess = 0;
    	int tries = 0;
    	cout << "Die gesuchte Zahl ist zwischen 1 und " << maxNumber << endl;
    	do
    	{
    		guess = GetUserGuess();
    		tries++;
    	} while (!ValidateUserGuess(guess, randomNumber));
    	cout << "Du hast " << tries << " Versuche gebraucht!" << endl;
    }
    
    void RunMenu()
    {
    	while (true)
    	{
    		char input = Menu();
    		if (input == 'P' || input == 'p')
    			RunGame();
    		else if (input == 'Q' || input == 'q')
    			return ExitGame();
    		else
    			cout << "Eingabe '" << input << "' ungueltig" << endl;
    
    	}
    }
    
    int main()
    {
    	srand(time(NULL));
    	RunMenu();
    
    	system("PAUSE");
    	return 0;
    
    }
    

    Danke schonmal



  • @knolly niemals main() selbe4 aufrufen.
    goto brauchst du nicht. das kann man sauber mit Schleifen machen.

    ExitGame gibt einen Status zurück. daran kann RunMenu erkennen, was gemacht werden soll.



  • kann man irgendwie return main; machen oder so?
    oder wie macht man das jetzt weil das alles nicht geht



  • Ich habe jetzt return RunMenu(); gemacht und da ist und nichts rot unterkringelt aber das ist anscheinend trotzdem falsch

    #include <iostream>
    #include <stdio.h>
    #include <time.h>
    #include <Windows.h>
    
    using namespace std;
    
    const int maxNumber = 100;
    
    char Menu()
    {
    	char input = ' ';
    	cout << endl << "Menu" << endl << endl;
    	cout << "(P)lay" << endl;
    	cout << "(Q)uit" << endl;
    	cout << "Eingabe: ";
    	cin >> input;
    	system("cls");
    	return input;
    }
    
    int GetUserGuess()
    {
    	int guess = 0;
    	cout << "Deine Vermutung: ";
    	cin >> guess;
    	return guess;
    }
    
    bool ValidateUserGuess(int guess, int rightResult)
    {
    	if (guess == rightResult)
    	{
    		cout << "Richtig!, die Zahl ist: '" << guess << "'" << endl << endl;
    		return true;
    	}
    	else if (guess < rightResult)
    	{
    		cout << "Die Zahl ist groesser als: '" << guess << "'" << endl << endl;
    		return false;
    	}
    	else if (guess > rightResult)
    	{
    		cout << "Die Zahl ist kleiner als: '" << guess << "'" << endl << endl;
    		return false;
    	}
    	else
    	{
    		cout << "Ungueltige Eingabe: '" << guess << "'" << endl;
    	}
    }
    
    void ExitGame()
    {
    	int zahl(0);
    
    A:
    	cout << "Möchtest du wirklich beenden?" << endl;
    	cout << "(1) Ja" << endl;
    	cout << "(2) Nein" << endl;
    	cin >> zahl;
    	if (zahl == 1)
    	{
    		system("cls");
    		system("COLOR C");
    		cout << "Spiel wird geschlossen ..." << endl;
    		Sleep(1500);
    	}
    	else if (zahl == 2)
    	{
    		return RunMenu();
    	}
    	else
    	{
    		cout << "Ungueltige Eingabe!" << endl;
    		goto A;
    	}
    
    
    }
    
    
    void RunGame()
    {
    	int randomNumber = rand() % maxNumber + 1;
    	int guess = 0;
    	int tries = 0;
    	cout << "Die gesuchte Zahl ist zwischen 1 und " << maxNumber << endl;
    	do
    	{
    		guess = GetUserGuess();
    		tries++;
    	} while (!ValidateUserGuess(guess, randomNumber));
    	cout << "Du hast " << tries << " Versuche gebraucht!" << endl;
    }
    
    void RunMenu()
    {
    	while (true)
    	{
    		char input = Menu();
    		if (input == 'P' || input == 'p')
    			RunGame();
    		else if (input == 'Q' || input == 'q')
    			return ExitGame();
    		else
    			cout << "Eingabe '" << input << "' ungueltig" << endl;
    
    	}
    }
    
    int main()
    {
    	srand(time(NULL));
    	RunMenu();
    
    	system("PAUSE");
    	return 0;
    
    }
    


  • @knolly sagte in eine funktion aussführen:

    anscheinend

    ?



  • @knolly
    was passiert deiner Meinung nach bei return RunMenu();?



  • #include <cstdlib>
    #include <cctype>
    #include <ctime>
    #include <limits>
    #include <iostream>
    
    #include <windows.h>
    #ifdef max
    #undef max
    #endif
    
    
    void clear_console()
    {
    	auto output_handle{ GetStdHandle(STD_OUTPUT_HANDLE) };
    	CONSOLE_SCREEN_BUFFER_INFO csbi;
    
    	if (!GetConsoleScreenBufferInfo(output_handle, &csbi))
    	{
    		return;
    	}
    
    	DWORD dwConSize{ static_cast<DWORD>(csbi.dwSize.X * csbi.dwSize.Y) };
    	
    	COORD origin{ 0, 0 };
    	DWORD chars_written;
    	if (!FillConsoleOutputCharacter(output_handle, (TCHAR)' ', dwConSize, origin, &chars_written))
    		return;
    
    	if (!GetConsoleScreenBufferInfo(output_handle, &csbi))
    		return;
    
    	if (!FillConsoleOutputAttribute(output_handle, csbi.wAttributes, dwConSize, origin, &chars_written))
    		return;
    
    	SetConsoleCursorPosition(output_handle, origin);
    }
    
    
    constexpr int maxNumber = 100;
    
    
    char Menu()
    {
    	char input;
    	while (std::cout << "\nMenu\n\n(P)lay\n(Q)uit\nEingabe: ",
    	       !(std::cin >> input) || (input = std::tolower(input), !(input == 'p' || input == 'q')))
    	{
    		std::cerr << "Ungueltige Eingabe!\n";
    		if (!std::cin) {
    			std::cin.clear();
    			std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    		}
    	}
    		
    	clear_console();
    	return input;
    }
    
    
    int GetUserGuess()
    {
    	int guess;
    	while (std::cout << "Deine Vermutung: ",
    	       !(std::cin >> guess))
    	{
    		std::cerr << "Ungueltige Eingabe!\n";
    		if (!std::cin) {
    			std::cin.clear();
    			std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    		}
    	}
    	return guess;
    }
    
    
    bool ValidateUserGuess(int guess, int rightResult)
    {
    	if (guess == rightResult)
    	{
    		std::cout << "Richtig!, die Zahl ist: '" << guess << "'\n\n";
    		return true;
    	}
    
    	std::cout << "Die Zahl ist " << (guess < rightResult ? "groesser" : "kleiner") << " als: '" << guess << "'\n\n";
    	return false;
    }
    
    
    bool ExitGame()
    {
    	int zahl;
    	while (std::cout << "Möchtest du wirklich beenden?\n(1) Ja\n(2) Nein\n",
    	       !(std::cin >> zahl) || !(zahl == 1 || zahl == 2))
    	{
    		std::cerr << "Ungueltige Eingabe!\n";
    		if (!std::cin) {
    			std::cin.clear();
    			std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    		}			
    	}
    
    	if (zahl == 1)
    	{
    		clear_console();
    		std::cout << "Spiel wird geschlossen ...\n\n";
    		Sleep(1500);
    		return true;
    	}
    	
    	return false;
    }
    
    
    void RunGame()
    {
    	std::cout << "Die gesuchte Zahl ist zwischen 1 und " << maxNumber << '\n';
    	int randomNumber{ std::rand() % maxNumber + 1 };
    
    	int tries{};
    	do ++tries;
    	while (!ValidateUserGuess(GetUserGuess(), randomNumber));
    	
    	std::cout << "Du hast " << tries << " Versuche gebraucht!\n";
    }
    
    int main()
    {
    	srand(static_cast<unsigned>(time(nullptr)));
    
    	for (;;) {
    		char input = Menu();
    		switch (input)
    		{
    		case 'p':
    			RunGame();
    			break;
    
    		case 'q':
    			if (ExitGame())
    				return EXIT_SUCCESS;
    		}
    	}
    }
    


  • @DirkB ich würde sagen er führt die funktion RunMenu aus aber das ist wohl falsch?



  • @Swordfish ja ich will jetzt nicht undankber rüberkommen aber du hast das ja alles neu geschrieben und ich als neuling verstehe das jetzt so nicht so ganz



  • @knolly also was da jetzt verändert wurde



  • @knolly sagte in eine funktion aussführen:

    ich würde sagen er führt die funktion RunMenu

    Ja, aber sie wird erneut aufgerufen - das ist dann aber eine neue Instanz der Funktion.
    Da die Funktion aber schon von RunMenu aufgerufen wurde, solltest du auch dahin zurückkehren.



  • @DirkB also sollte ich da was hinschreiben ?
    Sorry ich blick da grad noch nicht komplett durch bin wie gesagt neu hier



  • @knolly Schau dir die Funktion ExitGame von Swordfish an.
    Die fragt den Nutzer, macht noch ein bisschen Fehleingabenkorrektur und gibt false oder true zurück.
    Darauf reagiert (bei Swordfish) sogar main().

    ExitGame ruft keine andere Funktion mehr vom Spiel auf, sondern macht nur eine Sache - den Nutzer fragen, die Antwort einlesen und zurück geben.


Anmelden zum Antworten