Zeitfunktion einbauen



  • Hallo liebes Forum!

    Hab wieder einmal eine Frage, diesmal für mich privat.

    Mag nicht die eleganteste Programmierung sein, aber es funktioniert so wie ich es mir vorgestellt habe:

    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    #include <time.h>
    
    int main(int argc, char* argv[])
    {
    
        srand(time(0));
        int eingabe,zahl1,zahl2,ergebnis;
        int punkte=0;
        int leben=3;
    
        Beginn:
        zahl1=rand() % 20 + 1;
        zahl2=rand() % 20 + 1;
        ergebnis=zahl1*zahl2;
    
        printf("%d Leben // %d Punkte",leben,punkte);
        printf("\n\n%d x %d",zahl1, zahl2);
        printf("\nErgebnis: ");
        scanf("%d",&eingabe);
    
        if(ergebnis==eingabe)
        {
            printf("Korrekt!\n");
            punkte=punkte+1;
            goto Beginn;
        }
        else
        {
            leben=leben-1;
            if(leben==0) {printf("\nGAME OVER\n") ;goto Ende;}
            goto Beginn;
        }
        Ende:
        printf("Finale Punktezahl: %d Punkte",punkte);
        getch();
        return 0;
    }
    

    Nun möchte ich aber noch einbauen, dass für die Eingabe nur max. 10 Sekunden bleiben, sonst springt er automatisch zu Else, also leben-1;
    Wie kann man so etwas realisieren?



  • Kennste Schleifen?
    Dann brauchste auch kein goto.
    Und dein Problem lässt sich nur mit Threads lösen.



  • über die funktion clock() aus time.h

    könnte so aussehen:

    #include <time.h>
    // .
    // .
    // .
    unsigned int timer_end=clock()+(10*CLOCKS_PER_SEC);
    while(clock() < timer_end) 
    {
         // hier das zeug, was WÄHREND den wartesekunden getan werden soll
    }
    // hier das zeug, was NACH 10 sekunden ausgeführt wird
    

  • Mod

    Nathan schrieb:

    Und dein Problem lässt sich nur mit Threads lösen.

    "Nur" ist ein sehr starkes Wort. Eine Möglichkeit ohne Threads wäre, nicht-blockierende Eingabefunktionen zu benutzen (systemabhängig) und eine zeitgeregelte Schleife drumherum zu machen. So wie von freudlos vorgeschlagen.



  • SeppJ schrieb:

    Nathan schrieb:

    Und dein Problem lässt sich nur mit Threads lösen.

    "Nur" ist ein sehr starkes Wort. Eine Möglichkeit ohne Threads wäre, nicht-blockierende Eingabefunktionen zu benutzen (systemabhängig) und eine zeitgeregelte Schleife drumherum zu machen. So wie von freudlos vorgeschlagen.

    Noch einfacher wäre alarm(10) aufrufen und bei SIGALRM die blockierende Einlesefunktion abzubrechen.



  • Super, danke!

    Habe alles in Schleifen gepackt und clock() verwendet mit 10 Sekunden, dann immer am Anfang der Schleife auf "aktuelle Zeit + 10 Sekunden" gesetzt, wenn ich aber innerhalb einer einzelnen Frage zu lange brauche, dann ist es TIME OVER.

    Perfekt, funktioniert!

    lg

    Michael


Anmelden zum Antworten