Aufgabe 1 - Objektorientierte Modellierung mit Im… · Abitur NRW Informatik GK · Nachtermin 2021
Thema: Objektorientierte Modellierung mit Implementationsdiagrammen · Aus der Prüfung GK · Nachtermin (2021)
Aufgabenstellung
Aufgabenstellung: Das Spiel Brainbreaker
Im Spiel Brainbreaker gilt es, einen verborgenen Code aus vier Stellen herauszufinden. Jede Stelle enthält dabei eine Ziffer zwischen 0 und 5. Der Spieler gibt Tipps ab, die ebenfalls aus vier Ziffern von 0 bis 5 bestehen und vom System bewertet werden. Anhand dieser Bewertung lässt sich erkennen, wie dicht ein Tipp am gesuchten Code liegt.
Die Bewertung erfolgt nach diesen Regeln (siehe Beispiel in Abbildung 1):
Haben Tipp und geheimer Code an derselben Stelle dieselbe Ziffer, so wird dies als so genannter Volltreffer (V) mit 10 Punkten bewertet.
Haben Tipp und geheimer Code an unterschiedlichen Stellen dieselbe Ziffer, so wird dies als so genannter Teiltreffer (T) mit einem Punkt bewertet.
Jede Stelle des geheimen Codes darf höchstens einmal bei der Bewertung berücksichtigt werden.
Volltreffer werden nicht zusätzlich als Teiltreffer gewertet.
Die Gesamtbewertung eines Tipps ist die Summe der Punkte aller seiner Stellen; nur sie wird dem Spieler als Rückmeldung genannt. Man möchte den geheimen Code mit möglichst wenigen Tipps finden.
Für die Umsetzung des Spiels Brainbreaker hat Jana ein Implementationsdiagramm erstellt, von dem Abbildung 2 einen Ausschnitt darstellt. Die Dokumentation der relevanten Methoden steht im Anhang.
Anhang: Dokumentationen der verwendeten Klassen
Die Klasse Ziffernfolge
Objekte der Klasse Ziffernfolge dienen zur Verwaltung von vierstelligen Ziffernfolgen für das Spiel Brainbreaker. Die Ziffern einer Ziffernfolge sind ganze Zahlen. Die einzelnen Ziffern können gesetzt und abgefragt werden.
Ausschnitt aus der Dokumentation der Klasse Ziffernfolge
Ziffernfolge(String pCodierung)
Ein neues Objekt zum Verwalten einer Ziffernfolge wird erzeugt. Die Zeichen der übergebenen Zeichenkette müssen Ziffern sein. Die Werte der Ziffernfolge werden diesen Ziffern gemäß initialisiert. Ist pCodierung == null, so werden die vier Ziffern mit dem Wert -1 initialisiert.
int gibWert(int pIndex)
Die Belegung der Ziffernfolge an der Stelle pIndex wird zurückgeliefert. Die erste Stelle hat den Index 0.
void setzeWert(int pIndex, int pWert)
Die Belegung der Ziffernfolge an der Stelle pIndex wird auf pWert gesetzt.
int ermittleBewertung(Ziffernfolge pAndereFolge)
Es wird ermittelt, welche Punktezahl die übergebene Ziffernfolge pAndereFolge erreichen würde, wenn das Instanzobjekt dem geheimen Code entsprechen würde.
Die Klasse Spiel
Objekte der Klasse Spiel verwalten die Ziffernfolgen für eine Partie des Spiels Brainbreaker.
Ausschnitt aus der Dokumentation der Klasse Spiel
Spiel()
Ein neues Objekt zum Verwalten der Ziffernfolgen einer Partie Brainbreaker wird erzeugt. Es wird gemäß den Spielregeln eine zufällige Ziffernfolge als geheimer Code generiert.
Ziffernfolge gibTipp(int pIndex)
Es wird der pIndex-te abgegebene Tipp des Spielers zurückgeliefert. Ist pIndex größer als die Anzahl der Tipps oder ist pIndex < 1, so wird null zurückgeliefert.
int gibAnzahlTipps()
Es wird die Anzahl bisher abgegebener Tipps zurückgeliefert.
void fuegeTippHinzu(Ziffernfolge pTipp)
Ein neuer Tipp wird hinzugefügt, die Anzahl der abgegebenen Tipps um eins erhöht.
Die generische Klasse List<ContentType>
Objekte der generischen Klasse List verwalten beliebig viele, linear angeordnete Objekte vom Typ ContentType. Auf höchstens ein Listenobjekt, aktuelles Objekt genannt, kann jeweils zugegriffen werden. Wenn eine Liste leer ist, vollständig durchlaufen wurde oder das aktuelle Objekt am Ende der Liste gelöscht wurde, gibt es kein aktuelles Objekt. Das erste oder das letzte Objekt einer Liste kann durch einen Auftrag zum aktuellen Objekt gemacht werden. Außerdem kann das dem aktuellen Objekt folgende Listenobjekt zum neuen aktuellen Objekt werden.
Das aktuelle Objekt kann gelesen, verändert oder gelöscht werden. Außerdem kann vor dem aktuellen Objekt ein Listenobjekt eingefügt werden.
Dokumentation der Klasse List<ContentType>
List()
Eine leere Liste wird erzeugt.
boolean isEmpty()
Die Anfrage liefert den Wert true, wenn die Liste keine Objekte enthält, sonst liefert sie den Wert false.
boolean hasAccess()
Die Anfrage liefert den Wert true, wenn es ein aktuelles Objekt gibt, sonst liefert sie den Wert false.
void next()
Falls die Liste nicht leer ist, es ein aktuelles Objekt gibt und dieses nicht das letzte Objekt der Liste ist, wird das dem aktuellen Objekt in der Liste folgende Objekt zum aktuellen Objekt, andernfalls gibt es nach Ausführung des Auftrags kein aktuelles Objekt, d. h., hasAccess() liefert den Wert false.
void toFirst()
Falls die Liste nicht leer ist, wird das erste Objekt der Liste aktuelles Objekt. Ist die Liste leer, geschieht nichts.
void toLast()
Falls die Liste nicht leer ist, wird das letzte Objekt der Liste aktuelles Objekt. Ist die Liste leer, geschieht nichts.
ContentType getContent()
Falls es ein aktuelles Objekt gibt ( hasAccess() == true), wird das aktuelle Objekt zurückgegeben. Andernfalls ( hasAccess() == false) gibt die Anfrage den Wert null zurück.
void setContent(ContentType pContent)
Falls es ein aktuelles Objekt gibt ( hasAccess() == true) und pContent ungleich null ist, wird das aktuelle Objekt durch pContent ersetzt. Sonst bleibt die Liste unverändert.
void append(ContentType pContent)
Ein neues Objekt pContent wird am Ende der Liste eingefügt. Das aktuelle Objekt bleibt unverändert. Wenn die Liste leer ist, wird das Objekt pContent in die Liste eingefügt und es gibt weiterhin kein aktuelles Objekt ( hasAccess() == false). Falls pContent gleich null ist, bleibt die Liste unverändert.
void insert(ContentType pContent)
Falls es ein aktuelles Objekt gibt ( hasAccess() == true), wird ein neues Objekt pContent vor dem aktuellen Objekt in die Liste eingefügt. Das aktuelle Objekt bleibt unverändert. Falls die Liste leer ist und es somit kein aktuelles Objekt gibt ( hasAccess() == false), wird pContent in die Liste eingefügt und es gibt weiterhin kein aktuelles Objekt. Falls es kein aktuelles Objekt gibt ( hasAccess() == false) und die Liste nicht leer ist oder pContent == null ist, bleibt die Liste unverändert.
void concat(List<ContentType> pList)
Die Liste pList wird an die Liste angehängt. Anschließend wird pList eine leere Liste. Das aktuelle Objekt bleibt unverändert. Falls es sich bei der Liste und pList um dasselbe Objekt handelt, pList == null oder eine leere Liste ist, bleibt die Liste unverändert.
void remove()
Falls es ein aktuelles Objekt gibt ( hasAccess() == true), wird das aktuelle Objekt gelöscht und das Objekt hinter dem gelöschten Objekt wird zum aktuellen Objekt. Wird das Objekt, das am Ende der Liste steht, gelöscht, gibt es kein aktuelles Objekt mehr ( hasAccess() == false). Wenn die Liste leer ist oder es kein aktuelles Objekt gibt ( hasAccess() == false), bleibt die Liste unverändert.
Teilaufgabe b)
Für die Programmierung des Spiels Brainbreaker hat Jana ein Implementationsdiagramm erstellt. In Abbildung 2 ist ein Teil dieses Diagramms dargestellt. Im Anhang befindet sich eine Dokumentation der wichtigen Methoden.
b)
Erläutern Sie die in Abbildung 2 dargestellte Teilmodellierung bezogen auf den Sachzusammenhang. [9 Punkte]
Teilaufgabe e)
In der nächsten Version soll sich der Schwierigkeitsgrad des Spiels einstellen lassen, sodass es noch reizvoller wird. Dafür sind zusätzlich diese Anforderungen umzusetzen:
Für jedes Spiel soll sich die Länge des Geheimcodes festlegen lassen.
Spielende sollen Hinweise nacheinander einzeln anfordern können. Jeder Hinweis nennt die Ziffer des Geheimcodes an einer zufällig gewählten Stelle. Zudem soll festgehalten werden, wie viele Hinweise ein Spielender schon genutzt hat, und diese Anzahl soll abrufbar sein.
e.1
Modellieren Sie die oben beschriebenen Anforderungen als Erweiterung des Implementationsdiagramms in Abbildung 2. [8 Punkte]
Hinweis: Methoden und Attribute aus Abbildung 2, die unverändert bleiben, müssen nicht angegeben bzw. dargestellt werden. Sie können ein Foto Ihres erweiterten Klassendiagramms hochladen oder die Änderungen (neue bzw. angepasste Attribute und Methoden) beschreiben.
e.2
Erläutern Sie, auf welche Weise Ihr Implementationsdiagramm die Anforderungen umsetzt. [3 Punkte]

