Zahlenratespiel



  • Hey, ich bin neu hier und ebenso im Bereich des Programmierens. Als eine kleine Übung habe ich am Anfang einen pseudo-Zufallsgenerator programmiert und jetzt daraus ein Ratespiel gemacht. Das Prinzip ist denkbar einfach: Der/die Benutzerin wird aufgefordert, eine Zahl zwischen 1-10 in der Konsole einzugeben und dann wird die eingegebene Zahl mit der erstellten Zahl abgeglichen. Dabei gibt es drei Versuche. Soweit funktioniert das Programm, doch wollte ich es jetzt noch gegen Buchstabeneingaben schützen, das ich mit einer while Schleife und der Funktion isdigit machen wollte. Leider klappt das nicht wie gewollt, wenn der/die Benutzerin jetzt eine Zahl am Anfang eingibt wird das Programm beendet, bei einem Buchstaben kommt eine Fehlermeldung die das Programm im Endeffekt auch beendet.

    int main()
    {
    	int maxVersuche = 3;
    	int Eingabewert; // Eine Zahl zwischen 1 und 10 
    	int Zufallswert; /* Ein vom Computer pseudozufällig generierter Wert*/
    	char Buchstaben[10];
    
    	srand(time(0)); 
    	Zufallswert = rand() % 10 + 1; /* teilt den Wert durch 10 und nimmt den Rest + 1 als pseudo-Zufallszahl*/
    	printf("Bitte geben Sie eine Zahl zwischen 1 und 10 ein: ");
    	scanf("%d || %s", &Eingabewert, &Buchstaben[0]);
    	while (isdigit(Buchstaben[0]) == 0)
    	{
    		int Zahl = atoi(Buchstaben);
    		printf("Sie haben einen Buchstaben eingegeben!\nBitte geben Sie eine Zahl zwischen 1 und 10 ein:");
    		scanf("%d || %s", &Eingabewert, &Buchstaben[0]);
    	}
    	while (Eingabewert < 1 || Eingabewert > 10)
    	{
    		printf("Ihre Eingabe muss zwischen 1 und 10 liegen!\nBitte versuchen Sie es erneut:");
    		scanf("%d", &Eingabewert);
    	}
    int Versuche = 1;
    while (Versuche < maxVersuche && Eingabewert != Zufallswert)
    	{
    		printf("Ihre Eingabe war leider falsch!\n");
    		printf("Sie haben noch %d Versuch(e): ", maxVersuche - Versuche);
    		scanf("%d || %s", &Eingabewert, &Buchstaben[0]); 
    
    		while (isdigit(Buchstaben[0]) == 0)
    		{
    			int Zahl = atoi(Buchstaben);
    			printf("Sie haben einen Buchstaben eingegeben!\nBitte geben Sie eine Zahl zwischen 1 und 10 ein:");
    			scanf("%d || %s", &Eingabewert, &Buchstaben[0]);
    		}
    		while (Eingabewert < 1 || Eingabewert > 10)
    		{
    			printf("Ihre Eingabe muss zwischen 1 und 10 liegen! Bitte versuchen Sie es erneut:");
    			scanf("%d || %s", &Eingabewert, &Buchstaben[0]);
    		}
    
    		Versuche = Versuche + 1;
    	}
    	if (Eingabewert == Zufallswert)
    	{
    		printf("Gratulation, Sie haben richtig geraten!\n");
    	}
    	else
    	{
    		printf("Schade!\nDie Zufallszahl war: %d. \nViel Glueck beim naechsten Mal!", Zufallswert);
    
    	}
    	return 0;
    }
    '''


  • Schreibe bitte in eine Zeile vor Deinem Code ``` und in eine Zeile nach Deinem Code ```. Alternativ markiere Deinen Code und klicke auf das </> in der Toolbar über dem Bearbeitungsfenster.
    Du kannst Deine Beiträge nachträglich bearbeiten. Den Menüpunkt "Bearbeiten" findest Du in dem Drei-Punkte-Menü rechts unter Deinem Beitrag.

    Nochwas: Du postest zwar im C++-Forum aber Dein Code sieht nach C aus. Welche Sprache darf es nun denn sein?



  • @julianmaximilian sagte in Zahlenratespiel:

    scanf("%d || %s", &Eingabewert, &Buchstaben[0]);

    Was soll das machen?



  • @Swordfish sorry, ja es handelt sich um c und danke für den Tipp mit der Darstellung!



  • @manni66 Das soll die Benutzereingabe übers Keyboard einscannen. Entweder eine Zahl oder einen Buchstaben. Und je nachdem, ob es sich um eine Zahl oder einen Buchstaben handelt, soll es in die entsprechende Schleife geleitet werden. bei einem Buchstaben in die isdigit Schleife, bei einer Zahl in die ganz normale weitere



  • Du kannst im Formatstring von scanf() keine bool'schen Operatoren verwenden.

    #include <time.h>
    #include <stdlib.h>
    #include <stdio.h>
    
    enum { MAX_NUMBER = 10 };
    
    void clear(FILE *is)
    {
    	int ch;
    	while ((ch = fgetc(is)) != EOF && ch != '\n');
    }
    
    int main()
    {
    	srand((unsigned) time(NULL));
    	int number_to_guess = rand() % MAX_NUMBER + 1;
    	int guess;
    	do {
    		while (printf("your guess: "), scanf("%d", &guess) != 1) {
    			fputs("please enter a number.\n", stderr);
    			clear(stdin);
    		}
    
    		if (number_to_guess > guess) {
    			puts("The number to guess is bigger.\n");
    		}
    		else if (number_to_guess < guess) {
    			puts("The number to guess is smaller.\n");
    		}
    	} while (guess != number_to_guess);
    }
    

    @julianmaximilian sagte in Zahlenratespiel:

    danke für den Tipp mit der Darstellung!

    Es ist am Anfang und am Ende ``` (drei Backticks), nicht ''' (Apostrophe).



  • und welche Möglichkeit habe ich dann alternativ, um Buchstaben einzulesen? sorry, falls die Frage etwas dumm ist, ich bin wie gesagt blutiger Einsteiger auf dem Gebiet



  • @julianmaximilian sagte in Zahlenratespiel:

    und welche Möglichkeit habe ich dann alternativ, um Buchstaben einzulesen?

    Warum willst Du das?



  • Du kannst mittels des Rückgabewertes überprüfen, ob ein Wert eingelesen wurde (d.h. bei einem Buchstaben als erstes Zeichen wird 0, statt 1, zurückgegeben):

    int wert;
    int result = scanf("%d", wert);
    if (result == 1)
    {
      // Zahl wurde in der Variablen 'wert' eingelesen
    }
    else
    {
      // Keine Zahl eingelesen, z.B. bei einem Buchstaben am Anfang
    }
    

Anmelden zum Antworten