FH Darmstadt 
FB Informatik 
Prof.Dr. H.P.Weber
Programmieren II
Praktikum
1

Ziel: Sie sollen die in Programmieren I erlernten Sprachelemente von C++ (insbesondere Klassendefinition und Überladen von Operatoren) anwenden können.


1    MasterMind-Spiel

Realisieren Sie eine objektorientierte Version des in den 70er-Jahren des letzten Jahrhunderts beliebten Spieles MasterMind
  • In der Version für diese Aufgabe 'denkt sich' der Computer eine vierstellige Zahl aus den Ziffern 1 bis 6 (Methode makeDigitsToGuess im Klassendiagramm unten). Der Mensch rät sie. Jeden Rateversuch bewertet der Computer, indem er angibt, wieviele Ziffern an der richtigen Stelle genannt worden sind (locationRight) und wieviele sonst noch richtig genannt wurden, ohne an der richtigen Stelle zu stehen (locationWrong).
  • Nehmen wir einmal an, der Computer hat sich die Zahl 1434 ausgedacht. Ein Dialog könnte dann so aussehen: 
    Mensch rät:  3654  Computer-Antwort: 1 an der richtigen Stelle; sonst 1 richtig
    Mensch rät:  4444  Computer-Antwort: 2 an der richtigen Stelle; sonst 0 richtig
  • Neben der Standardvariante, bei der der Computer eine zu ratende Zahl vorgibt, soll auch ein Testmodus möglich sein, bei dem vom Tester eine beliebige vierstellige Zahl aus den Ziffern 1 bis 6 eingegeben werden kann, die dann zu 'raten' ist. Überlegen Sie sich vor der Realisierung Ihrer Lösung eine Reihe von Testfällen mit den zugehörigen Computer-Antworten. Welche Fälle sind besonders kritisch? Berücksichtigen Sie bei der Implementierung Ihrer Lösung auch diese kritischen Testfälle.
  • Realisieren Sie anhand des folgenden Klassendiagramms eine Klasse MastermindDigits, die die oben geschilderten Anforderungen erfüllt (achten Sie dabei auch auf möglichst weitgehende 'const-correctness').
  • Der (Konvertierungs-)Konstruktor erzeugt ein dynamisches int-Array digits, dessen Elemente die einzelnen Ziffern der vierstelligen int-Zahl enthalten. Er übernimmt diese int-Zahl als Parameter und speichert die einzelnen Ziffern der Zahl in die Elemente von digits.
  • Realisieren Sie außerdem die drei weiteren Methoden/Operatoren, die Bestandteil jeder Klasse sein sollten, deren Objekte Zeiger auf dynamisch zugewiesenen Speicher enthalten. (Sie sind im Klassendiagramm unten nicht aufgeführt!) Dies sollen aber die einzigen Ergänzungen der öffentlichen Schnittstelle sein.
  • Schreiben Sie ein Anwendungsprogramm, das den oben beschriebenen Spielablauf und den Testmodus als Konsolenanwendung realisiert. Das Anwendungsprogramm soll mit nur einem MastermindDigits-Objekt arbeiten, von dem aus die Methoden der Klasse aufgerufen werden. Die Nutzereingabe und der Vergleich soll daher mit int-Zahlen und den entsprechenden Typ-Konvertierungen der MastermindDigits-Klasse arbeiten.
MastermindDigits
-digits: int*
+MastermindDigits(int)
+makeDigitsToGuess(): void
+locationRight(MastermindDigits&): int
+locationWrong(MastermindDigits): int
+operator int()




2    Lösungsalgorithmus für MasterMind-Spiel (fakultativ)

In Aufgabe 1 wird das Mastermind-Spiel  in der Form realisiert, dass ein menschlicher Benutzer eine vom Computer ausgedachte Zahl rät. Jetzt soll der Computer eine Zahl raten, die sich der menschliche Benutzer ausgedacht hat.
  • Versehen Sie Ihre Lösung mit einer Konsolen-Ausgabe und -Eingabe, über die ihr Programm seinen Tip ausgibt und ein menschlicher Gegenspieler die Zahl der Ziffern an der richtigen Stelle und die sonst noch richtigen Ziffern eingeben kann.
  • Wieviele Versuche benötigt Ihr Programm im Mittel, um eine Zahl zu raten? Um Ihre Lösung besser testen zu können, lassen Sie den Computer auch die Rolle des Benutzers übernehmen: Er denkt sich eine Zahl aus, die er dann zu erraten versucht. Bestimmen Sie, wieviele Versuche hierbei im Mittel bei z.B. 10000 Spielen gebraucht werden und wieviele Versuche ihr Programm dabei maximal braucht.
  • Anzustreben ist eine Lösung, die jedes Spiel gewinnt, d.h. mit maximal acht Versuchen wird jede Zahl (mit vier Ziffern aus sechs möglichen) ermittelt, die sich der menschliche Gegenspieler (oder der Rechner selbst) ausdenkt.