[Konsole] Mastermind "Auswertung"



  • Nabend...

    Ich habe ein par Probleme eine Auswertung eines MasterMind Programmes durchzuführen.

    Ich habe ein Array pspielfeld[5], welches die 5 Zahlen enthält, welche am Anfang vom PC gezogen werden. Diese müssen beim Mastermind ja bekanntlich erraten werden.

    Weiterhin habe ich ein Array peingabe[runde][zahl]

    Hierbei gilt: runde = Aktuelle Ziehrunde (da es mehrere Runden gibt und ich alle Runden immer untereinander ausgegeben haben möchte speicher ich die Runde hierein um alle Runden exakt ansteuern zu können)
    zahl = eine Zahl von 1 -7 welche für die Farbe steht, welcher der Nutzer will.
    1 = rot
    2 = gelb
    3 = grün
    4 = blau
    5 = weiß
    6 = braun
    7 = orange

    Nun laufen diese Eingaben ab und es soll in einer Funktion geguckt werden was alles richtig ist.

    Ich habe da erstmal folgendes geprüft:

    for ( i = 0; i > 5 ; i ++ ) {
        if ( pspielfeld[i] == peingabe[*prunde][i] ) {
            cout << "x";
        }
    }
    /*
    Ich denke das ganze ist leicht erklärt. Der Pointer kommt durch Übergabe von der Funktion das passt so. Ich gucke ob an der Stelle im Spielfeld, welche ich gerade durchlaufe (mit der for-Schleife durchlaufe ich ja nacheinander alle 5 Felder) GENAU die gleiche Zahl in der Eingabe für DIESES Feld steht. Wenn das der Fall ist gebe ich ein X aus.
    
    */
    

    Soweit klappt das ganze auch erstmal.

    Wenn eine Farbe richtig ist, aber am falschen Ort so soll ein "O" ausgegeben werden.
    Das bekomme ich zwar halbwegs hin, aber meinen Code hier hinzuschreiben wäre wohl wenig sinnvoll.
    Kurz erklärt prüfe ich alle Felder der Eingabe, ob der gleiche Zahlenwert drinsteht wie im Spielfeld.

    Das bringt mir jetzt einige Probleme:

    1. Wenn eine Zahl doppelt gezogen wurde (vom PC) so gibt es Fehler und es ist z.B. ein "O" zu wenig, oder Ähnliches.
    2. Wenn ich bei allen 5 Eingaben die ich habe die gleiche Zahl verwende und diese irgendwo vorkommt, so bekomme ich nicht nur 1x, sondern auch ein O.

    Wie bekomme ich das hin, dass diese Abfrage richtig funktioniert?

    Im Anhang findet ihr noch den kompletten C++ Code, welcher allerdings noch bissl buggy ist denke ich. Würde mich freuen, wenn jemand helfen kann!

    // MASTERMIND 
    #include <iostream>
    #include <stdlib.h>
    #include <windows.h> //Wird für die Farben benötigt
    #include <time.h> //Wird für Zufallsgenerator benötigt
    
    //Farbdefinition
    #define blau    9
    #define turkise 11
    #define gruen   10
    #define rot     4
    #define gelb    14
    #define grau    8
    #define white   15
    
    const unsigned char BB = static_cast<unsigned char>(157); 
    
    using namespace std;
    //---------
    void textcolor(WORD color)           //Funktion fuer Farbe 
    { 
        SetConsoleTextAttribute(::GetStdHandle(STD_OUTPUT_HANDLE), color); 
    } 
    //---------
    
    void zufall(int*); // zieht zufällig Zahlen für Array von Spielfeld
    int zug(int*,int*); // Zug-Funktion
    
    //Eingabe wird als Globale Variable deklariert , weil ich Probleme mit der Übergabe eines Multidimensionales Arrays an eine Funktion hatte
    int eingabe[17][5];
    
    int main()
    {
     int spielfeld[5];
     int runde=1;
     int i;
     int sieg;
    
     //Zufallfunktion
         zufall(spielfeld);
     do
     {
        sieg = zug ( spielfeld, &runde ); // ist unwichtig, weil noch nichts zurückgegeben wird...
        textcolor(15);
        cout << "\n------------------------------------------------------------\n";
        runde+=1;
     }
     while(sieg!=1);
      system("PAUSE");
      return 0;
    }
    void zufall(int* pspielfeld)
    {
        int i;
        srand((unsigned)time(NULL));
        for(i=0;i<5;i++)
        {
            pspielfeld[i] =  rand()%6+1;
        }
    }
    int zug(int* pspielfeld,int* prunde)
    {
        int i,j;
        cout << "(1) blau\n";
        cout << "(2) tuerkis\n";
        cout << "(3) gruen\n";
        cout << "(4) rot\n";
        cout << "(5) gelb\n";
        cout << "(6) grau\n";
        cout << "(7) weiss\n";
        for (i=0; i<5;i++)
        {
            cout << "Bitte waehlen Sie aus, welche Farbe Sie ins " <<i+1<<". Feld setzen moechten:\n";
            cin >> eingabe[*prunde][i];
        }
    
        cout << "\n--------------------------------------------------------------\n";
        cout << "RUNDE: "<<*prunde<<" - Sie haben folgende Steine gesetzt:\n";
        for (i=0; i<5;i++)
        {
            if ( eingabe[*prunde][i] == 1 ) 
            {
                    textcolor(9);
                    cout << BB << "\t";
            } else if ( eingabe[*prunde][i] == 2 ) 
            {
                    textcolor(11);
                    cout << BB << "\t";
            } else if ( eingabe[*prunde][i] == 3 ) 
            {
                    textcolor(10);
                    cout << BB << "\t";
            } else if ( eingabe[*prunde][i] == 4) 
            {
                    textcolor(4);
                    cout << BB << "\t";
            } else if ( eingabe[*prunde][i] == 5 ) 
            {
                    textcolor(14);
                    cout << BB << "\t";
            } else if ( eingabe[*prunde][i] == 6 ) 
            {
                    textcolor(8);
                    cout << BB << "\t";
            } else if ( eingabe[*prunde][i] == 7 ) 
            {
                    textcolor(15);
                    cout << BB << "\t";
            }
        }
        textcolor(15);
        // AUSWERTUNG
        for(i=0; i<5; i++)
        {
    
            if ( pspielfeld[i] == eingabe[*prunde][i] ) 
            {
                 cout << "x";
                 eingabe[*prunde][i] == 8;
            }
            if ( pspielfeld[i] == eingabe[*prunde][1]  || pspielfeld[i] == eingabe[*prunde][2] || pspielfeld[i] == eingabe[*prunde][3] || pspielfeld[i] == eingabe[*prunde][4] || pspielfeld[i] == eingabe[*prunde][5] || pspielfeld[i] == eingabe[*prunde][6] )
            {
                 cout << "o";
            }
    
        }
    cout << "\n";
    for (i=0; i<5;i++)
    {
        cout << pspielfeld[i];
    }
    return 0;
    }
    


  • Erstmal zu deinem eigentlichen Problem:
    So wie es aussieht, hast du das mit den Arrays noch nicht ganz richtig verinnerlicht. In den Schleifen mit deiner Variablen i machst du es immer richtig mit dem Index. Bei den anderen Sachen allerdings nicht.
    Also bedenke immer, dass der Index eines Arrays in C(++) mit 0 beginnt und nicht mi 1!

    Nun noch etwas zu deinem Code allgemein:
    system("PAUSE") solltest du sofort aus deinem Programmiergebrauch restlos streichen! Um eine Eingabe vom Benutzer zu erzwingen gibts weitaus bessere Möglichkeiten, die du hier im Forum auch finden kannst.
    Generell solltest du system() nicht für Systembefehle missbrauchen. Für jeden Systembefehl gibts normalerweise im Betriebssystem eine eigene Funktion, die du mit C(++) aufrufen kannst, wenn du den oder die entsprechenden Header einfügst (in Windows z. B. windows.h) und diese Funktionen sind immer schneller und besser als der Systembefehl durch system() ausgeführt.

    Als zweites gehts noch um deinen zweiten Parameter in der Funktion zug(). Soweit ich das sehe, dient dieser Parameter nur dazu den Index zu übergeben. Er ist vom Typ int und ein Zeiger. Da du den Wert innerhalb der Funktion nicht änderst und der Parameter auch nur ein int ist, macht es wenig Sinn hier einen Zeiger zu verwenden. Du baust dir dadurch womöglich nur selber eine Falle.
    Bevor du also einen Zeiger verwendest, überleg erstmal folgendes:
    - Muss ich den Wert verändern?
    - Ist der Datentyp entscheidend größer als ein Zeiger (ein Zeiger hat immer die Größe von int)?


Anmelden zum Antworten