Hilfe => komm nicht mehr weiter...



  • Guten Abend liebe Programmierer,

    ich habe ein Problem bei einem C-Programm, es nennt sich Mastermind. Die Aufgabenstellung ist ein Mastermindprogramm zu erstellen... und ich sitze seit Tagen fest und weiß nicht mehr weiter... mittlerweile weiß ich, dass meine Felder keine Zahlen speichern, ich weiß nicht wieso... Vielleicht könnt ihr, da ihr wohl mehr Erfahrung habt als ich => Anfängerin, mir sagen wo mein Fehler genau ist und mir vielleicht ein Anstupser geben könntet wie ich den nicht mehr hab...

    Hier wäre die Main.c :

    #include <stdio.h>
    #include "main.h"
    #include <time.h>
    #include "shuffle.h"
    #include <stdlib.h>
    
    #define MAX_WIEDERHOLUNGEN 10
    #define MAX_FELDER 4
    #define MAX_ZAHLEN 6
    int main (){
    
        begruessung();
        while(1) {
            int wiederholungen;
            int check;
            char abfrage;
    
            wiederholungen=0;
            check=0;
    
            printf("\n[s]tart, [e]nde: ");
            scanf("%c",&abfrage);
    
            fflush(stdin);
    
                if(abfrage== 'e') return 0;
    
        /*initialisieren des Arrays mit Werten von 1 bis MAX_Zahlen. Vertauschen der Werte =Y Funktion shuffle(…)*/
                    erzeugeZuRaten();
                    while((wiederholungen<MAX_WIEDERHOLUNGEN)&&(check==0)) {
                        ausgabeHistorie(wiederholungen);
                        eingabeSchaetzwerte(wiederholungen);
                        auswertungSchaetzwerte();
    
                        temp =istAllesRichtig();
                        if(temp == 1) {
                            printf("\nDu hast es geschafft!!!\n");
                            check=1;
                        }else {
                            schaetzwerteZuHistorie(wiederholungen);
                            ergebnisZuHistorie(wiederholungen);
                            ++wiederholungen;
                        }
                    }
        }
    }
    
    void begruessung(){
        printf("*****************************************\n");
        printf("************* Mastermind ****************\n");
        printf("*****************************************\n");
    
    }
    
    void erzeugeZuRaten(){
    
        printf("_______________________________________\n");
    
        printf("|????????|????????|?????????|??????????|\n");
    
        printf("_______________________________________\n");
    
        int b = 0;
    
        /*srand(time(NULL));
        for(; b < MAX_ZAHLEN; b++){
            zuRaten[b] = rand() % 6;
        }*/
        int a = 0;
        for(; a < MAX_ZAHLEN ;a++){
            zuRaten[a] = a+1;
        }
        shuffle(zuRaten, MAX_FELDER);
    
    }
    
    void ausgabeHistorie(int wiederholungen){
    
        int a = 0;
        int b = 0;
        int i = 0;
    
        if(wiederholungen > 0){
            for(; a < wiederholungen; a++){
                for(; b < MAX_FELDER; b++){
                    printf("| %d  |", geratenHistorie[a][b]);
                }
            }
    
            printf("\t");
            printf("\t");
            printf("\t");
    
            for(; i < MAX_FELDER; i++){
                if(ergebnisHistorie[wiederholungen][i] == 0){
                    printf("-");
                }else if(ergebnisHistorie[wiederholungen][i] == 1){
                    printf("o");
                }else if(ergebnisHistorie[wiederholungen][i] == 2){
                    printf("+");
                }
            }
            printf(" \n");
            printf(" \n");
        }
    }
    
    void eingabeSchaetzwerte(){
    
        int i = 0;
    
        for(; i < 4; i++){
            printf("\nGeben Sie Wert zwischen 1 bis 6 ein: ");
            scanf("%i", &geraten[i]);
                if(geraten[i] > 6){
                    printf("Bitte nur eine Zahl kleiner gleich 6 eingeben: ");
                    scanf("%i", &geraten[i]);
                }
        }
    }
    
    void ergebnisZuHistorie(int wiederholungen){
    
        int j = 0;
    
        for(; j < MAX_FELDER; j++){
            ergebnisHistorie[wiederholungen][j] = ergebnis[j];
        }
    }
    
    int istAllesRichtig(){
    
        int i;
        int j;
    
        int correct;
    
        for (i = 0;i < MAX_FELDER; i++){
          for(j = 0;j < MAX_FELDER; j++){
              if(geraten[i] == zuRaten[j]){
                if(i == j){
                    correct++;
                }
            }
          }
        }
        if(correct == MAX_FELDER){
            return 1;
        }else
        return 0;
    }
    
    void  schaetzwerteZuHistorie(int wiederholungen){
    
        int i = 0;
    
        for(; i < MAX_FELDER; i++){
            geratenHistorie[wiederholungen][i] = geraten[i];
    
        }
    }
    
    void auswertungSchaetzwerte(){
    
        int i = 0;
        int j = 0;
    
        for(; i < MAX_FELDER; i++){
            for(; j < MAX_FELDER; j++){
                if(geraten[i] == zuRaten[j]){
                    ergebnis[i] = 1;
                    if(i == j){
                        ergebnis[i] = 2;
                    }
                }
            }
        }
        ergebnis[i] = 0;
    }
    

    Die shuffle Funktion:

    #include <stdio.h>
    #include <time.h>
    #include <stdlib.h>
    #include <math.h>
    #include "main.h"
    
    #include "shuffle.h"
    #define MAX_WIEDERHOLUNGEN 10
    #define MAX_FELDER 4
    #define MAX_ZAHLEN 6
    
    void shuffle(int *feld, int anzahl) {
    
         int i;
         int temp;
         int pos;
    
         i=0;
         pos=0;
         temp=0;
    
         /*rand zur Ermittlung von Zufallszahlen einrichten.
         Ansonsten erhalten wir immer dieselben Werte*/
    
         for(;i<anzahl;i++) {
    
            srand(time(NULL));
    
            pos = i + (rand() % (anzahl-i));
    
            temp = feld[i];
            feld[i] = feld[pos];
            feld[pos] = temp;
    
         }
    
    }
    

    Wäre wirklich lieb von euch wenn ihr mir weiterhelfen könntet...

    LG Resi



  • Setzt das Programm erst mal in Codetags.
    Schreibe [ code="c" ] an den Anfang des Codes und [ /code ] ans Ende (ohne Leerzeichen.
    Sonst will das kaum einer überhaupt anschauen.



  • ok gemacht 😃



  • Welche Felder?
    Wo sind die definiert?



  • ok... die sind global alle in der header definiert... 😃 voll vergessen...ich bin zu wenig auf foren...

    #define MASTERMIND_H_INCLUDED
    #define MAX_WIEDERHOLUNGEN 10
    #define MAX_FELDER 4
    #define MAX_ZAHLEN 6
    
        int zuRaten[MAX_FELDER];
        int geraten[MAX_FELDER];
        int geratenHistorie[MAX_WIEDERHOLUNGEN][MAX_FELDER];
        int ergebnis[MAX_FELDER];
        int temp;
    
    /*Für die Ergebnisse gilt:
      0<-> - :Zahl und Position falsch,
      1<-> ° :Zahl richtig,Position falsch,
      2<-> + :Zahl und Position rictig.*/
        int ergebnisHistorie[MAX_WIEDERHOLUNGEN][MAX_FELDER];
    /*Historie der Ergbnisse*/
    
        void erzeugeZuRaten();           //die zu erratende/gesuchte Zahlenkombination wird nach Zufallsverfahren vom Programm erstellt..
    
        void ausgabeHistorie(int wiederholungen);
    
        void eingabeSchaetzwerte();     //der Nutzer gibt seine eigenen Schätzwerte ein..
    
        void auswertungSchaetzwerte();    //die eingeg. Werte werden mit +,-,o bewertet..
    
        int istAllesRichtig();
    
        void schaetzwerteZuHistorie(int wiederholungen);  //diese Funktion dient dazu,dass man die eingeg. 4 Zahlen in die 4 Feldern (Tabelle) einteilt..
    
        void ergebnisZuHistorie(int wiederholungen);     //Die Bewertung der Schätzwerte,also die Ergebnisse werden in eine Historie hinzugefügt.
    


  • ok mittlerweile bin ich schon soweit dass ich mein Problem kenne!

    es ist so das die Felder nach beenden der for-schleife wieder leer sind, zumindest wenn ich mit printf nachgucke sind sie mit 0 initialisiert.

    wie bekomme ich das hin? was mache ich denn so grundsätzliches falsch?

    (Die Zufallszahlen funktionieren auch nicht so richtig, da doppelte Werte vorkommen, was sie eigentlich auch nicht sollten... ein Denkanstoß dazu wäre auch nett, ist aber nicht mein wirkliches Problem.)

    LG



  • oh wei oh wei.... ich antworte mir schon selber 😃 ok das ist auch erledigt. nur habe ich das problem beim printen der ergebnisse, "o", "+" und "-".

    Ich weiß nicht ganz wieso, aber schon bei:

    void auswertungSchaetzwerte(){
    
        int i = 0;
        int j = 0;
    
        for(; i < MAX_FELDER; i++){
            for(; j < MAX_FELDER; j++){
                if(geraten[i] == zuRaten[j]){
                    ergebnis[i] = 1;
                    if(i == j){
                        ergebnis[i] = 2;
                    }
                }
            }
        }
        ergebnis[i] = 0;
    }
    

    funktioniert es nicht richtig. Er soll die Felder miteinander vergleichen, je nachdem ob die Position und Zahl richtig sind, oder nur die Zahl oder eben nichts übereinstimmt wird dann 0,1 und 2 ausgegeben und diese wiederum in ergebnis[] gespeichert.
    diese wird dann in ergebnisHistorie[][] übertragen und in der methode ausgabeHistorie() sollen den Werten dann die Zeichen übergeben werden... UND DAS GEHT NICHT...wieso?...



  • In der Funktion erzeugeZuRaten schreibst du über Arraygrenzen hinaus -> nix gut.
    In der Funktion istAllesRichtig musst du die Variable correct initialisieren.



  • Resi26 schrieb:

    void auswertungSchaetzwerte(){
    
        int i = 0;
        int j = 0;
    
        for(; i < MAX_FELDER; i++){
            for(; j < MAX_FELDER; j++){
                if(geraten[i] == zuRaten[j]){
                    ergebnis[i] = 1;
                    if(i == j){
                        ergebnis[i] = 2;
                    }
                }
            }
        }
        ergebnis[i] = 0;
    }
    

    Mit ergebnis[i] = 0; sprengst du ebenfalls dein Array.



  • Du kannst dir ja ne Funktion schreiben, in der du den Ergebnispuffer vor der Benutzung in auswertungSchaetzwerte oder sonstwo resettest.

    Z.B.

    void reset_ergebnispuffer(void)
    {
    	int i;
    	for ( i = 0; i < MAX_FELDER; i++ )
    		ergebnis[i] = 0;
    }
    

Log in to reply