Prüfung "Programmieren 2", INBac2, SS 2017 Seite 1 von 8 Datum, Uhrzeit: 13. 07. 2017, 10.30 Uhr Semester: INBac2 Note:... Prüfer: Prof. Meixner Dauer: 60 Min. Hilfsmittel: keine Punkte:... Diese Prüfung umfasst 8 Seiten. Die Lösungen sind auf den Aufgabenblättern einzutragen (notfalls Rückseiten verwenden!). Alle Aufgaben sind bezogen auf die Programmiersprache Java. Ist eine Aufgabenstellung Ihrer Meinung nach nicht vollständig oder mehrdeutig, so treffen Sie entsprechende Annahmen. Die Aufgabe Es soll ein einfaches Programm entwickelt werden, mit dem für das populäre Spiel Scrabble geübt werden kann (Dessen Spielregeln werden nicht als bekannt vorausgesetzt!). Die Übung besteht darin, dass einem Spieler wiederholt eine Zeichenkette als Buchstabenvorrat vorgelegt wird. Durch geschickte Auswahl und Reihung soll aus allen oder einem Teil der Buchstaben des Vorrats ein Wort erstellt und eingetippt werden. Das eingegebene Wort wird gegen eine interne Wortliste (eine Art Lexikon) geprüft. Für ein richtiges Wort erhält der Spieler Punkte, die sich aus den Einzelpunkten für die im Wort enthaltenen Buchstaben aufsummieren. Diese Punkte werden dem Gesamtkonto des Spielers gutgeschrieben. Der Spieler hat immer nur eine begrenzte Zeit zur Verfügung, um das Wortschöpfungsproblem zu lösen. Die Wörter im Lexikon sind alle in Großbuchstaben abgelegt. Der Spieler soll dagegen bei der Eingabe auf Groß-/Kleinschreibung keine Rücksicht nehmen müssen. Nach Abschicken der Eingabe links soll z. B. die Bestätigung rechts erscheinen, falls das Wort GEDULD im Lexikon enthalten ist. a) Die Buchstaben mit ihren jeweiligen Punkten werden der Übersichtlichkeit halber in einer Aufzählung gelistet. Erweitern Sie den nachfolgenden Typ so, dass die in Klammern enthaltenen Punkte pro Buchstabe verwaltet und bei Bedarf wieder abgerufen werden können. public enum Letter { A(1), B(2), C(3), D(1), E(1), F(2), G(2), H(2), I(2), J(4), K(2), L(2), M(1), N(1), O(2), P(3), Q(7), R(1), S(1), T(1), U(3), V(5), W(4), X(10), Y(10), Z(5); 4 P.
Prüfung "Programmieren 2", INBac2, SS 2017 Seite 2 von 8 b) Realisieren Sie die Klasse Player, die einen unveränderlichen (User-)Namen und den Gesamtpunktestand (Score) eines Spielers verwaltet. Es soll insbesondere Methoden zum Hinzuzählen von weiteren im Spiel erzielten Punkten und zum Abfragen des Gesamtpunktestands geben. Der Klasse soll außerdem eine natürliche Ordnung, basierend auf der lexikographischen Ordnung des Namens, eingepflanzt werden, indem (typsicher) das Interface Comparable implementiert wird. Zudem sollen die equals()- und tostring()-methode geeignet implementiert werden. Markieren Sie alle überschreibenden Methoden der Klasse mit der Annotation Override. 10 P.
Prüfung "Programmieren 2", INBac2, SS 2017 Seite 3 von 8 c) Die Klasse WordManager verwaltet die Wortliste, aus der per Zufall jeweils ein Wort ausgewählt wird. Die Buchstaben dieses Wortes (ergänzt um eine feste Anzahl weiterer zufällig gewählter Buchstaben!) werden in eine willkürliche Reihenfolge gebracht. Die Buchstabenauswahl und das -vertauschen passieren beide in createwordpuzzle(). Aus dem so ermittelten Buchstabenvorrat, der per getletterstring() abgeholt werden kann, soll vom Benutzer ein Wort aus der Wortliste zusammengestellt werden (s. o.). Ob das erfolgreich war, kann mit der Methode evalstring() geprüft werden. Falls die übergebene Zeichenkette kein Wort in der Wortliste darstellt, oder die Vorgaben durch den aktuellen Buchstabenvorrat nicht eingehalten wurden, soll eine EvalFailedException mit geeignetem Fehlertext geworfen werden. Andernfalls sollen die Punkte der im Wort enthaltenen Buchstaben aufsummiert und als Ergebnis zurückgeliefert werden. Zur Strukturierung kommen hier Hilfsmethoden zum Einsatz. Erweitern Sie den gegebenen Klassenrahmen durch die Implementierung fehlender bzw. Ergänzung vorhandener Methoden und fügen Sie benötigte Attribute hinzu. Definieren Sie zudem EvalFailedException als geprüfte (checked) Exception. public class WordManager { private Random random = new Random(); 14 P. public void setwordlist(list<string> wordlist) { this.wordlist = Collections.unmodifiableList(wordList); public void createwordpuzzle() { int randomwordno = random.nextint(wordlist.size()); List<Character> letterlist = string2characterlist(selectedword); // zufaellige Buchstaben hinzufuegen for (int k=1; k <= FILLER_COUNT; k++) { letterlist.add(letter.values()[randomletterno].tostring().charat(0)); Collections.shuffle(letterList); StringBuilder sb = new StringBuilder(); letterstring = sb.tostring(); private List<Character> string2characterlist(string string) { char[] charsofstring = string.tochararray(); List<Character> letterlist = new ArrayList<>(); for (char c : charsofstring) { letterlist.add(c); return letterlist;
Prüfung "Programmieren 2", INBac2, SS 2017 Seite 4 von 8 public String getletterstring() { public int evalstring(string word) word = word.touppercase(); checkiflegalword(word); return calcpoints(word);
Prüfung "Programmieren 2", INBac2, SS 2017 Seite 5 von 8 d) Nun wird ein Teil der Funktionalität von WordManager getestet! In einem Testfall für die Methode createwordpuzzle() soll geprüft werden, ob der erzeugte Buchstabenvorrat, der mit getletterstring() abgeholt werden kann, die richtige Länge hat, sprich die Summe der Länge des aus der internen Wortliste ausgewählten Wortes plus der Zahl der noch zufällig hinzugefügten Buchstaben (FILLER_COUNT). Um den Zufall teilweise zu eliminieren, wählen Sie einfach eine Wortliste, die nur aus einem Wort besteht. Unter der selben Randbedingung, sollten Sie in Tests für die Methode evalstring() die Fälle abhandeln, dass die übergebene Buchstabenfolge als Wort erkannt wird und dann eine Punktzahl größer 0 zurückgeliefert wird (genaue Punktzahl braucht nicht geprüft zu werden) und bei einer falschen Buchstabenfolge die entsprechende Exception geworfen wird. Führen Sie gemeinsame Vorbereitungsarbeiten für alle Tests (Vorbereitung des Wordmanagers) am besten in einer Setup-Methode aus. import org.junit.before; import org.junit.test; import static org.junit.assert.assertequals; import static org.junit.assert.asserttrue; import static org.junit.assert.fail; import java.util.arrays; public class WordManagerTest { private WordManager wordmanager; private String singleword = "HAUSAUFGABE"; 8 P.
Prüfung "Programmieren 2", INBac2, SS 2017 Seite 6 von 8 e) Der Kern (Engine) des Spiels wird durch die Klasse WordPuzzle (s. u.) realisiert. Implementierungen Sie die Methoden getletterstring(), addplayer(), getscore() und submitword() gemäß Spielidee und spezifizierenden Kommentaren in der Klasse. public class WordPuzzle { private WordManager wordmanager = new WordManager(); private Map<String, Player> players = new HashMap<String, Player>(); public WordPuzzle() { startnewturn(); /** Startet eine Raterunde */ private void startnewturn() { wordmanager.createwordpuzzle(); // Vorkehrungen fuer ein Timeout treffen mit anschließender neuen // Aufgabe, wenn niemand in der vorgegebenen Zeit ein Wort erraten hat... // braucht nicht implementiert zu werden!!!! public String getletterstring() { 10 P. private void assertuserexists(string username) { if ( username == null!players.containskey(username)) throw new IllegalArgumentException("Spieler gibt es nicht"); /** Fuegt einen neuen Spieler mit dem uebergebenen Namen hinzu, * aber nur, wenn der Name nicht schon vorhanden */ public void addplayer(string username) { /** Liefert die bisher erzielten Punkte eines Spielers mit Namen username */ public int getscore(string username) { /** Spieler mit Namen username macht einen Vorschlag fuer ein Wort. * Die erzielten Punkte werden dem Spieler ggf. gutgeschrieben und * zurueckgegeben. Es wird sodann eine neue Raterunde gestartet. * Bei falschem Wort: Abbruch mit EvalFailedException */ public int submitword(string username, String word)
Prüfung "Programmieren 2", INBac2, SS 2017 Seite 7 von 8 f) Folgende Klasse realisiert ein GUI-Element für das Wortpuzzle. Ergänzen Sie dieses so um eine Ereignisverarbeitung, dass nach Eingabe einer Zeichenfolge mit abschließendem <return> im Textfeld die eingegebene Zeichenfolge geprüft und ggf. per Popup eine Erfolgsmeldung (siehe Screenshots oben) ausgegeben wird. Wurde eine nicht nicht zu den Spielregeln passende Zeichenfolge eingegeben, soll im Popup eine entsprechende Meldung angezeigt werden. Tritt ein sonstiges Problem in Form einer Exception auf, soll im Popup Spiel gestört erscheinen. In allen Fällen soll das Eingabetextfeld abschließend geleert werden. Ergänzen Sie außerdem die periodische Anzeige der Inhalte von outtextfield und msglabel. (Geeignete Einfügestellen für den Code zu den Anforderungen oben sind durch --> markiert.) public class WordPuzzleForm extends GridPane { private TextField outtextfield = new TextField(); private TextField intextfield = new TextField(); private Label msglabel = new Label(""); private WordPuzzle wordpuzzle; private Timer timer = new Timer(); private String playername; private WordPuzzleForm(final String name, final WordPuzzle wordpuzzle) { this.playername = name; this.wordpuzzle = wordpuzzle; // arrangement of elements and some formatting... hier weggelassen --> 10 P. --> // refresh outtextfield and msglabel periodically timer.scheduleatfixedrate(new TimerTask() { public void run() { Platform.runLater(() -> { );, 0, 1000); public class WordEnteredHandler implements EventHandler<ActionEvent> { public void handle(actionevent e) { --> /** shows a popup window with the text msg */ private void popupmsgwindow(string msg) {...
Prüfung "Programmieren 2", INBac2, SS 2017 Seite 8 von 8 g) Wozu dient die Methode Platform.runLater() im Code von Teilaufg. f auf der vorhergehenden Seite? Was wäre los, wenn darauf verzichtet wird? (Kurze Erläuterung!) 4 P.