c Spiel bricht immer ab.

Adi | tmine

Erfahrenes Mitglied
Hallo Leute könnte mir mal einer Erklären wieso mein Spielchen immer abbricht, wenn man die Zahl errät?

hier der Code: (wäre froh wenn das ma einer testen könnte)

Code:
/* Zahlenraten */
#include <stdlib.h>
#include <time.h>

int main(){
srand(time(0));

int zufallzahl, userzahl, versuche=0;
char nochmals;

do{
      zufallzahl = rand() % 100;
      userzahl = 0;
      versuche = 0;
printf("Ich habe mir eine Zahl zwischen 1 und 100 gemerkt! <%i>\n", zufallzahl);
   do{
      printf("rate mal!\n");
      scanf("%i",&userzahl);
      versuche++;
      if (userzahl < zufallzahl){
         printf("Meine Zahl ist groesser als %i ! \n", userzahl);
         }
      if (userzahl > zufallzahl){
         printf("Meine Zahl ist kleiner als %i ! \n", userzahl);
         }
    }while (userzahl != zufallzahl);
       printf("Super Sie haben die Zahl %i nach %i Versuchen erraten\n", zufallzahl, versuche);
       printf("nochmals Spielen? (j/n)\n");
       scanf("%c", nochmals);
}while (nochmals == 'j');
   printf("\n Vielen Dank fuers mitspielen.\n");
   printf("\n");
   printf("Das Spiel wird beendet\n");
sleep(3000);
return 0;
}

thx

ps: die Zahl steht dort in den <> ^^ für alle, die nicht Stunden lang testen wollen ;)
 
Ich habe es mir mal angeschaut und (für mich ;) ) lesbar formatiert:

Code:
/* Zahlenraten */
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <dos.h>
#include <conio.h>

int main()
{
  srand(time(0));

  int zufallzahl, userzahl, versuche=0;

  do
  {
    zufallzahl = rand() % 100;
    userzahl = 0;
    versuche = 0;
    printf("Ich habe mir eine Zahl zwischen 1 und 100 gemerkt! <%i>\n", zufallzahl);

    do
    {
      printf("rate mal!\n");
      scanf("%d", &userzahl);

      versuche++;
      if (userzahl < zufallzahl) printf("Meine Zahl ist groesser als %d ! \n", userzahl);
      if (userzahl > zufallzahl) printf("Meine Zahl ist kleiner als %d ! \n", userzahl);
    } while (userzahl != zufallzahl);

    printf("Super Sie haben die Zahl %d nach %d Versuchen erraten\n", zufallzahl, versuche);
    printf("nochmals Spielen? (j/n)\n");
  } while (getch() != 'n');

  printf("\nVielen Dank fuers mitspielen.\n");
  printf("\n");
  printf("Das Spiel wird beendet\n");
  sleep(3);
  return 0;
}
Ich weiß nicht, wie es allgemein aussieht, aber ich lese normalerweise keine Tastatureingaben direkt mit scanf() aus. In meiner Hilfe (Borland Developer Studio) haeb ich dazu Folgendes gefunden:
Hinweis:
scanf erbringt oft unerwartete Ergebnisse, wenn Sie von dem erwarteten Muster abweichen. Sie müssen scanf Informationen darüber liefern, wie sich diese Funktion am Ende einer Zeile synchronisieren kann.

Die Kombination von gets oder fgets gefolgt von sscanf ist einfach und sicher, und daher auch gegenüber scanf vorzuziehen.

Irgendwie kann ich mich auch nicht so recht erinnern, daß ich mal scanf() wirklich direkt verwendet habe. Wenn dann war das immer sscanf(). :)
Es ist zwar keine 100%ige Antwort auf deine Frage ("wieso bricht das Spiel ab?") aber ich vermute mal schwer, daß scanf() im Gegensatz zu getch() nicht so ohne weiteres mit der Tastaturabfrage in der while-Klausel zurecht kommt.

Evtl. kann ja ein echter C-Crack Aufklärung darüber geben.
 
Das komische ist ja, dass es immer nach der j /n Frage abbricht.

:confused:

aber Danke für deine Lösung ich wusste gar nicht, dass es auch so geht^^ komisch is nur eigentlich sollte das so wie ichs gemacht habe gehen soweit ich weiss ^^
 
Zuletzt bearbeitet:
Dein Programm ist gar nicht C-konform und das sleep brauchst Du auch nicht.
Ansonsten braucht das scanf mit dem %c Parameter natürlich auch die Speicheradresse vom Char (also &nochmals).
Vom Enter zuvor gibts aber schon das Signal beim Taste loslassen, also ist Scanf völlig fehl am platz und muss durch nochmals = getch() ersetzt werden.
 
Das komische ist ja, dass es immer nach der j /n Frage abbricht.
Nein, es ist überhaupt nicht komisch, es ist genau das, was programmiert wurde.

Also, dein Programm lautet:

while (nochmals == 'j')

