Aufgabe 2 - Objektorientierte Modellierung · Abitur NRW Informatik LK · Haupttermin · Weiterbildungskolleg 2023
Thema: Objektorientierte Modellierung mit Implementationsdiagrammen · Aus der Prüfung LK · Haupttermin · Weiterbildungskolleg (2023)
Aufgabenstellung
Aufgabenstellung: Das Spiel NobodyKnows
Ziel des Spiels NobodyKnows ist es, zu unbekannten Begriffen oder Wissensfragen so einfallsreiche und überzeugend wirkende Erklärungen zu erfinden, dass die übrigen Mitspielenden sie für richtig halten.
Jede laufende Spielrunde gliedert sich in drei Phasen:
1.
Frage-/Antwortphase:
Zu Beginn wird allen Spielenden dieselbe Wissensfrage gestellt, die normalerweise niemand beantworten kann. Nur die (nicht mitspielende) Spielleitung kennt die korrekte Antwort. Die Mitspielerinnen und Mitspieler müssen sich nun eine möglichst kreative Phantasieantwort einfallen lassen. Diese notieren sie und geben sie verdeckt bei der Spielleitung ab.
2.
Tipp-Phase:
Sind alle Antworten eingereicht, werden diese, zusammen mit der korrekten Antwort, in zufälliger Reihenfolge allen Spielenden präsentiert. Jeder Mitspieler bzw. jede Mitspielerin muss sich nun für eine der präsentierten Antworten entscheiden und auf diese Weise einen entsprechenden Tipp abgeben.
3.
Auswertungsphase:
Hat man auf die korrekte Antwort getippt, bekommt man 2 Punkte. Ist ein anderer Mitspieler oder eine andere Mitspielerin auf die eigene Antwort hereingefallen, indem er oder sie auf diese getippt hat, bekommt man zusätzlich jeweils 3 Punkte.
Anhänger des Spiels bedauern, dass in jeder Runde eine Person aussetzen muss, da sie die Spielleitung übernimmt. Deshalb plant die Herstellerfirma, das Spiel zusätzlich als App für Smartphones und Tablets anzubieten, wobei eine Serversoftware die Aufgaben der Spielleitung übernimmt. Diese Serversoftware verwendet das in Anlage 1 dokumentierte Protokoll.
Im Spielverlauf sollen auf den Bildschirmen der Mitspielenden Dialoge entstehen, wie sie Abbildung 1 zeigt.
Abbildung 1: Ein beispielhafter Spieldialog
Die Herstellerfirma hat bereits eine erste Version der Serversoftware entwickelt. Abbildung 2 zeigt einen Teil der Modellierung.
Abbildung 2: Teilmodellierung als Implementationsdiagramm
Anlage 1: Protokoll der Client-Server-Kommunikation
Je nach Spielphase akzeptiert der Server jeweils nur bestimmte Teile des Protokolls. Kommandos, die nicht einer bestimmten Spielphase zugeordnet sind, kann der Server jederzeit verarbeiten. Empfängt der Server ein Kommando, das während der laufenden Spielphase nicht akzeptiert wird, sendet er eine Fehlermeldung der Form -ERR <Fehlertext>.
Client an Server · Server an Client · Kommentar
(Verbindungsaufnahme) · +NKS OK
(Fehler oder Fehleingabe) · -ERR <Text> · <Text> beschreibt den Fehler näher.
LOGOUT · +LOGOUT OK · Der Client wird aus der Liste der Spielenden gestrichen und ein evtl. mit ihm laufendes Spiel beendet.
SPIELER <Name> · +SPIELER OK · Der Name <Name> wird der Liste der möglichen Spielenden hinzugefügt. Sobald dies mindestens einmal erfolgreich ausgeführt wurde, wechselt der Server in Spielphase 0.
NEU · +NEU OK · Falls gerade ein Spiel läuft, wird dieses beendet. Alle Spielenden werden auf den Punktestand 0 zurückgesetzt.
Spielphase 0
Client an Server · Server an Client · Kommentar
SPIELSTART · +SPIELSTART OK · Eine neue Spielrunde beginnt (ggf. wird dafür ein neues Spiel gestartet). Alle aktuell gespeicherten Spielerinnen und Spieler werden in dieses neue Spiel aufgenommen. Der Server wechselt in die Spielphase 1.
Spielphase 1
Client an Server · Server an Client · Kommentar
· SPIELERLISTE <Liste> · Überträgt zu Beginn von Spielphase 1 die Liste der Spielenden. <Liste> beinhaltet dabei die Namen der Spielenden, gefolgt von ihrer Punktzahl in Klammern (z. B. Peter (5)). Die Inhalte der Liste werden durch das Zeichen | voneinander getrennt.
· FRAGE <Text> · Sendet nach der Übermittlung der Spielerliste die Frage mit dem Fragetext <Text> für diese Spielrunde.
ANTWORT <Text> · +ANTWORT OK · <Text> wird als geheime Antwort des Clients gespeichert. Sobald alle Clients eine Antwort übermittelt haben, wechselt der Server in die Spielphase 2.
Spielphase 2
Client an Server · Server an Client · Kommentar
· ANTWORTEN <Liste> · Beim Einstieg in Spielphase 2 werden die Antworten in zufälliger Reihenfolge als <Liste> übertragen. Die Inhalte der Liste werden durch das Zeichen | voneinander getrennt.
Jeder Eintrag in der Liste hat die Form <Nummer>,<Name>:<Text>.
Hierbei ist <Nummer> die ab 0 aufsteigende Nummer in der Liste, <Name> der Name, unter dem die Antwort eingereicht wurde und <Text> der Antworttext. Bei der richtigen Antwort hat der Listeneintrag lediglich die Form <Nummer>:<Text>.
TIPP <Nummer> · +TIPP OK
oder
-ERR <Text> · Der Client gibt mit <Nummer> an, auf welche Antwort er tippt. Versucht ein Client, ein zweites Mal einen Tipp abzugeben oder auf seine eigene Antwort zu tippen, wird eine Fehlermeldung <Text> zurückgegeben. Sobald alle Clients einen Tipp übermittelt haben, wechselt der Server in die Spielphase 3.
Spielphase 3
Client an Server · Server an Client · Kommentar
· AUSWERTUNG <Reingefallene>@<Richtige> · Übermittelt zu Beginn von Spielphase 3 die Auswertung der laufenden Spielrunde.
<Reingefallene> listet die Namen der auf eine falsche Antwort Hereingefallenen auf.
<Richtige> listet die Namen derjenigen auf, die sich für die richtige Antwort entschieden hatten.
In beiden Listen werden die Inhalte durch das Zeichen | voneinander getrennt. Die beiden Listen werden durch das Trennzeichen @ voneinander getrennt.
Nach der Auswertung wechselt der Server in die Spielphase 0.
Anhang: Dokumentationen der verwendeten Klassen
Die Klasse NobodyKnowsServer
Ein Objekt dieser Klasse stellt einen Server für das Spiel dar. Er verwaltet die Mitspielenden und wickelt ein Spiel inklusive der sich dadurch ergebenden Kommunikation mit den Clients ab. Dabei wird das Protokoll gemäß Anlage 1 benutzt.
Ausschnitt aus der Dokumentation der Klasse NobodyKnowsServer
NobodyKnowsServer(int pPort)
Ein Server für das Spiel NobodyKnows wird initialisiert. Die Liste der Mitspielenden ist zu Beginn leer und es ist kein Spiel gestartet.
void sendeSpielerliste()
Eine Spielerliste wird gemäß dem Kommando SPIELERLISTE an alle Clients übertragen.
boolean starteSpiel()
Sind bereits Mitspielerinnen und Mitspieler vorhanden, wird ein neues Spiel bzw. eine neue Spielrunde gestartet. Dazu wird eine zufällige Frage geladen, in Spielphase 1 gewechselt und true zurückgegeben. Konnte kein Spiel bzw. keine Spielrunde gestartet werden, weil keine Spielerinnen oder Spieler registriert sind, wird false zurückgegeben und die Spielphase nicht verändert.
boolean hatAntwortEingereicht(Spieler pSpieler)
Es wird true zurückgegeben, wenn durch den Client, der durch pSpieler identifiziert wird, bereits eine Antwort für die in der laufenden Spielrunde gestellte Frage eingereicht wurde. Ist dies nicht der Fall oder ist pSpieler == null, wird false zurückgegeben.
boolean hatGetippt(Spieler pSpieler)
Es wird true zurückgegeben, wenn durch den Client, der durch pSpieler identifiziert wird, bereits ein Lösungs-Tipp für die in der laufenden Spielrunde vorgestellten Antworten abgegeben wurde. Ist dies nicht der Fall oder ist pSpieler == null, wird false zurückgegeben.
void erfasseTipp(Spieler pSpieler, int pNummer)
Die Methode speichert, dass der Client, der durch pSpieler identifiziert wird, in der laufenden Spielrunde auf den Antworttext mit der Nummer pNummer getippt hat. Hatte der Client bereits zuvor einen Tipp abgegeben, geschieht nichts. Wird am Ende festgestellt, dass alle Clients einen Tipp abgegeben haben, wechselt der Server in die Spielphase 3.
void wasTueIch(Antwort pAntwort)
Diese Methode wird im Rahmen von Aufgabenteil c) analysiert.
void werteAus()
Auf Basis der abgegebenen Tipps werden die Punktzahlen dieser Spielrunde ermittelt und den entsprechenden Spieler-Objekten angerechnet. Das Kommando AUSWERTUNG wird erstellt und an alle Clients gesendet. Anschließend wechselt der Server in die Spielphase 0.
void processNewConnection(String pClientIP, int pClientPort)
Eine neue Verbindung zu einem Client mit der angegebenen IP-Adresse-/Port-Kombination wird aufgenommen und initialisiert.
void processMessage(String pClientIP, int pClientPort, String pMessage)
Ein von einem Client übermitteltes Kommando pMessage wird interpretiert.
void processClosingConnection(String pClientIP, int pClientPort)
Die Verbindung zu dem Client mit der angegebenen IP-Adresse-/Port-Kombination wurde beendet. Das laufende Spiel wird dadurch beendet und das zugehörige Spieler-Objekt aus der Liste der Mitspielerinnen und Mitspieler gelöscht.
Die Klasse Antwort
Ein Objekt dieser Klasse repräsentiert eine der in jeder Fragerunde möglichen Antworten. Bei einer Spielrunde mit n Spielerinnen und Spielern gibt es n+1 mögliche Antworten, n von den Spielerinnen und Spielern und die korrekte Antwort. Zusätzlich verwaltet ein Objekt dieser Klasse auch die Menge derjenigen Spielerinnen und Spieler, die sich für diese Antwort entschieden haben, also auf sie getippt haben.
Ausschnitt aus der Dokumentation der Klasse Antwort
Antwort(Spieler pEinreicher, String pText)
Ein neues Antwort-Objekt wird erstellt. Als Einreicher bzw. Einreicherin des Textes wird das Objekt pEinreicher gespeichert, als dessen bzw. deren Antworttext pText. Hat pEinreicher den Wert null, stellt diese Antwort die korrekte Lösung zur Frage der aktuellen Spielrunde dar.
Spieler gibEinreicher()
Gibt dasjenige Spieler-Objekt zurück, durch das diese Antwort eingereicht wurde. Wird null zurückgegeben, dann handelt es sich bei der durch dieses Objekt referenzierten Antwort um die richtige Lösung zu der Frage der aktuellen Spielrunde.
String gibText()
Der Text dieser Antwort wird zurückgegeben.
List<Spieler> gibTipper()
Die Liste aller Spielerinnen und Spieler, die in der laufenden Spielrunde auf diese Antwort getippt haben, wird zurückgegeben.
void fuegeTipperHinzu(Spieler pTipper)
pTipper wird der Liste derjenigen Spielerinnen und Spieler hinzugefügt, die in der laufenden Spielrunde auf diese Antwort getippt haben.
boolean istRichtigeAntwort()
Gibt true zurück, wenn es sich bei diesem Antwort-Objekt um die richtige Antwort auf die Frage der aktuellen Spielrunde handelt, ansonsten false.
Die Klasse Frage
Ein Objekt dieser Klasse repräsentiert eine Frage (inklusive der korrekten Antwort darauf), wie sie zu Beginn jeder Spielrunde gestellt wird.
Ausschnitt aus der Dokumentation der Klasse Frage
Frage(String pFrageText, String pLoesungsText)
Ein neues Frage-Objekt wird mit dem angegebenen Fragetext und Lösungstext wird erstellt.
String gibFrageText()
Der Text dieser Frage wird zurückgegeben.
String gibLoesungsText()
Der Lösungstext zu dieser Frage wird zurückgegeben.
Die Klasse Spieler
Ein Objekt dieser Klasse repräsentiert einen Mitspieler oder eine Mitspielerin in der laufenden Spielrunde.
Ausschnitt aus der Dokumentation der Klasse Spieler
Spieler(String pName, String pIP, int pPort)
Ein neues Spieler-Objekt wird mit dem angegebenen Namen erstellt. Die Parameter pIP und pPort identifizieren den Client, von dem aus das Kommando SPIELER zum Erzeugen dieses neuen Objektes gesendet wurde.
String gibIP()
Die IP-Adresse des Clients, von dem die Erzeugung dieses Objekts veranlasst wurde, wird zurückgegeben.
int gibPort()
Die Port-Nummer des Clients, von dem die Erzeugung dieses Objekts veranlasst wurde, wird zurückgegeben.
String gibName()
Der Name des Spielers oder der Spielerin wird zurückgegeben.
int gibPunkte()
Die über alle Spielrunden insgesamt erreichten Punkte dieses Spielers bzw. dieser Spielerin werden zurückgegeben.
void setzePunkte(int pPunkte)
Die Punkte dieses Spielers bzw. dieser Spielerin werden auf den Wert pPunkte gesetzt.
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.
Die Klasse Server
Objekte von Unterklassen der abstrakten Klasse Server ermöglichen das Anbieten von Serverdiensten, sodass Clients Verbindungen zum Server mittels TCP/IP-Protokoll aufbauen können. Zur Vereinfachung finden Nachrichtenversand und -empfang zeilenweise statt, d. h., beim Senden einer Zeichenkette wird ein Zeilentrenner ergänzt und beim Empfang wird dieser entfernt. Verbindungsannahme, Nachrichtenempfang und Verbindungsende geschehen nebenläufig. Auf diese Ereignisse muss durch Überschreiben der entsprechenden Ereignisbehandlungsmethoden reagiert werden. Es findet nur eine rudimentäre Fehlerbehandlung statt, sodass z. B. Verbindungsabbrüche nicht zu einem Programmabbruch führen. Einmal unterbrochene oder getrennte Verbindungen können nicht reaktiviert werden.
Dokumentation der Klasse Server
Server(int pPort)
Ein Objekt vom Typ Server wird erstellt, das über die angegebene Portnummer einen Dienst anbietet. Clients können sich mit dem Server verbinden, sodass Daten (Zeichenketten) zu diesen gesendet und von diesen empfangen werden können. Kann der Server unter der angegebenen Portnummer keinen Dienst anbieten (z. B. weil die Portnummer bereits belegt ist), ist keine Verbindungsaufnahme zum Server und kein Datenaustausch möglich.
boolean isOpen()
Die Anfrage liefert den Wert true, wenn der Server auf Port pPort einen Dienst anbietet. Ansonsten liefert die Methode den Wert false.
boolean isConnectedTo(String pClientIP, int pClientPort)
Die Anfrage liefert den Wert true, wenn der Server mit dem durch pClientIP und pClientPort spezifizierten Client aktuell verbunden ist. Ansonsten liefert die Methode den Wert false.
void send(String pClientIP, int pClientPort, String pMessage)
Die Nachricht pMessage wird – um einen Zeilentrenner erweitert – an den durch pClientIP und pClientPort spezifizierten Client gesendet. Schlägt der Versand fehl, geschieht nichts.
void sendToAll(String pMessage)
Die Nachricht pMessage wird – um einen Zeilentrenner erweitert – an alle mit dem Server verbundenen Clients gesendet. Schlägt der Versand an einen Client fehl, wird dieser Client übersprungen.
void closeConnection(String pClientIP, int pClientPort)
Die Verbindung des Servers zu dem durch pClientIP und pClientPort spezifizierten Client wird getrennt. Zuvor wird die Methode processClosingConnection mit IP-Adresse und Port des jeweiligen Clients aufgerufen. Ist der Server nicht mit dem in der Parameterliste spezifizierten Client verbunden, geschieht nichts.
void close()
Alle bestehenden Verbindungen zu Clients werden getrennt und der Server kann nicht mehr verwendet werden. Ist der Server bereits vor Aufruf der Methode in diesem Zustand, geschieht nichts.
void processNewConnection(String pClientIP, int pClientPort)
Diese Ereignisbehandlungsmethode wird aufgerufen, wenn sich ein Client mit IP-Adresse pClientIP und Portnummer pClientPort mit dem Server verbunden hat. Die Methode ist abstrakt und muss in einer Unterklasse der Klasse Server überschrieben werden, sodass auf den Neuaufbau der Verbindung reagiert wird. Der Aufruf der Methode erfolgt nicht synchronisiert.
void processMessage(String pClientIP, int pClientPort, String pMessage)
Diese Ereignisbehandlungsmethode wird aufgerufen, wenn der Server die Nachricht pMessage von dem durch pClientIP und pClientPort spezifizierten Client empfangen hat. Der vom Client hinzugefügte Zeilentrenner wurde zuvor entfernt. Die Methode ist abstrakt und muss in einer Unterklasse der Klasse Server überschrieben werden, sodass auf den Empfang der Nachricht reagiert wird. Der Aufruf der Methode erfolgt nicht synchronisiert.
void processClosingConnection(String pClientIP, int pClientPort)
Sofern der Server die Verbindung zu dem durch pClientIP und pClientPort spezifizierten Client trennt, wird diese Ereignisbehandlungsmethode aufgerufen, unmittelbar bevor die Verbindungstrennung tatsächlich erfolgt. Wird die Verbindung unvermittelt unterbrochen oder hat der in der Parameterliste spezifizierte Client die Verbindung zum Server unvermittelt getrennt, erfolgt der Methodenaufruf nach der Unterbrechung/Trennung der Verbindung. Die Methode ist abstrakt und muss in einer Unterklasse der Klasse Server überschrieben werden, sodass auf das Ende der Verbindung zum angegebenen Client reagiert wird. Der Aufruf der Methode erfolgt nicht synchronisiert.
Teilaufgabe b)
[6 + 3 + 3 Punkte]
b.1)
Erläutern Sie, wie die Klassen NobodyKnowsServer, Server, Antwort, Frage und Spieler in der Modellierung von Abbildung 2 zueinander in Beziehung stehen.
b.2)
Erläutern Sie, aus welchem Grund sich die Antworten der laufenden Spielrunde in einem Feld (Array) speichern lassen.
b.3)
Erläutern Sie, weshalb es zweckmäßig ist, dass Objekte der Klasse Spieler eine IP-Adresse sowie einen Port speichern.

