• Keine Ergebnisse gefunden

2. Übungsblatt Ausgabe:

N/A
N/A
Protected

Academic year: 2022

Aktie "2. Übungsblatt Ausgabe:"

Copied!
2
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

Christoph Lüth Martin Ring Reaktive Programmierung SoSe 17

2. Übungsblatt

Ausgabe: 27.04.17 Abgabe: 11.05.17

2.1 Promise: My Future in Haskell 3 Punkte

In dieser Aufgabe wollen wir Futures und Promises wie wir sie in Scala kennengelernt haben in Haskell im- plementieren. Dazu implementieren wir ein ModulFuturemit den folgenden Funktionen:

data Promise α data Future α

promise :: IO (Promise α) −−Erzeugt einPromise complete :: Promise αα→ IO ( ) −−Erfüllt einPromise

future :: Promise α→ Future α −−DieFuturezu einemPromise onComplete :: Future α→ (α→ IO ( ) )→ Future α

wait :: Future α→ IO α −−Wartet, dass dieFutureerfüllt wird

Dabei sindFutureundPromisekomplett asynchron; es wird nirgendwo ein neuer Thread erzeugt.

Das BeispielRobots.hs(in der Vorlage enthalten) zeigt die Verwendung vonFutureundPromisemit der oben angegebenen Schnittstelle; es sollte sich bei korrekter Implementierung wie das Scala-Beispiel aus der Vorle- sung verhalten.

2.2 MVar in Scala?! 2 Punkte

Nachdem wirFuturein Haskell implementiert haben, wollen wir den anderen Weg gehen undMVarin Scala implementieren. Oder auch nicht — was ist das große Problem bei einer Implementation vonMVarin Scala?

Skizzieren Sie eine Lösung (welche Schnittstelle hätte eine Scala-Implementierung), und schildern Sie die auf- tretenden Probleme.

2.3 6 Nimmt! 15 Punkte

Jetzt wollen wir die ganzenFutures,Promises undMVars endlich auch mal zur Entspannung nutzen. Das Kar- tenspiel 6 Nimmt! der deutschen AMIGO GmbH ist zwar nicht ganz frei von Copyright, für den Privatge- brauch ist gegen eine digitale Nachbildung jedoch sicherlich außer eine geringen fünfstelligen Abmahngebühr kaum etwas einzuwenden.

Ihre Aufgabe ist es, einen Spielserver zu implementieren, mit dem sich bis zu 10 Spieler verbinden können um gegeneinander 6 Nimmt! zu spielen. Die Spielregeln sind unterhttps://www.amigo-spiele.de/spiel/

6-nimmtin verschiedenen Sprachen verfügbar (Die Profi-Variante können Sie ignorieren).

Diese Aufgabe kann entweder in Scala (mitPromises undFutures) oder in Haskell (mitMVars) gelöst werden.

• Modellieren Sie geeignete Datenstrukturen für den Spielzustand eines 6 Nimmt! Spiels:

Spieler sollten zusätzlich zu Hand- und Minuskarten über einen Namen identifiziert werden;

Karten haben neben dem Wert (1-104) auch Minuspunkte (siehe Anleitung);

auf dem Tisch liegen immer vier Kartenreihen (1-5 Karten lang).

• Implementieren Sie nun die eigentlichen Spielzüge:

— Seite 1 von 2 —

(2)

2. Übungsblatt Reaktive Programmierung, SoSe 17

Alle Spieler wählen nebenläufig eine ihrer Handkarten aus (Future/MVar).

Wenn jeder Spieler gewählt hat, werden die Karten aufsteigend nach Wert in die Kartenreihen ein- sortiert.

Wenn eine Karte niedriger ist als die kleinste obere Karte auf dem Tisch, muss der Spieler, welcher diese Karte ausgewählt hat, befragt werden welche Kartenreihe er tauschen möchte (Future/MVar).

• Stellen Sie eine Schnittstelle bereit, um sich mit dem Spielserver zu verbinden. Ihnen steht frei, entwe- der wie in Übung 1 einen Webserver zu implementieren, oder einen einfachen Socket bereit zu stellen (java . net . ServerSocket/Network. Socket).

Zu guter Letzt brauchen wir noch einen geeigneten Client. Implementieren Sie dafür abhängig von ihrer Wahl der Servertechnologie entweder einen Webclient oder einen einfachen kommandozeilenbasierten Client, der sich mit dem Socket verbindet. Der Spielablauf aus Clientsicht soll so aussehen:

1. Beim Verbindungsaufbau gibt der Spieler seinen Namen an

2. Der Spieler wird über die anderen verbundenen Spieler informiert (wird aktualisiert)

3. Wenn alle Spieler gemeinsam entschieden haben, dass das Spiel beginnen kann, fängt die erste Runde an 4. Der Spieler bekommt seine Handkarten und die Tischkarten angezeigt

5. Der Spieler kann nun eine seiner Handkarten auswählen

6. Wenn alle Spieler eine Karte gewählt haben, wird angezeigt, wie die Karten einsortiert werden 7. Muss ein Stapel zum Tauschen ausgewählt werden, wird das dem entsprechenden Spieler angezeigt 8. Wenn alle Karten einsortiert wurden und noch Handkarten vorhanden sind beginnt ein neuer Zug (4.) 9. Ansonsten ist die Runde beendet.

10. Wenn keiner der Spieler mehr als 66 Minuspunkte gesammelt hat, wird eine neue Runde begonnen (4.) 11. Ansonsten ist das Spiel beendet.

12. Der Gewinner ist der Spieler mit den wenigsten Minuspunkten.

Viel Spaß beim Spielen!

Hinweis:

Wieviel auf dem Client und wieviel auf dem Server passiert, und wie diese miteinander kommunizieren ist Ihnen freigestellt. Dokumentieren Sie ihre Entscheidungen.

— Seite 2 von 2 —

Referenzen

ÄHNLICHE DOKUMENTE

Immer dann, wenn ein Scatter-Symbol auf den Rollen erscheint, aktiviert der Flaschengeist eine von 5 Hauptfunktionen für 10 Spiele: Extra-Wild, Wild-Rolle, Expanding-Wild,

- Der Minor Jackpot wird vergeben, wenn eine Reihe vollständig mit Bonussymbolen gefüllt wird. Der Minor Jackpot ist fest und vergibt den 20-fachen Einsatz der Runde, in der

Leicht, facile, facile, eenvoudig, easy Schwer, difficile, difficile, moeilijk, hard Super

Während des Spiels hat der Spieler auch Gelegenheit, die Einsätze durch Teilen (Split) oder Verdoppeln (Double) entsprechend der Spielregeln zu erhöhen6. DOUBLE wird den

Dieses Dokument und sein Inhalt werden durch das internationale Recht über das Copyright geschützt.. Jegliches nicht autorisiertes Veröffentlichen, Kopieren, Verleihen

Wenn der Spieler versucht, auf ein Spiel mit einer ungültigen Session zuzugreifen (zum Beispiel durch Inaktivität oder einen System-Neustart), scheint eine Fehlernachricht im Spiel

Wenn ein einzelner Gewinn größer ist als: Autoplay stoppt, wenn der Gewinnbetrag den vom Spieler angegebenen Betrag erreicht oder überschreitet.. Wenn Bargeld

Während Sie eine Datei anzeigen, können Sie RETURN drücken, um zum vorherigen Menü (JPEG menu)