Ratespiel



  • Hey Leute, also ich bin gerade dabei ein Ratespiel zu abstel doch in der Funktion "Option_Funktion" passiert ein Fehler ud zwar:
    Bei der ersten switch Abfrage, wenn ich da die Höhe bestimm und dann die Versuche auswähle und dann auf "Zum Spiel" gehe, muss ich bis zu 3-4 mal die Zahl 3 eingeben bis ich zur do-while Schleife komme und normalerweise soll man ja durch durch drücken auf 3 nicht nocheinmal in die Option_Funktion kommen.
    Hab gedacht es liegt am buffer-overflow, doch auch mit fflush gehts nicht.
    Habt ihr ned Idee??
    Das Programm ist noch nicht fertig, deswgen stimmt das ganze Zeugs mit count nicht so 😉

    /* Ratespiel.c */
    
    #include <stdio.h>
    #include <stdlib.h>
    
    int count = 0, erraten = 0 ,EWert;
    int Auswahl;
    int ZWert, MaxZahl;
    
    Option_Funktion(void)
    {
        printf("--------Optionen--------\n");
        printf("1.Hoehe der Zufallszahl\n2.Versuche\n3.Zum Spiel\n");
        scanf("%d", &Auswahl);
        switch(Auswahl)
        {
            case 1  : printf("Hoehe der Zufallszahl:\n\n");
                      printf("1. 1-10\n2.1-50\n3.1-100\n");
                      scanf("%d", &Auswahl);
                      switch(Auswahl)
                      {
                          case 1  : MaxZahl = 10;
                                    Option_Funktion();
                                    break;
                          case 2  : MaxZahl = 50;
                                    Option_Funktion();
                                    break;
                          case 3  : MaxZahl = 100;
                                    Option_Funktion();
                                    break;
                      }
    
            case 2  : printf("Versuche\n\n");
                      printf("1. 3\n2. 5\n3. 10\n");
                      scanf("%d", &Auswahl);
                      switch(Auswahl)
                      {
                          case 1  : count = 3;
                                    Option_Funktion();
                                    break;
                          case 2  : count = 5;
                                    Option_Funktion();
                                    break;
                          case 3  : count = 10;
                                    Option_Funktion();
                                    break;
                      }
    
            case 3  :   break;
        }
    }
    
    int main(void)
    {
        Option_Funktion();
        srand(time(NULL));
        ZWert = rand() &MaxZahl;
        printf("\t\t!Willkommen zum Ratespiel!\n");
    
        do
        {
            printf(" Bitte geben Sie eine Zahl zwischen 1-10 ein: ");
            scanf("%d", &EWert);
            if(EWert == ZWert)
            {
                printf("Korrekt!Die gedachte Zahl war: %d\n", ZWert);
                printf("Sie haben es mit %d Versuchen geschafft!", count+1);
                erraten = 1;
            }
            else
            {
                (EWert > ZWert) ? printf("Kleiner!") : printf("Groesser!");
                count++;
            }
        }while( (count != 20) && (erraten == 0) );
    
        if(count = 3)
        {
            printf("Zu viel Versuche!!!!");
            return EXIT_SUCCESS;
        }
    
    }
    


  • Du rufst ja innerhalb Option_Funktion() im inneren switch-case Block ja jedesmal wieder Option_Funktion() auf.
    Ist klar, daß du die dann auch bis zu 3x mit der Auswahl 3 verlassen mußt.

    1.Option_Funktion()
     wähle 1-3
        1 ausgewählt 2.Option_Funktion()
            wähle 1-3
                2 ausgewählt 3.Option_Funktion()
                    wähle 1-3
                        3 ausgewählt
                        Verlasse 3.Option_Funktion()
                3 ausgewählt
                Verlasse 2.Option_Funktion()
     3 ausgewählt
     Verlasse 1.Option_Funktion()
    Willkommen zum Ratespiel
    


  • Du verwendest du Funktion Option_Funktion rekursiv, das ist für Anfänger ungeeignet. Versuche besser zu kapseln, d.h. für die eigentliche Raterei eine eigene Funktion mit ZUVOR separat abgefragten Vorgabewerten als Parameter zu verwenden.



  • eh, für was den? mach das ganze in der funktion "option_funktion" als schleife.

    sprich:

    while(back!=0){
    /*
    Die switchanweisungen
    */
    }
    

    fertig... mehr is da nicht. lass im moment die finger von der rekursiven verwendung der funktionen. die kannst du im laufe deiner ausbildung (oder was
    weiß ich) immer noch erlernen.

    und nach:

    case 1  : printf("Hoehe der Zufallszahl:\n\n");
                      printf("1. 1-10\n2.1-50\n3.1-100\n");
                      scanf("%d", &Auswahl);
                      switch(Auswahl)
                      {
                          case 1  : MaxZahl = 10;
                                    Option_Funktion();
                                    break;
                          case 2  : MaxZahl = 50;
                                    Option_Funktion();
                                    break;
                          case 3  : MaxZahl = 100;
                                    Option_Funktion();
                                    break;
                      }
    

    umbedingt ein break, sonst geht er dir ins case 2 auch noch rein =b

    und mach die variablen nicht global, ist unschön so zu programmieren. auch später bei threads lässt du es am besten und verwendest pointer. übergib sie
    einfach der funktion als pointer... sprich so:

    void Option_Funktion(int *count, int *MaxZahl); // Prototyp oder Funktionskopf
    Option_Funktion(&count, &MaxZahl); // Aufruf
    

    und die anderen variablen: Auswahl, ZWert, erraten und EWert

    deklariere sie in den funktionen in denen sie benötigt werden. ist schöner und übersichtlicher als wenn du am anfang noch vor der ersten funktion 100 variablen stehen hast und schlussendlich nicht mehr weißt wo sie hingehören.

    hoffe das hilft dir und du wählst einen schönen persönlichen programmierstil
    der auch für andere leserlich ist =b

    gruß
    ITEDVO 🙂


Anmelden zum Antworten