Quizspiel in C, Einbau von Jokern, rand Werte/Zufallszahlen "verteilen"



  • Hallo zusammen,
    ich habe in eigenem Interesse vor ein paar Wochen mit der Programmierung in C angefangen. Seitdem arbeite ich mich meistens durch ein Tutorial durch, wo nach und nach neue Befehle behandelt werden und schlage dazu ggf. noch im Buch nach oder google, wenn mich etwas mehr interessiert. Nun habe ich jedoch vor, endlich mal selber etwas zu programmieren, und zwar ein Quizspiel (Die Idee gibt es vermutlich schon tausendfach, aber egal^^).

    Aktueller Stand im Projekt + Wissensstand
    Bisher gibt es 10 Fragen und 3 Leben, pro falscher Antwort wird ein Leben angezogen und bei 0 das Spiel frühzeitig beendet, anderenfalls hat man halt alles richtig beantwortet; soweit kein Problem.

    Nun möchte ich anstatt der drei Leben aber die bekannten drei Joker einbauen. Angefangen habe ich mit dem "Publikumsjoker", der bereitet mir jedoch ein paar Schwierigkeiten.

    Nach der Eingabe von J erfolgt eine Auswahl, welchen Joker man benutzen will; case 1 ist z.Z. o.g. Joker. Wichtig ist mir, dass die richtige Antwort einen eingegrenzten, zufälligen Wert erreicht. Auch das klappt soweit über min und max, so erhält die richtige Antwort immer zwischen 58% und 92% der "Stimmen".

    Ich kenne mich nach eigener Einschätzung relativ gut mit den Grundlagen sowie Verzweigungen und Schleifen aus, habe auch viel mit Variablen rumhantiert. Zu der rand Funktion habe ich bisher noch nicht viel gemacht, der Teilcode dafür stammt aus einem Buch, da ich nicht wusste, wie man Ober/Untergrenzen festlegt. Habe auch mit Arrays und Strings gearbeitet, es fällt mir aber noch schwer, diese dann auch anzuwenden.

    Mein Wunsch bzw. Problem...
    ...ist, dass die drei anderen Antwortmöglichkeiten auch ein Ergebnis anzeigen sollen. Soll heißen, die Differenz bis zur Summe 100, die von der rand Zahl bei der richtigen Antwort abhängt, soll sich auf drei Antworten ungleich verteilen. Wichtig ist mir, dass sie nicht alle den gleichen Wert haben, und dass die Summe aller vier Ergebnisse höchstens 100 sein darf.

    Wird der Joker benutzt, wird -1 gerechnet, sodass der Joker nicht nocheinmal benutzt werden kann. Ist der Joker schon nicht mehr vorhanden (was jetzt hier nicht möglich ist, da nur Frage1 da ist), wird der Text bei else ausgegeben und die Schleife endet.

    Meine Ideen/Fragen
    Idee 1: Die rand Zahl von 100 abziehen, und das Ergebnis (was zwischen 8 und 42 liegt (wegen min max s.o.)), irgendwie auf die anderen drei "verteilen". Geht das auch über rand? Kann ich eine weitere rand Zahl in Abhängigkeit von einer anderen rand Zahl programmieren?
    Idee 2: Ich fange damit an, dass es die Summe 100 gibt, und definiere dann, dass die 3 falschen Antworten im Bereich von 0-20, und die richtige Antwort im Bereich von 50-90 liegt, deren gemeinsame Summe aber nie über 100 werden darf.
    (Idee 3): Ich weiß, dass man auch Werte mit Variablen an andere weitergeben oder zurückgeben kann, vielleicht ist das hier notwendig? Wie genau die Befehle+Syntax sind, habe ich aber noch nicht nachgeschaut, glaube da werde ich mich morgen mal drüber informieren, unabhängig davon, ob das hier für relevant ist.

    **
    Auszug aus dem Code**
    Nicht relevante Sachen wurden entfernt/ersetzt. In diesem Beispiel soll Antwort D richtig sein.

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    
    int randomize(int min, int max)
    {
      int x;
      do
        {
        x=rand();
        } while((x<min)||(x>max));
        return(x);
    }
    
    int main(int argc, char *argv[])
    {
      int Joker,JokerP=1,x,min=58,max=92,Zws1;
      char Frage1;
      time_t tim;
      srand(time(&tim));
    
      printf("Hier stehen Frage und Antworten\nWie lautet deine Antwort? < >\b\b");
      scanf("%c",&Frage1);
      getchar();
      if(Frage1=='J')
        {
        printf("Hier stehen die drei möglichen Joker, Auswahl über 1, 2 oder 3\nDeine Auswahl: < >\b\b");      
        scanf("%i",&Joker);  
        getchar();
        switch(Joker)
          {
          case 1: 
          if(JokerP==1)
            {
            Zws1=100-randomize(min,max); //  Ist nur eine Idee, aber wie mach ich weiter
            printf("Hier steht das Ergebnis:\n\nA: ?\nB: ?\nC: ?\nD: %i%%\n",randomize(min,max));   
            JokerP--;
            system("PAUSE"); // nur zu Testzwecken
            }
          else
            {
            printf("Dieser Joker ist schon verbraucht!");
            system("PAUSE"); // nur zu Testzwecken
            }
          break;
          }           
        }
    }
    

    Geht das überhaupt? Oder ist das unmöglich^^ Freue mich über jede hilfreiche Antwort, vllt. kann mir ja jemand eine Hilfestellung geben, es muss ja nicht gleich der ganze Code sein.



  • Hallo svloga und willkommen im Forum!

    deine Randomize-Methode kann man besser definieren (so daß sie konstante Laufzeit hat ;-):

    int randomize(int min, int max)
    {
      return min + rand() % (max - min);
    }
    

    (irgendwo hier im Forum gibt es noch eine andere bessere Lösung dafür, da hier die Gleichverteilung nicht unbedingt exakt gegeben ist, aber für deine Zwecke reicht diese aus 😉

    Und dein Ansatz mit

    Zws1=100-randomize(min,max);
    

    ist schon der richtige Weg.

    Du kannst nun deine weiteren Zufallszahlen ja auf diesem Ansatz aufbauen:

    int random1 = randomize(min, max);
    int newmax = 100 - random1;
    
    int random2 = randomize(0, newmax);
    newmax -= random2;
    
    int random3 = randomize(0, newmax);
    newmax -= random3;
    
    int random4 = newmax;
    

    (dies kann man sicherlich auch mit einem Array und einer Schleife lösen)

    P.S. Die time_t Variable brauchst du hier nicht, man kann auch einfach

    srand(time(0)); // bzw. srand(time(NULL));
    

    schreiben (da ja nur der Rückgabewert der time-Funktion für srand benötigt wird).



  • Hallo Th69,

    danke für deine Hilfe, habe es nun wie folgt geändert:

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    
    int main(int argc, char *argv[])
    {
      int Joker,JokerP=1,min=58,max=92,Zws1;
      char Frage1;
      srand(time(0));
    
                                                   /* Publikumsjoker */
    
      int randomize(int min, int max)
        {
        return min + rand() % (max - min);
        }
    
      int random1=randomize(min, max);
      int newmax=100-random1;
    
      int random2=randomize(0, newmax);
      newmax-=random2;
    
      int random3=randomize(0, newmax);
      newmax-=random3;
    
      int random4=newmax;
    
                                                  /* Frage 1 */
    
      printf("Hier stehen Frage und Antworten\nWie lautet deine Antwort? < >\b\b");
      scanf("%c",&Frage1);
      getchar();
      if(Frage1=='J')
        {
        printf("Hier stehen die drei möglichen Joker, Auswahl über 1, 2 oder 3\nDeine Auswahl: < >\b\b");      
        scanf("%i",&Joker);  
        getchar();
        switch(Joker)
          {
          case 1: 
          if(JokerP==1)
            {
            printf("Ergebnis:\n\nA: %i%%\nB: %i%%\nC: %i%%\nD: %i%%\n",random4,random3,random2,random1); 
            JokerP--;  
            system("PAUSE"); // nur zu Testzwecken
            }
          else
            {
            printf("Dieser Joker ist schon verbraucht!");
            system("PAUSE"); // nur zu Testzwecken
            }
          break;
          }          
        }
    }
    

    Habe es auch nachvollziehen und verstehen können, kein stumpfes copy&paste 🙂 Und es funktioniert ohne Probleme, habe es mehrmals getestet und immer wieder andere Ergebnisse bekommen. random1 muss ich dann immer in Abhängigkeit von der richtigen Antwort setzen, die anderen drei sind ja egal.

    Th69 schrieb:

    [...]
    (dies kann man sicherlich auch mit einem Array und einer Schleife lösen)

    Ich glaube damit könnte ich das ganze Projekt wesentlich übersichtlicher gestalten, aber mir fällt es weiterhin schwer, mich damit zurechtzufinden. Im Moment nimmt jede Frage knapp 70 Zeilen Code ein, da ich jedes Mal alles neu abfrage, im Prinzip sieht das so aus:
    Fragestellung
    Wird J für Joker eingegeben? Wenn ja, Fallunterscheidung welcher der drei Joker gewünscht ist. Dabei jedes Mal Überprüfung ob der Joker noch vorhanden ist. Jedes Mal neue Berechnung der Wahlergebnisse (bezogen auf obiges Problem, die anderen 2 Joker habe ich ja noch gar nicht drin).
    Wird kein Joker gewählt, wird geprüft ob die richtige Antwort eingegeben wurde. Wenn ja, gehts weiter, wenn nein, wird im Moment noch ein Leben abgezogen (und es geht weiter). Natürlich wird wieder geprüft, ob noch mehr als 0 Leben vorhanden sind, falls nicht, endet das Spiel.

    Das alles bei jeder Frage, bin mal gespannt, ob ich das irgendwie einfacher hinbekomme ^^
    Wer Ideen/Ansätze/Vorschläge hat, immer her damit...
    Danke nochmal an Th69 !



  • svloga schrieb:

    Wer Ideen/Ansätze/Vorschläge hat, immer her damit.

    Nutze Funktionen.
    Wenn du Code mehr als zweimal hinschreiben musst, ist das ein Zeichen dafür, Funktionen dafür zu nutzen/schreiben

    Nutze Arrays.
    Wenn du Variablennamen wie random4,random3,random2,random1 hast, ist das ein eindeutiges Zeichen um Arrays zu Nutzen.
    Das geht auch bei den Jokern.

    Trenne Ein/Ausgabe von der Berechnung.

    Vergib eindeutige Variablen- und Funktionsnamen.
    Lass Funktionen nur das machen, was der Name auch aussagt.

    Im übrigen gibt es in C keine Funktionen die in Funktionen definiert werden.
    (das randomize in main)



  • Hallo,

    bin nun fertig und es klappt ohne Probleme. Habe alle drei Joker in Nebenfunktionen eingebunden, in denen dann jeweils abgefragt wird, welche Nummer die Frage hat und dann eine entsprechende Joker Antwort ausgegeben wird.
    Habe zudem am Anfang ein paar Sachen mit define festgelegt, sodass es am Ende übersichtlicher aussieht.

    Danke für eure Hilfen nochmals.


Anmelden zum Antworten