Brauche Hilfe für Mastermind c++
-
Zeile 1:
<cmath>statt<math.h>
Zeile 3:<ctime>statt<time.h>
Zeilen 8 - 10 hätte man zusammenfassen können.
Zeile 12: C++ kennt kein Default-Int
Zeilen 14 - 17: In C++ definiert man Variablen so lokal wie möglich.
Zeile 18: Nutze Container der STD statt Arrays.Und das Array-Gewurstel lese ich nicht durch. Löse es mit
std::vector.
-
gbhjkrhb schrieb:
so das hat jetzt geklappt.... wir müssen mit dem dev cpp arbeiten weil das für uns anfänger anscheinend gut ist
Ihr Armen. Gleich am Anfang nur Mist lernen, den man dann nicht mehr los wird. (Ehrlich gesagt ist dein Code auch entsprechend schrecklich, wie EOutOfResources schon gleich zu Anfang gesagt hat). Schluck den Kurs, versuch eine gute Note zu bekommen und dann vergiss nach der Abschlussprüfung besser alles wieder.
-
ok danke werde es versuchen... das müsstest du mal unserem prof sagen der das so haben möchte hahahah
-
gbhjkrhb schrieb:
wir müssen mit dem dev cpp arbeiten weil das für uns anfänger anscheinend gut ist
Ich bemitleide euch, niemand sollte so etwas ertragen müssen

Edit:
oO zu langsam
-
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
-
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
-
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
-
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
-
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?
-
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.