Mastermind programmieren?



  • Hallo,
    ich muss für ein Projekt an der Uni das Spiel Mastermind in C umsetzen.Der Algorithmus passt soweit. Nur habe ich das Problem, dass ich am Ende, wenn die Runde zu Ende ist, eine neue starten möchte. Da ich zwei verschiedene Mastermindvarianten machen will, soll dann am Ende jeder Runde die Möglichkeit gegeben werden, auszuwählen welche man spielen will.
    Am Anfang geht das noch! Aber sobald die erste Spielrunde fertig ist, kann ich nicht mehr auswählen. Was habe ich hier falsch gemacht?

    Und ja ich studiere nicht Informatik^^ Das brauch ich nur für einen Kurs in meinem Studiengang!

    # include <stdio.h>
    # include <stdlib.h>
    # include <time.h>
    
    long vergleiche(long n,long code[],long eingabe[]) {
         long k,i,s=0,r=0;                                          // Deklarationen
    
         for(i=1;i<=n;i++)  if(code[i]==eingabe[i]) r++ ;
         printf("\n An richtiger Position: %ld",r);                 // an richtiger Position
    
         for(k=1;k<=n;k++) {
             for(i=1;i<=n;i++) {
                 if(code[k]==eingabe[i])  {s++; 
                                           eingabe[i]=0;
                                           break; 
                                           }
                  }
                 }
         printf("\n An falscher Position:  %ld",s-r);                // an falscher Position
         return r;
         }
    
    long lese_code(long k,long n,long eingabe[]) {
             long i,fehler=0;
             for(i=1;i<=n;i++) {
                          scanf("%ld",&eingabe[i]);                  // Code einlesen
                          if(eingabe[i]<1||eingabe[i]>k) fehler=1;   // Code auf Richtigkeit überprüfen
                               }
                          return fehler;                                   
                                    }
    
    int main() {
    
        long code[6],eingabe[6],i,k=0,versuch=0,codelength,versuchmax,n;
        char wahl;                                                    // Deklarationen
    
    do  {
    
        printf("\n Bitte Spielvariante waehlen!");
        printf("\n\n A: Mastermind");
        printf("\n B: SuperMastermind");
        printf("\n\n A oder B? ");
        scanf("%c",&wahl);                                           // Spielvariante wählen
    
        switch(toupper(wahl)) {
    
        case 'A':
    
        printf("\n Logikspiel Mastermind\n");
        printf("\n Regeln:");
        printf("\n Zu Beginn generiert der Computer einen 4-stelligen Zahlencode,");
        printf("\n der aus den Ziffern 1-6 besteht.");
        printf("\n Der Spieler muss diesen Code erraten");
        printf("\n Hierzu muss ein Vergleichscode eingegeben werden.");
        printf("\n Der Computer gibt nun an, wie viele Zeichen an der richtigen ");
        printf("\n Stelle stehen und wie viele zwar richtig, jedoch falsch platziert sind.");
        printf("\n Die Anzahl der Versuche ist auf 10 beschraenkt.");
        printf("\n\n Viel Spass!");
    
        codelength=4;versuchmax=10;n=6;
    
        break;
    
        case 'B':  
    
        printf("\n Logikspiel SuperMastermind\n");
        printf("\n Regeln:");
        printf("\n Zu Beginn generiert der Computer einen 5-stelligen Zahlencode,"); 
        printf("\n der aus den Ziffern 1-8 besteht.");
        printf("\n Der Spieler muss diesen Code erraten.");
        printf("\n Hierzu muss ein Vergleichscode eingegeben werden.");
        printf("\n Der Computer gibt nun an, wie viele Zeichen an der richtigen ");
        printf("\n Stelle stehen und wie viele zwar richtig, jedoch falsch platziert sind.");
        printf("\n Die Anzahl der Versuche ist auf 20 beschraenkt.");
        printf("\n\n Viel Spass!"); 
    
        codelength=5;versuchmax=20;n=8;
    
        break;                                                        // Regeln erklären
    
        default:
    
        printf("\n A oder B eingeben!!");
                  }
    
        srand(time(NULL));
        for(i=1;i<=codelength;i++)   code[i]=rand()%n+1;
        for(i=1;i<=codelength;i++) printf("%d",code[i]);                      // Zufallscode generieren  
    
            while(k!=codelength&&versuch<versuchmax) {                        // Spiel starten
        printf("\n\n %ld.ter Versuch",++versuch);
        printf("\t Ihr Code: "); 
        if(lese_code(n,codelength,eingabe)) {
                                printf("\n Bitte nur Zahlen zwischen 1 und %d!",n);
                                printf("\n Bitte nochmal eingeben! ");
                                versuch--;
                                continue;                                     // Code lesen + Fehlerwarnung
                                   }
    
        k=vergleiche(codelength,code,eingabe);                                // Code vergleichen
                        } 
        if(versuch>=versuchmax) {
                       printf("\n\n Sie haben zu viele Versuche benoetigt!");
                       printf("\n Der richtige Code war ");
                       for(i=1;i<=codelength;i++) printf("%d ",code[i]);
                       }                                                      // Zu viele Versuche benötigt
        else {
              printf("\n\n Herzlichen Glueckwunsch!! Ihr Code ist richtig!");
              printf("\n Sie haben dafuer %ld Versuche gebraucht!",versuch);
              }
        k=0; versuch=0;                                                      // Variablen für neue Runde zurücksetzen               
        printf("\n\n Neues Spiel? (j/n) ");fflush(stdin);                    // Neues Spiel? 
    
       }
    
    while( toupper(getchar())=='J');                                 
    
    }
    

  • Mod

    Da du unnötig viel irrelevanten Code postest, das Programm bei mir sowieso nicht funktioniert, grauenhaft eingerückt ist und zudem noch ein paar andere Fehler hat (der Formatspezifizierer von long int ist %ld), kann man nur in's Blaue raten: Mach mal aus scanf("%c",&wahl); ein scanf(" %c",&wahl);



  • Wenn irgendetwas anderes als 'j' oder 'J' kommt, beendet sich dein Programm.
    Da fflush(stdin) undefiniertes Verhalten zeigen kann, braucht man da jetzt nicht weiter darüber nachdenken.
    Biete doch die Option 'E' wie Ende in deinem Menue an und wiederhole immer.

    Das srand(time(NULL)); gehört an den Programmanfang. Das braucht man nur einmal im ganzen Programm aufrufen.


  • Mod

    DirkB schrieb:

    Da fflush(stdin) undefiniertes Verhalten zeigen kann, braucht man da jetzt nicht weiter darüber nachdenken.

    Ach deswegen bleibt das Programm bei mir hängen. Hatte mir den Quelltext jetzt gar nicht so genau angeguckt. Und da sieht man mal, was undefiniertes verhalten in der Praxis bedeutet. Wäre doch ein wunderbarer Vorführeffekt gewesen, wenn es auf dem Rechner des Tutors/Profs nicht funktioniert ➡ 0 Punkte.



  • Ich habe die Fehlerbeschreibung etwas missverstanden.
    Darum habe ich nicht wieder oben nachgesehen 🙄



  • Ok ich hab jetzt aus scanf("%c",&wahl) einfach scanf(" %c",&wahl) gemacht. Und erstaunlicherweise funktionierts^^ Aber kann mir mal einer erklären woran das jetzt liegt?


  • Mod

    http://www.cplusplus.com/reference/clibrary/cstdio/scanf/

    string that contains one or more of the following items:

    c: Single character: Reads the next character.
    Whitespace character: the function will read and ignore any whitespace characters (this includes blank spaces and the newline and tab characters) which are encountered before the next non-whitespace character. This includes any quantity of whitespace characters, or none.



  • Wobei hier das Newline überlesen werden soll.
    Das ist noch im Eingabepuffer von einer vorhergehenden Aktion (Eingabe von 'j')
    Da das \n aber nicht zu einer Zahl passt, liest es scanf() auch nicht ein.



  • scanf ignoriert immer Whitespaces direkt vor alle Formatspezifizierern außer %c und %[].


Anmelden zum Antworten