Lösung
Nach den offiziellen Korrekturhinweisen
Erläutern Sie, wie die Klassen NobodyKnowsServer, Server, Antwort, Frage und Spieler in der Modellierung von Abbildung 2 zueinander in Beziehung stehen.
Lösung: Ein Objekt der Klasse NobodyKnowsServer erbt von der abstrakten Klasse Server und muss daher deren abstrakte Methoden implementieren. Es verwaltet darüber hinaus die Liste aller eingetragenen Spielerinnen und Spieler sowie ein Feld (Array) aller zur Verfügung stehenden Fragen, die in der aktuellen Spielrunde gestellte Frage und die darauf gegebenen Antworten. Objekte der Klasse Frage verwalten den Text der Frage und den Text der Lösung zu dieser Frage. Objekte der Klasse Antwort verwalten den Text der Antwort sowie dasjenige Spieler-Objekt einreicher, durch das diese Antwort eingereicht wurde. Außerdem verwalten sie eine Liste tipper aller Spieler-Objekte, die auf diese Antwort getippt haben, sie also für korrekt halten. Objekte der Klasse Spieler schließlich verwalten die IP-Adresse und den Port ihres Clients sowie den Namen des Spielers oder der Spielerin und dessen oder deren Punkte.
Erläutern Sie, aus welchem Grund sich die Antworten der laufenden Spielrunde in einem Feld (Array) speichern lassen.
Lösung: Die in einer laufenden Spielrunde gegebenen Antworten können in einem Feld (Array) verwaltet werden, da die Anzahl der zu verwaltenden Antworten konstant ist und mit Beginn der Spielrunde festliegt.
Erläutern Sie, weshalb es zweckmäßig ist, dass Objekte der Klasse Spieler eine IP-Adresse sowie einen Port speichern.
Lösung: Eine einem NobodyKnowsServer-Objekt über den Aufruf der Methode processMessage übergebene Nachricht wird durch die IP-Adresse und den Port des Clients identifiziert, der die Nachricht gesendet hat. Da jeder Mitspieler und jede Mitspielerin in dem Spiel einen eigenen Client benutzt, identifizieren dessen IP-Adresse und Port das zugehörige Spieler-Objekt. Die Kombination IP-Adresse / Port kommt also einer ID für Spieler-Objekte gleich, sodass der Server darüber jede Nachricht einem Spieler-Objekt zuordnen kann.
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 1 - Objektorientierte Modellierung · LK · Haupttermin · Weiterbildungskolleg 2023 · Aufgabe 1 - Objektorientierte Modellierung mit Im… · LK · Nachtermin 2023 ›
Mehr Aufgaben zu Objektorientierte Modellierung mit Implementationsdiagrammen
- Aufgabe 1 - Objektorientierte Modellierung · GK · Nachtermin 2023
- Aufgabe 2 - Objektorientierte Modellierung · GK · Nachtermin 2023
- Aufgabe 1 - Objektorientierte Modellierung · LK · Haupttermin 2023
- Aufgabe 2 - Objektorientierte Modellierung · LK · Haupttermin 2023
- Aufgabe 1 - Objektorientierte Modellierung · LK · Haupttermin · Weiterbildungskolleg 2023
- Aufgabe 1 - Objektorientierte Modellierung mit Im… · LK · Nachtermin 2023
- Aufgabe 1 - Objektorientierte Modellierung · GK · Haupttermin 2022
- Aufgabe 2 - Objektorientierte Modellierung · GK · Haupttermin 2022
- Aufgabe 1 - Modellierung · GK · Nachtermin 2022
- Aufgabe 2 - Modellierung · GK · Nachtermin 2022