Lösung
Nach den offiziellen Korrekturhinweisen
b) Erläutern Sie die in Abbildung 2 dargestellte Teilmodellierung bezogen auf den Sachzusammenhang.
Lösung: Ein Objekt des Typs Ziffernfolge verwaltet ein eindimensionales Feld (Array) des elementaren Typs int. Ziffernfolgen erfüllen mehrere Aufgaben, sie können einerseits den geheimen Code definieren, andererseits können sie die Tipps einer Spielerin bzw. eines Spielers festlegen. Ein Objekt vom Typ Spiel verwaltet Objekte vom Typ Ziffernfolge in einer entsprechend typisierten linearen Liste. Der Liste tipps aller Tipps können neue Tipps hinzugefügt, die Anzahl der Tipps ermittelt und jeder beliebige Tipp betrachtet werden. Dies ist wichtig, weil nur durch die Folge der Bewertungen aller abgegebenen Tipps eine Ermittlung des geheimen Codes möglich wird. Die Ziffernfolgen können durch eine Zeichenkette initialisiert werden, es können die einzelnen Stellen der Ziffernfolge gesetzt und ausgelesen werden. Darüber hinaus kann die Punktzahl der Ziffernfolge im Vergleich zu einer übergebenen Ziffernfolge ermittelt werden.
e) Modellieren Sie die oben beschriebenen Anforderungen als Erweiterung des Implementationsdiagramms in Abbildung 2.
Lösung: Erweiterungen in der Klasse `Spiel`: - Neues Attribut: `-anzahlAngeforderteHinweise: int` - Angepasster/neuer Konstruktor: `+Spiel(pGeheimcodeLaenge: int)` - Neue Methoden: - `+gibAnzahlAngeforderteHinweise(): int` - `+gibHinweis(): int[]`
e.1) Ergänzende textuelle / tabellarische Spezifikation der Erweiterung
Lösung: Klasse Spiel: - Attribut: -anzahlAngeforderteHinweise: int - Konstruktor: +Spiel(pGeheimcodeLaenge: int) - Methode: +gibAnzahlAngeforderteHinweise(): int - Methode: +gibHinweis(): int[]
e.2) Erläutern Sie, auf welche Weise Ihr Implementationsdiagramm die Anforderungen umsetzt.
Lösung: i) Der Konstruktor der Klasse Spiel bekommt als Parameter die Geheimcodelänge übergeben. ii) Ein Objekt der Klasse Spiel verwaltet zusätzlich das Attribut `anzahlAngeforderteHinweise`. Die Methode `gibHinweis` in der Klasse Spiel liefert ein Array mit zwei Werten. Der erste Wert bestimmt die Ziffer aus dem Geheimcode an einer bestimmten Stelle. Der zweite Wert bestimmt diese Stelle im Geheimcode. Über die Methode `gibAnzahlAnforderteHinweise` kann die angeforderte Hinweisanzahl abgerufen werden.
Die ausführliche Erklärung Schritt für Schritt (mit KI) gibt es mit Premium. Premium
Löse sie direkt hier: automatische Korrektur, Hinweise und Lösung Schritt für Schritt.
‹ Aufgabe 2 - Objektorientierte Modellierung · GK · Haupttermin · Weiterbildungskolleg 2021 · Aufgabe 2 - Objektorientierte Modellierung mit Im… · GK · Nachtermin 2021 ›
Mehr Aufgaben zu Objektorientierte Modellierung mit Implementationsdiagrammen
- Aufgabe 2 - Modellierung · LK · Nachtermin 2022
- Aufgabe 1 - Objektorientierte Modellierung mit Im… · GK · Haupttermin 2021
- Aufgabe 2 - Objektorientierte Modellierung mit Im… · GK · Haupttermin 2021
- Aufgabe 1 - Objektorientierte Modellierung · GK · Haupttermin · Weiterbildungskolleg 2021
- Aufgabe 2 - Objektorientierte Modellierung · GK · Haupttermin · Weiterbildungskolleg 2021
- Aufgabe 2 - Objektorientierte Modellierung mit Im… · GK · Nachtermin 2021
- Aufgabe 1 - Objektorientierte Modellierung · LK · Haupttermin 2021
- Aufgabe 2 - Objektorientierte Modellierung · LK · Haupttermin 2021
- Aufgabe 1 - Objektorientierte Modellierung mit Im… · LK · Nachtermin 2021
- Aufgabe 2 - Objektorientierte Modellierung mit Im… · LK · Nachtermin 2021