Die while-schleife läuft also solange, wie die Variable nochmals den Wert 'j' hat. Dein Programm aber bricht immer an dieser Stelle ab.

Schlußfolgerung: Der Wert von "nochmals" ist immer ungleich 'j'

Fazit: Du mußt die Frage klären, welchen Wert "nochmals" hat und dann die Erklärung finden, weswegen das so ist.

Naiver Ansatz: Gibt den Wert von "nochmals" doch einfach mit printf aus.

Profi-Ansatz: Benutz einen debugger und setz einen breakpoint.

Was den Fehler im ursprünglichen Programm angeht... Du schreibst:

scanf("%c", nochmals);

Dummerweise erwartet scanf aber einen Zeiger auf eine variable, also müßte es lauten:

scanf("%c", &nochmals);

Ansonsten würde ich auch eher getch() nehmen als scanf...
 
thx für die vielen Antworten, aber ich habs grad selber geschafft ^^
hier der code Fals jemand sowas machen will^^ und ihr Profis könnt mich noch n bissel kritisieren was ich noch alles falsch mache ;)

Code:
/* Zahlenraten */
/* -----------------------------------
   Autor: tmine
   Datum 2.10.2006
   Beschreibung: Spiel, Zahlenraten
   -----------------------------------
*/

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <dos.h>
#include <conio.h>

int main()
{
//Zufallsgenerator inizialisieren
  srand(time(0));
//Variablen deklarieren
  int zufallzahl, userzahl, versuche=0, top, auswahl, beenden;
  char nochmals, fehler;

//um Fehler zu vermeiden
versuche = 0;
beenden = 0;
fehler = 'n';
top= 50;
do{
    //Menu
        //1.Ausgabe (Titel des Spiels)  
        printf(" -------------------------------\n");
        printf("   Willkommen zum Zahlenraten \n");
        printf("  Ein Spiel von tmine\n "); 
        printf("-------------------------------\n\n\n");
        printf("\n 1.Spielen? \n");
        printf("\n 2.Ihr bestes Ergebniss bisher? \n");
        printf("\n 3.Beenden \n");
        auswahl = getch();
    //Beenden des Spiels, Verabschiedung
    if (auswahl == '3'){
       printf("\n\n\nVielen Dank fuers mitspielen.\n");
       printf("\n");
       printf("Das Spiel wird beendet\n");
       sleep(2000);
       return 0;
    }
    //top anzeige
    while (auswahl == '2'){
        //1.Ausgabe (Titel des Spiels)
        system("cls");  
        printf(" -------------------------------\n");
        printf("   Willkommen zum Zahlenraten \n");
        printf("  Ein Spiel von tmine\n "); 
        printf("-------------------------------\n\n\n");
        printf("\n Ihr Top Ergebniss bisher:\n");
        printf("\n %i Versuche\n", top);
        auswahl = 0;
        printf("\n Fuer weiter druecken Sie eine Beliebige Taste\n");
        getch();
        system("cls");
    }
    //Spiel
    while (auswahl == '1'){
        //1.Schleife
        do{
            //Zufallszahl in eine Variable einlesen und Variablen definieren
                zufallzahl = rand() % 100;
                userzahl = 0;
                versuche = 0;
            //1.Ausgabe (Titel des Spiels) 
            system("cls"); 
            printf(" -------------------------------\n");
            printf("   Willkommen zum Zahlenraten \n");
            printf("  Ein Spiel von tmine\n "); 
            printf("-------------------------------\n\n\n");
                printf("\n\n Ich habe mir eine Zahl zwischen 1 und 100 gemerkt!<%i> \n\n", zufallzahl);
            //2.Schleife
                do {
            //3.Ausgabe (nach einer Zahl fragen und diese dann einlesen
                  printf(" raten Sie mal:");
                  scanf("%d", &userzahl);
            //Versuche +1 zählen
                  versuche++;
            //Abfagen ob die Zahl grösser oder kleiner ist.
                  if (userzahl < zufallzahl) printf("\n Meine Zahl ist groesser als %d ! \n\n", userzahl);
                  if (top > versuche)top=versuche;
                  if (userzahl > zufallzahl) printf("\n Meine Zahl ist kleiner als %d ! \n\n", userzahl);
            //2.Schleife fertig
                } while (userzahl != zufallzahl);
            //Erraten und Genie ausgabe
                if (versuche == 1) printf("\n Sie sind ein Genie, Sie haben die zahl %i in nur %i Versuch erraten\n", zufallzahl, versuche);
                if (versuche > 1) printf("\n Herzlichen Glueckwunsch, Sie haben die Zahl %d in %d Versuchen erraten\n", zufallzahl, versuche);
                printf("\n nochmals Spielen? (j/n)\n");
                nochmals = getch();
                printf("\n\n");
            auswahl=0;
            system("cls");
        //1.Schleife fertig
        } while (nochmals=='j');
    }
}while (nochmals != 'j' );
}
 
Zuletzt bearbeitet:
Zurück