Mastermind!



  • Hallo,
    ich habe hier ein kleines Problem. Ich will das Spiel Mastermind programmieren und habe zu Beginn des Spiels eine Auswahl, ob man Mastermind oder Supermastermind (A oder 😎 spielen will! Jedoch will ich, dass wenn man hier einen anderen Buchstaben eingibt, aufgefordert wird, nochmal A oder B einzugeben!
    Da weiß ich noch nicht so recht wie ich das machen soll!
    Es geht um Zeile 86 und folgendes!

    Hier mein bisheriger Code! Und nein, ich studiere nicht Informatik, sondern brauch das nur damit ich endlich mal den Programmierkurs abschließen kann 😛

    # 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
    
        srand(time(NULL));                                            // Zufall initialisieren
    
    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!!");
        return 0;
    
                  }
    
        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');                                 
    
    }
    


  • Du musst die Eingabeschleife einfach solange wiederholen, bis der Benutzer eine gültige Eingabe macht. Die Eingabeschleife würde dann deinen scanf-Ausruf und die paar printf's davor beinhalten.



  • Ich habs jetzt so gelöst!

    # 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
    
        srand(time(NULL));                                            // Zufall initialisieren
    
    do  {
    
        printf("\n Bitte Spielvariante waehlen!");
        printf("\n\n A: Mastermind");
        printf("\n B: SuperMastermind");
        printf("\n N: Programm verlassen");
        printf("\n\n A,B oder N? ");
        scanf(" %c",&wahl);                                           // Spielvariante wählen
    
        start: 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!");                                                             // Regeln erklären
    
        codelength=4;versuchmax=10;n=6;                                                         // Variablen der Spielvariante anpassen
    
        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.");                            // Regeln erklären
        printf("\n\n Viel Spass!"); 
    
        codelength=5;versuchmax=20;n=8;                                                          // Variablen anpassen
    
        break;      
    
        case 'N':
    
        exit(1);                                                                                 //Programm verlassen                                      
    
        default:
    
        printf("\n Bitte A,B oder N eingeben!!");
        printf("\n\n A,B oder N? ");
        scanf(" %c",&wahl);  
        goto start;
    
                  }
    
        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 %d 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');                                 
    
    }
    


  • Pack die ganzen Textausgaben doch bitte in entsprechende Strings bzw. Char Arrays und gibt dann über eine einzige printf Funktion dann den entsprechenden String aus.
    Ist ja furchtbar der Code.



  • Schlechte Lösung. goto ist böse, mach es lieber so, wie ich vorgeschlagen habe.


Anmelden zum Antworten