Brauche Hilfe für Mastermind c++



  • dafür muss ich den kurs aber erstmal bestehen was leider nicht danach aussieht weil das alles nicht in mein kopf möchte



  • Die Frage ist nun: soll das Programm in C oder in C++ geschrieben werden? (in der Aufgabenstellung wird von C gesprochen).

    Falls C++:
    - schau dir mal find oder auch count an.
    Du überprüfst einfach, ob eine eingebene Zahl überhaupt vorkommt.
    Falls sie vorkommt, testest du noch ob sie an der richtigen Stelle eingegeben wurde und inkrementierst dann entsprechend entweder die Variable für die richtigen oder für die falschen Positionen.



  • in c++ müssen wir programmieren ok ich werde es versuchen.... sieht so aus als wird das ein sehr langer tag und nacht



  • Der Code enthält aber mindestens drei C++-Fehler.



  • aber er4 zeigt keine fehler an das ist es ja


  • Mod

    gbhjkrhb schrieb:

    in c++ müssen wir programmieren ok ich werde es versuchen.... sieht so aus als wird das ein sehr langer tag und nacht

    Um dem Thread mal eine Richtung zu geben: Wenn du eine Frage stellen würdest, dann bekämst du auch Antworten, anstatt Kommentaren zur schlechten Codequalität und der Inkompetenz deines Lehrers.



  • gbhjkrhb schrieb:

    aber er4 zeigt keine fehler an das ist es ja

    Dann solltest du deinen Lehrer dazu überreden, einen standardkonformen Compiler benutzen zu dürfen.



  • um genau zu sein ich weiß nicht wie ich auf die falsche postion überprüfen soll, soweit ich denke muss da bestimmt nur bei falschr position was geändert werden ich finde aber nicht heraus was... so jetzt meine frage wo liegt genau der fehler da????



  • inkompetent ist er nun nicht bei ihm funktionieren die programme die er schreibt... und ab nächstes semester machen wir dann java... wir sollen halt das benutzen was wir im unterricht schon gemacht haben


  • Mod

    gbhjkrhb schrieb:

    um genau zu sein ich weiß nicht wie ich auf die falsche postion überprüfen soll, soweit ich denke muss da bestimmt nur bei falschr position was geändert werden ich finde aber nicht heraus was... so jetzt meine frage wo liegt genau der fehler da????

    Es könnte helfen, auf Ungleichheit anstatt auf Gleichheit zu prüfen.

    gbhjkrhb schrieb:

    inkompetent ist er nun nicht bei ihm funktionieren die programme die er schreibt... und ab nächstes semester machen wir dann java... wir sollen halt das benutzen was wir im unterricht schon gemacht haben

    Du verstehst nicht recht: Dein Lehrer programmiert so wie anno 1969. Danach hat er sich irgendwann mal die Syntax von C reingezogen und noch später gesehen, dass er seinen C Kurs einen C++-Kurs nennen kann, wenn er nur printf durch cout ersetzt. Seine Technik mag auch funktionieren, aber ich wäre enttäuscht, wenn mir mein Fahrlehrer erklärt hätte, wie ich im Notfall ein Pferd selber beschlagen kann.



  • hab es eingesetzt jetzt meckert das programm was für ein zeichen gibt es denn um auf ungleichheit zu überprüfen???? das würde mir ja schon helfen


  • Mod

    gbhjkrhb schrieb:

    hab es eingesetzt jetzt meckert das programm was für ein zeichen gibt es denn um auf ungleichheit zu überprüfen???? das würde mir ja schon helfen

    Sag das doch gleich!

    == prüft auf Gleichheit, != prüft auf Ungleichheit

    Siehe auch:
    http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B#Comparison_operators.2FRelational_operators


  • Mod

    So, mir war langweilig, dein Glück dass heute Feiertag ist. Das meiste dürftest du nicht im Details verstehen, weil es C++ ist. Aber es sollte sich einigermaßen lesen lassen, da ichversucht habe, alle Namen möglichst sprechend zu machen. Und den Kern der Sache, also die Funktionen wie man Kombinationen generiert oder prüft, solltest du verstehen und für dich anpassen können. Ich habe mir extra Mühe gegeben, keine fertigen Algorithmen aus der Standardbiblithek zu benutzen, sondern alles explizit von Hand zu machen, damit man sieht, was passiert. Außer std::string, denn rohe Arrays und Zeiger mag ich mir nicht antun.
    Du siehst, dass vor allem das Prüfen von Kombinationen deutlich komplizierter ist, als man zunächst denkt. Denn wenn die richtige Kombination 123 ist und der Benutzer 111 eingibt, dann soll ja auch nur eine der Stellen als richtig gezählt werden und am Ende nicht 1 richtig und 2 halbrichtig herauskommen. Daher muss man aufpassen, welche Stellen man schon gezählt hat und welche nicht.

    Der Rest des Programms ist vor allem kosmetisches Zeugs, welches die Eingaben prüft, hübsche Ausgaben macht und überhaupt das Spiel leitet.

    Die Reihenfolge der Funktionen im Quelltext ist die, in der ich sie geschrieben habe, was keine tiefere logische Ordnung ist und daher verwirrend sein könnte. Einstiegspunkt sollte die Funktion play() ganz unten sein, von da an kannst du dich am Kontrollfluss entlang hangeln.

    #include <string>
    #include <iostream>
    #include <stdexcept>
    #include <cstdlib>
    
    using namespace std;
    
    class MasterMindGame
    {
    private:
      unsigned num_digits;
      unsigned digit_range;
      bool recurrences;
      unsigned num_tries;
      static const unsigned max_num_tries = 10;
      string combination;
    
      void new_combination()
      {
        combination.resize(num_digits);
        if (recurrences)   // Simple case: recurrenct digits are allowed
          for (unsigned i = 0; i < num_digits; ++i)
            {
              combination[i] = (rand() % digit_range) + '1';
            }
        else   // No recurrences allowed
          {
            string possible_digits;
            for (unsigned i = 0; i < digit_range; ++i)
              possible_digits.push_back(i + '1');
            for (unsigned i = 0; i < num_digits; ++i)
              {
                // Choose one of the possible digits
                unsigned which = rand() % (digit_range - i);
                combination[i] = possible_digits[which];
                // Discard the chosen digit from the pool of possible digits:
                swap(possible_digits[which], possible_digits[digit_range - i - 1]);
              }       
          }
        // Uncomment for cheating:
        //  cout << combination << endl;   
      }
    
      void reset_game()
      {
        cout << "Generating new combination:\n Number of digits: "
             << num_digits << "\n Possible digits: 1 to " << digit_range
             << "\n Recurring digits are " << ((recurrences) ? "" : "not ")
             << "allowed.\n";
        num_tries = 1;
        new_combination();
        cout << "Done.\n";
      }
    
      bool play_again()
      {
        char answer;
        cin >> answer;
        if (answer == 'y' or answer == 'Y')
          return true;
        else
          {
            cout << "Bye.\n";
            return false;
          }
      }
    
      string get_combination()
      {
        string trial_combination;
        do
          {
            cout << "This is your " << num_tries << ". try. Which combination"
              " would you like to try? ";
            cin >> trial_combination;
          }
        while (! is_valid_combination(trial_combination));
        return trial_combination;
      }
    
      bool is_valid_combination(const string &trial_combination)
      {
        if (trial_combination.size() < num_digits)
          {
            cout << "Your trial combination is too short. "
              "The combination must have " << num_digits << " digits.\n";
            return false;
          }
        if (trial_combination.size() > num_digits)
          {
            cout << "Your trial combination is too long. "
              "The combination must have " << num_digits << " digits.\n";
            return false;
          }
        for (unsigned i = 0; i < num_digits; ++i)
          {
            if (trial_combination[i] < '1' 
                or trial_combination[i] > '1' + digit_range - 1)
              {
                cout << "Your trial combination contains invalid characters."
                  " Only digits between 1 and " << digit_range 
                     << " are allowed.\n";
                return false;
              }
          }
        return true;
      }
    
      bool check_combination(string trial_combination)
      {
        string counted(num_digits, 0);   
        // correct[i] is 0 if the digit at that position was not yet counted for anything.
        //            is 1 if it is in the trial combination and has been counted
    
        unsigned included_and_at_correct_position = 0;
        unsigned included_but_at_wrong_position = 0;
    
        // First mark all the digits that are completely correct:
        for (unsigned int i = 0; i < num_digits; ++i)
          {
            if (trial_combination[i] == combination[i])
              {
                ++included_and_at_correct_position;
                counted[i] = 1;
              }
          }
    
        // Now count the digits at wrong positions
        for (unsigned i = 0; i < num_digits; ++i)
          if (trial_combination[i] != combination[i])
            {
              for (unsigned j = 0; j < num_digits; ++j)
                if (trial_combination[i] == combination[j]
                    and !counted[j])   // Make sure that we do not count anything twice
                  {
                    ++included_but_at_wrong_position;
                    counted[j] = 1;
                    break;
                  }
            }
    
        cout << included_but_at_wrong_position 
             << " digits are in the combination but at the wrong position.\n"
             << included_and_at_correct_position
             << " digits are in the combination and at the correct position.\n";
        return included_and_at_correct_position == num_digits;
      }
    
    public:
      MasterMindGame(
                     unsigned num_digits = 3,
                     unsigned digit_range = 8,
                     bool recurrences = false
                     )
        : num_digits (num_digits), 
          digit_range (digit_range),
          recurrences (recurrences)
      { 
        if (num_digits > 5 or num_digits < 2) 
          throw out_of_range("Invalid number of digits, must be between 2 and 5");
        if (digit_range > 9 or digit_range < 2) 
          throw out_of_range("Invalid digit range, must be between 2 and 9");
        if (!recurrences and num_digits > digit_range)
          throw logic_error("It is impossible to generate a combination with more digits than digit range without recurrences");
      }
    
      void play()
      {
        reset_game();
    
        for (;;)
          {
            if (check_combination(get_combination()))
              {
                cout << "The answer " << combination
                     << " is the correct solution. You needed " 
                     << num_tries  << " tries. Play again y/n? ";
                if (play_again())
                  reset_game();
                else
                  return;
              }
            else
              {
                ++num_tries;
                if (num_tries > max_num_tries)
                  {
                    cout << "You needed more than " << max_num_tries
                         << " tries. You have lost. Play again y/n? ";
                    if (play_again())
                      reset_game();
                    else
                      return;
                  }
              }
          }    
      }
    };
    
    #include <ctime>
    
    int main()
    {
      srand(time(0));
      MasterMindGame game;
      game.play();
    }
    


  • danke danke danke du bist echt ein engel...



  • Fängt man seinen Auswurf normalerweise nicht?


  • Mod

    cooky451 schrieb:

    Fängt man seinen Auswurf normalerweise nicht?

    Naja, was gibt's hier groß zu fangen? Innerhalb des Konstruktors kann der Fehler nicht aufgelöst werden. Wäre das Spiel Teil eines größeren Programms, in dem der Benutzer beispielsweise nach den Parametern gefragt wird, dann würde ich an dieser Stelle fangen. Hier ist das Beispiel zu kurz, um die Exception irgendwie sinnvoll zu fangen. Immerhin stürzt das Programm im Fehlerfall mit einer brauchbaren Meldung ab.


Anmelden zum Antworten