J. J. Abrams, Doug Dorst: S.

Das Buch, das ich gelesen habe, heißt S. und ist von Doug Dorst und J. J. Abrams, der wohl die Idee dazu hatte. Es kommt in einem Schuber mit Banderole dran, und in diesem Schuber ist ein Objekt, nämlich ein Buch namens Ship of Theseus, Autor: V. M. Straka, und unter diesem Namen dürfte S. bekannter sein als unter dem technisch korrekten Titel.

Das ist verwirrend, aber wenn man das physische Buch-Objekt erst einmal in der Hand hat, wird alles etwas verständlicher. Das Buch ist die Reproduktion eines nicht existierenden Buchs… nein, doch anders: Das Buch sieht aus wie ein echtes Buch aus den 1950er Jahren, gebunden, ein ehemaliges Bibliotheksexemplar aus dem Bestand einer amerikanischen High School. Hinten sind sogar noch die Stempel der Schule drin, mit den Ausleihdaten. Guck mal, das erste Mal wurde das Buch im Oktober 1957 ausgeliehen, das letzte Mal im Oktober 2000. Das Papier ist schon ein bissen angegilbt, es gibt ein paar Wasser- und noch mehr Stockflecken. Einen Papierumschlag (“Dust Jacket”) muss es sicher mal gegeben haben, aber der ist nicht mehr vorhanden; außen sieht man ein recht abstraktes Design, das man gut und gern in die 1950er Jahre einordnen möchte. Außerdem klebt noch der Bibliotheksaufkleber mit dem Sigel dran, der Bibliotheksnummer: 813.54 STR 1949. “STR” sind die Anfangsbuchstaben des Autors Straka, 1949 ist das Erscheinungsjahr, “813” steht im Dewey Decimal System, das in amerikanischen Bibliotheken viel benutzt wird, für (googelt) “American fiction in English”, und “813.54” für “American fiction published between 1945–1999”. (Mmmh, “819” ist laut Wikipeda für “No longer used – formerly Puzzle activities”, auch nicht schlecht.)

Kurz, das Buch sieht von vorn bis hinten aus wie ein Buch aus dem Jahr 1949, das es ja auch sein soll. (Zugegeben, dass das kein Bleisatz ist, sieht man als Bücherfreund eigentlich gleich.) Komisch, von diesem V. M. Straka hat man noch nie etwas gehört, von dem herausgebenden Verlag auch nicht. Und schau mal, da hat sogar jemand Notizen in das Buch geschrieben, so am Rand, und sogar in verschiedenen Farben und in unterschiedlicher Handschrift…

Also: Den in seiner Welt hochberühmten und vielbeforschten V. M. Straka gibt es in unserer nicht. In seiner Welt ist das ein Exemplar des letzten Romans dieses extrem öffentlichkeitsscheu lebenden Autors, mit F. X. Caldeira als kaum weniger anonymem Herausgegeber. Das Exemplar gehört einem fortgeschrittenen Studenten, der über Straka forscht und seit Schultagen schon Notizen in das Buch macht, mit Bleistift. (Also, “Bleistift”.) Nachdem er es an der Uni versehentlich liegen lässt, findet er plötzlich hineingeschriebene Notizen von einer zweiten Hand, einer etwas jüngeren Studentin, wie sich im Verlauf herausstellt. Er reagiert mit weiteren Notizen, sie mit Antworten darauf, und so liest man bei Lektüre des Buches eigentlich drei verschiedene Geschichten:

  • Die Geschichte von Jen und Eric, wie sie sich nach und nach kennen lernen. Die Geschichte ihrer gemeinsamen Entdeckung und vom Hauen und Stechen in der Straka-Forschungsszene: Plagiate, kleinere Diebstähle, Exmatrikulation und fieses Lehrpersonal. Und vielleicht auch Einbruch und Brandstiftung und Mordundtotschlag, oder war das alles nur Zufall?
  • Die Geschichte um V. M. Straka selber: Gehörte er wirklich zum geheimen Geheimbund der S.? War er ein idealistischer Auftragskiller? Wer war der öffentlichkeitsscheue Autor überhaupt – wenn er nicht gar ein Kollektiv war? Und welches Verhältnis hatte er zu F. X. Caldeira? Forschungsthesen zur Identität Strakas gibt es zuhauf; wer eine davon endgültig klären könnte, dem wäre akademischer Weltruhm gewiss. – Das Geschehen dieser Ebene wirkt eventuell auf die Ebene darüber zurück: Wenn es den Geheimbund der S. wirklich gab, dann ist vielleicht doch er das, der jetzt hinter Jen und Eric her ist.
  • Die Geschichte von S., die eigentliche Geschichte des Romans. Allerdings ist das wahrscheinlich ein Schlüsselroman, so dass auch der Inhalt der Romanhandlung wieder Schlüsse auf die Ebene zuvor ermöglicht.
  • Und wenn man die Fußnoten von F.X. Caldeira noch dazu nimmt, gibt das wieder eine weitere Erzählebene oder jedenfalls einen weiteren Erzähler.

Das ist genau ein Buch für Herrn Rau, dachte sich Frau Rau Ende des letzten Jahres, und beschenkte mich damit. Übrigens ein Buch, das genau nicht für Frau Rau ist, aber das tut nichts zur Sache. Als Produktion ist das Buch sagenhaft. Ich mag mir gar nicht vorstellen, wie aufwändig es ist, das alles zu gestalten. Nicht nur gibt es das Buch und die vielen Randnotizen (in zwei bis drei Schriften, mit verschiedenen Farben, die man veschiedenen Zeitpunkten zuordnen kann). Zwischen den Seiten liegen auch noch: Zeitungsartikel, Postkarten, handbeschriebene (“handbeschriebene”) Servietten, Briefe, Fotos, Kopien aus dem Straka-Archv, eine Seite Universitätszeitung. Sagenhaft. Und ein secret decoder wheel, lange Geschichte, eher sogar überflüssig, für mich jedenfalls. Tatsächlich braucht man es schon, um einen Code zu entschlüsseln, aber den habe ich im Internet nachgeschlagen.

Tatsächlich enthalten die Fußnoten von F. X. Caldeira in jedem Kapitel eine geheime Nachricht. Das hat mich sogar eher gestört. Erstens habe ich die Geduld nicht, die Codes zu knacken, und die meisten werden ja von Jen und Eric (also vor allem: Jen) geknackt. Zweitens scheinen sie mir nicht genug motiviert, auch wenn Gründe dafür genannt werden. Drittens hat mich zumindest der Code von Kapitel 8 aus der Illusion gerissen, denn er basiert auf Bleisatz-Artefakten, die Dorst/Abrams zwar schön reproduzieren können, die Caldeira aber so nie hätte produzieren können. Dann kann man den Druckern ja gleich sagen, dass man hier etwas verschlüsselt.

Ja, und jetzt das Leseerlebnis: Hm. Ein bisschen arg bemüht, und ein bisschen arg mühsam. Dorst hat, habe ich gelesen, mehr oder weniger zuerst den Roman geschrieben und dann wurden die Randbemerkungen ergänzt. Wenn der Roman mich mehr interessiert hätte, hätte ich das vielleicht andersherum gemacht, aber das hat er nicht. Die Geschichte um S. bleibt parabelhaft zweidimensional, eine Reihe von Schauplätzen und Fluchten, alles eher anonym und wenig konkret und nicht in einer greifbaren Welt verwurzelt. Und die Geschichte von Jen und Eric: schon besser. Aber das große Drama enpuppt sich dann als unbegründeter Plagiatsvorwurf und viel Paranoia, meh. (Vgl. Foucaultsches Pendel.) Vermutlich entgeht mir viel, und wenn ich die vielen undokumentierten Codes knacken würde, käme ich ganz anderen Dingen auf die Spur. Zumindest könnte ich als Autor nicht widerstehen, solche Sachen einzubauen, aber ich wäre wohl auch kein guter Autor.

Als Kurzgeschichte hätte mir das besser gefallen. Ich glaube, Nabokovs Pale Fire, vor vielen Jahren, hat mir besser gefallen. Dieser Roman besteht aus einem eigentlichen Text, einem epischen, nicht allzu langen Gedicht, und den sehr ausführlichen Fußnoten des Herausgebers dazu, in denen sich die eigentliche Geschichte abspielt.
Letztlich liest sich S. linearer, als man denkt; die Randbemerkungen sind grob chronologisch, also die Notizen auf den frühen Seiten älter als die auf den letzten Seiten. Bei einer Kurzgeschichte hätte man das anders machen können, bei einem Roman geht es kaum anders.

EIne Frage zur Übersetzung hätte ich: wie ist das Buch übersetzt? Sind Jen und Eric Studierende an einer amerikanischen Bibliothek, die amerikanische Randbemerkungen machen, die – ebenso wie das Buch selbst – einfach ins Deutsche übersetzt sind? Das vermute ich, aber das nimmt dem Buch-Artefakt natürlich wieder die Authentizität. Besser wären zwei deutsche Studierende an einer deutschen Universität mit einer deutschen Ausgabe des Bands. (Straka selber schrieb nicht unbedingt auf Englisch, sondern in vielen Sprachen.) Aber das wäre dann schon eine freiere Übersetzung.

Links:

Webfilter in der Schule

Webfilter in der Schule sind (zumindest in Bayern) nicht vorgeschrieben, dennoch dürften die meisten Schule welche verwenden: Irgendwelche Maßnahmen muss die Schule nämlich ergreifen, und wenn man einen Webfilter installiert hat, können sich Lehrkräfte und Schule auf den berufen und sagen, man habe ja sein Möglichstes getan. Wann spielt das eine Rolle? Wenn Schülerinnen verbotene Seiten anschauen und, das größere Problem, diese braveren Mitschülern zeigen. Dann muss man seine Hände in Unschuld waschen können.

Und ich seh’s ja auch ein. Gerade wenn Schülerinnen und Schüler unbeaufsichtigt an Rechner dürfen, was keinesfalls selbstverständlich (aber dringend nötig) ist, braucht es einen Filter. Aber ich hasse die Teile trotzdem. Auch deshalb, weil sie gerne mal eingestellt sind, dass sie die falschen Seiten sperren (stackoverflow.com, wegen Kategorie Diskussionsforum). Ein mir bekannter Webfilter hat sich etwas Neues einfallen lassen: google.com ist jetzt gar nicht mehr erreichbar und google.de wird über einen eigenen Rechner umgeleitet. So kann man die Suchergebnisse filtern und gesperrte Seiten und Bilder gar nicht mehr erst anzeigen lassen. Dann gibt es auch, schöner Nebeneffekt, keine Beschwerden mehr wegen unerreichbarer Seiten, weil man die gar nicht mehr sieht. Sämtliche Supportseiten bei google.com sind aber auch nicht mehr erreichbar. Und andere Suchmaschinen sind eh nicht betroffen, nur Google – der große deutsche Buhmann. Grr.

Zeitplanung als Lehrer

Unterricht planen und durchführen ist das, was ich am besten kann von den vielen Aufgaben, die ich als Lehrer habe; zumindest jedenfalls ist es das, was mir am meisten Vergnügen bereitet. Es ist aber auch das, wo ich am leichtesten Zeit einsparen kann: Inzwischen habe ich so viele Stunden gehalten, dass ich leicht improvisieren oder, anders gesagt, auf ein Repertoire von bewährten Elementen zurückgreifen kann.

Dabei macht es mir Spaß, mich gründlich vorzubereiten. Das sieht dann meist so aus, dass ich mich in ein Thema einarbeite, drumherum Ideen spinne und Material erzeuge, von dem ich dann einen kleinen Teil auch wirklich im Unterricht einsetze. Aber der Rest bleibt ja auf Festplatte, um vielleicht ein anderes Mal genutzt zu werden.

Bleiben die anderen, ungeliebten Arbeiten. Und die führen schon wieder dazu, dass meine Zeit bis in die Osterferien hinein geplant ist.

  • Wochenende Osterferien minus 4: Didaktik-Klausur Uni korrigieren. (Ich weiß, das wollte ich letzte Woche machen. Habe ich aber nicht.)
  • Montag drauf (am Montag habe ich in diesem Halbjahr keinen Unterricht): Vormittags Vorhaben in der Schule, am Nachmittag Treffen mit externen Partner für eine eventuelle zukünftige Zusammenarbeit.
  • Wochenende Osterferien minus 3: Deutschklausur Q12 korrigieren
  • Montag drauf: Vormittags Besuch in einer Grundschule, am Nachmittag Treffen mit externen Partnern (aber anderen als in der Vorwoche).
  • Wochenende Osterferien minus 2: Deutschklausur Q12 zu Ende bringen; Vorbereitung eines Workshops für einen Fortbildungstag.
  • Woche Osterferien minus 2: nach Nürnberg fahren, den Workshop halten.
  • Wochenende Osterferien minus 1: Es gibt eine “Prüfung für den Hochschulzugang von besonders befähigten Berufstätigen”, die Begabtenprüfung. Da wird man in verschiedenen Fächern schriftlich und mündlich geprüft und schreibt nicht das reguläre Abitur mit, sondern Aufgaben in äquivalentem Umfang. Für eine solche Prüfung muss ich einen Teil der Informatik-Aufgaben erstellen.
  • Woche Osterferien minus 1: Mit einem Kollegen diese Begabtenprüfung fertigstellen.
  • Woche Osterferien minus 1: Am Ende der Woche ist wieder Probestudium Informatik an der LMU, wo ich – in einem Team – einen Workshop leite.
  • 1. Wochenende Osterferien: Frei! Also, vermutlich muss ich die Begabtenprüfung noch endformatieren, aber das geht ja.
  • 1. Woche Osterferien: Weiter mit Probestudium.
  • 2. Wochenende Osterferien: Informatikklausur Q12 korrigieren.
  • Das war’s dann aber auch schon, ab 28.3. habe ich wieder etwas Luft.

Da ist wenig dabei, das sofort erledigt werden muss, aber alles muss rechtzeitig erledigt sein, und da fällt mir nur diese Planung ein. Ich plane eigentlich ungern so weit in die Zukunft, aber anders geht’s nicht. Ich brauche ja auch genug Luft um zwischendrin blöd schauen zu können.

Sperber 2016

sperber2016

Am frühen Morgen zu Besuch, noch nicht ganz hell. Alle zwei oder drei Jahre ist er da, der Sperber, diesmal wohl das Männchen, etwas kleiner als das Weibchen.

(2009)
(2012)
(2013)

Was ich in den Faschingsferien gemacht habe

Erst mal: Die Faschingsferien heißen gar nicht so, sondern Winterferien. Ansonsten: Ich hatte diesmal sehr entspannte Faschingsferien, weil ich nichts für die Schule zu korrigieren hatte. Yay!
Was ich alles getan habe:

Treffen mit anderen Ukulele-Spielern beim 7. Münchner Ukulele-Meetup. Organisiert wird das über eine Meetup-Seite, auf die – und auf dieses spezielle Meetup – mich ein Schüler hingewiesen hat. Dort kann man nach regelmäßigen Meetups in der eigenen Stadt suchen, zu allen möglichen Themen, sich eintragen, und wird über Treffen informiert, bei denen man zu- oder absagen kann. Das kann ein großes Meetup sein wie das PHP User Group Meeting, auf dem ich mal war, oder eine kleinere Gruppe. Der Meetup-Inhaber zahlt zwei doer drei Euro pro Monat, die Mitglieder nichts.

Eine Klausur Deutsch für die Q12 erstellt. Halb so wild: Wir machen das im Team, und ich habe fast nur kopiert und zusammengestellt

Eine Klausur Informatik für die Q12 erstellt. Die ist noch nicht ganz fertig, aber ich schreibe sie auch erst in der zweiten Wohe nach den erien. Da ich vorher aber Deutsch korrigieren werde, muss ich vorarbeiten.

Eine Klausur Didaktik der Informatik für die Uni korrigiert. Zugegeben, damit fange ich erst morgen an, am Wochenende bin ich hoffentlich fertig damit.

Dienstlich korrespondiert: Tatsächlich kommt es mir vor, als schreibe ich jeden Tag dienstliche E‑Mails. Dabei geht es nicht um Kommunikation innerhalb des Kollegiums, sondern vor allem mit Studierenden an der Uni (Beratung bei Programmierprojekten, Terminabsprachen), daneben zur Zeit mit zwei externen Partnern, aus denen sich – vielleicht – etwas für die Schule entwickeln wird.

Den Jamón in drei Teile zersägt und ausgekocht, die Brühe zum Teil eingefroren, zum Teil einen Eintopf daraus gemacht.

Mit einem Freund Musik gemacht; er am Klavier, ich mit der Banjo-Ukulele (weil nur die unverstärkt laut genug ist, um mit dem Klavier mitzuhalten). Wir haben vor fünfundzwanzig Jahren schon zusammen musiziert (Gitarre, Mundhamronika, Klavier), aber so richtig ernsthaft erst seit drei Jahren. Wir spielen Blues und Boogie Woogie und sind grottenschlecht, aber es macht Spaß und wir werden – langsam – immer besser. Auch bei schlechtern Spielern gibt es dann und wann einen Groove.

Bei diesem Freund angeschaut, ob ich bei seinem alten Rechner noch etwas machen kann, der nicht mehr richtig startet. Direkt sentimental geworden: Windows 98, auf einem 486er mit Koprozessor, mit erweitertem Arbeitsspeicher insgesamt 16 MB Arbeitsspeicher. (Sic.) Ich weiß noch, als das viel war.

Präsentation erstellt für den Wahlunterricht Informatik, die den aktuellen Stand des Projekts zusammenfasst und veranschaulicht. Viele Sequenzdiagramme.

Viel programmiert, zum Thema modulares Geschichtenerzählen.

Orangenmarmelade gemacht.

Mit der Programmierung eines Mikroprozessors experimentiert, für Q12 Informatik. Der Einsatz in der Praxis wird aber an der Softwareinstallation im Computerraum scheitern.

Gelesen.

Orangenmarmelade 2016

orangenmarmelade2016

Wie jedes Jahr in letzter Zeit. Diesmal habe ich ein, zwei Gläser mehr gemacht. Frau Rau mag meine Orangenmarmelade ja nicht ganz so fest, sondern ein wenig flüssig, bei mir ist es quasi Orangemarmeladier-Ehrensache, dass die Marmelade anständig geliert; je schnittfester, desto erfolgreicher.

Modulares Geschichtenerzählen in Java, Fortsetzung

(Fortsetzung von hier, wo ich Sunless Sea beschrieben habe. In der ersten Hälfte geht’s ums Prinzip, in der zweiten wird es dann immer technischer.)

Das modulare Prinzip, nach dem in eine bestehende Spielwelt kleine Missionen oder Geschichten eingebaut werden, würde ich gerne für ein Programmierprojekt in der Schule nutzen. Dazu erschafft man gemeinsam eine Fantasy-Welt oder nimmt eine von mir vorgegebene. Die Welt besteht aus vielen Orten, zwischen denen man reisen kann, modelliert als Graph. Jeder Ort hat einen Namen und eine schön geschriebene Beschreibung, jede Verbindung eine Distanz, später können dann gerne noch andere Attribute dazu kommen.

Außerdem sollen Schülerinnen und Schüler so einfach wie nötig Geschichten schreiben können, die in dieser Welt spielen. Wenn man dann eine Klasse von 30 Schülern hat, kriegt man sicher ein Dutzend Geschichten, die man in die Welt setzen kann, und nach und nach können es auch mehr und kompliziertere werden. Aber für den Anfang reichen einfache.

Letztlich ist das auch nichts anderes als das, was man vielleicht mit einem Leveleditor macht, um neue Levels für ein bestehendes Spiel zu erstellen. Aber hier finde ich das einfacher (und als Sprachlehrer reizvoller) dadurch, dass die geschichten vor allem aus Text bestehen und nicht aus der Platzierung von Mauern, Schatzkisten, Waffen, Monstern. Das macht das Programmieren leichter, glaube ich, und erfordert aber mehr kreatives Schreiben.

Schauen wir uns dazu die im letzten Blogeintrag erwähnte Geschichte von Mr Sacks an, dem dunklen Weihnachtsmann. “The Crimson Beast of Winter stirs in your hold…” In seinem Blog stellt der Autor der Geschichte, Richard Cobbett, sie kurz vor. (Hier schreibt er zur von ihm geschriebenen Affeninsel. Und, auch interessant, hier die Writer Guidelines, nach denen die verschiedenen Autoren Geschichten für die Welt von Sunless Sea schreiben.)

(Es folgen Spoiler, sollte klar sein.)

  1. Sobald man am Nordpol-Äquivalent gewesen ist, wird bei der nächsten Ankunft in London die Geschichte ausgelöst
  2. In London macht Mr Sacks einem ein Angebot: Man muss ihn der Reihe nach an drei Orte seiner Wahl bringen. Danach werde man belohnt, es sei aber nicht ungefährlich. Dazu schöne, kurze Prosa über ihn als übernatürliche Schreckensgestalt, der Geschenke einfordert und Übel hinterlässt. Ein einzelner Reiter der Apokalypse sozusagen.
  3. Das Angebot kann man annehmen oder nicht oder die Entscheidung vertagen.
  4. Nimmt man es an, erfährt man das erste Ziel. Genauer gesagt: Man hat die Wahl zwischen zwei Zielen.
  5. Bringt man Mr Sacks zu einem der beiden Orte, kann man ihn seine Geschenke dort abladen lassen oder nicht oder die Entscheidung vertagen.
  6. Führt er seine böse Tat aus, gibt es wieder etwas Prosa, und man erfährt das nächste Ziel beziehungsweise die nächsten zwei Zielmöglichkeiten.
  7. Bringt man Mr Sacks zu einem der beiden Orte, kann man ihn seine Geschenke dort abladen lassen oder nicht oder die Entscheidung vertagen.
  8. Führt er seine böse Tat aus, gibt es wieder etwas Prosa, und man erfährt das letzte Ziel: den Nordpol, wo man ihm bei einem Ritual helfen soll.
  9. Auf dem Weg dorthin, auf See, erhält man eine Nachricht vom Ministerium und eine Flüssigkeit, mit der man das Ritual sabotieren kann.
  10. Bringt man Mr Sacks zum Nordpol, hat man die Option, ihn sein Ritual ausführen zu lassen oder es zu sabotieren. In einem der beiden Fälle wird eine neue Geschichte ausgelöst.
  11. Beim nächsten Besuch in London wartet ein Geschenk von Mr Sacks auf einen. (Eventuell abhängig vom Verhalten zuvor? Das weiß ich nicht, ich habe ja nicht alle Varianten durchgespielt.)
  12. Außerdem: Während dieser Mission erhält man, mehr oder weniger zufällig oder zeitabhängig, jedenfalls nicht bewusst vom Spieler ausgelöst, drei Besuche vom ungeduldiger werdenden Mr Sacks. Die ersten beiden Mal kann man ihn hinhalten, das dritte Mal nicht.

Diese Geschichte riecht nach der Modellierung mit einem Zustandsdiagramm. Warum? Weil es mir sinnvoll erscheint, weil Zustandsdiagramme und deren Umsetzung im Lehrplan für 10 und 12 stehen, und weil ich gar so viele andere Modellierungsmöglichkeiten überhaupt nicht kenne.

Der nackte Zustandsautomat

Ein erstes Diagramm zur Modellierung der Situation oben könnnte so aussehen:

sunless_sea_zustaende

Die Bedeutung der Zustände:

  • Z0: Die Geschichte beginnt, der Auftrag steht im Raum. Man hat die Wahl, ob man ihn annimmt, ablehnt oder erst mal abwartet. Wenn man abwartet, passiert nichts; wenn man ablehnt, landet man im Zustand Z5, wenn man annimmt, in Zustand Z1.
  • Z1: Man hat den Auftrag angenommen, aber noch nichts erfüllt. Man hat die Wahl, Mr Sacks und seine Geschenke in Ziel 1 abzuliefern oder nicht. Man hat, weil das so sein soll ist, nicht mehr die Möglichkeit, aus dem Geschäft auszusteigen und in Zustand Z5 zu kommen.
  • Z2: Man hat das erste Ziel bereits erreicht, das zweite noch nicht, und hat die Wahl, Mr Sacks in Ziel 2 abzuliefern oder (erst mal) noch nicht.
  • Z3: Man hat das zweite Ziel bereits erreicht, den Nordpol noch nicht, und hat die Wahl, Mr Sacks am Nordpol einfach abzuliefern (dann ist man in Zustand Z4) oder sein Vorhaben dort zu sabotieren (dann ist man in Zustand Z5).
  • Z4: Man hat Mr Sacks wunschgemäß abgeliefert, aber seine Belohnung – von der man noch nichts weiß – noch nicht in London abgeholt. Sobald man das tut, landet man in Zustand Z5.
  • Z5: Die Geschichte ist beendet und wird nicht mehr angezeigt. Es gibt drei Möglichkeiten, wie man in diesen Zustand gelangt.

Die Bedeutung der Zustandsübergänge:

  • Von den meisten Zuständen aus kann man in andere Zustände übergehen, abhängig von auslösenden Aktionen. Ich habe die Aktionen hier “annehmen, abwarten, ablehnen” und so weiter genannt.

Die schwarzen Angaben sind ausgelöste Aktionen, die bei dem Zustandsübergang zusätzlich oder nebenbei ausgeführt werden:

  • So soll die Furcht des Spielers um 5 steigen, wenn man den Auftrag annimmt, und wenn man den ersten Schritt ausführt.
  • Die Furcht des Spielers um 10 steigen, wenn man den Auftrag ablehnt, und wenn man den zweiten Schritt ausführt.
  • Die Furcht soll um 10 sinken, wenn man Mr Sacks sabotiert hat, und um 20 sinken, wenn man ihn nicht sabotiert hat.
  • Wenn man seine Belohnung in London abholt, erhält man 20 Geld.

Anmerkungen:

  • Die ausgelösten Aktionen können wesentlich komplexer sein, die Werteänderung ist nur ein Beispiel.
  • Mein erster Versuch hatte übrigens zwei Zustände mehr, bis ich merkte, dass es ja nur einen enzigen Endzustand braucht, egal wie man dorthin kommt.
  • Außerdem kann man in so ein Diagramm auch noch Bedingungen einfügen, die bei einem versuchten Zustandsübergang erfüllt sein müssen. Dass man irgend etwas Bestimmtes mit sich führt, vielleicht. Die habe ich der Einfachheit halber weggelassen.
  • Und was ist mit den drei Erscheinungen von Mr Sacks, mit der letzten, tödlichen? Die habe ich vorerst auch weggelassen. Weglassen ist oft eine gute Idee. Aber ich würde sie ohnehin nicht mit einem Zustandsautomaten umsetzen. Man bräuchte dann nämlich Z1 in zwei Varianten, also Zuständen, für erste und zweite Warnung, und Z2 und Z3 ebenso, und vielleicht einen letzten Zustand für die dritte Warnung. Das wäre mir zu umständlich, stattdessen würde ich ein Attribut “Mr Sacks Ungeduld” einführen und das nach und nach erhöhen (ausgelöst von einem Timer?) und unabhängig von den anderen Zuständen etwas bewirken lassen. Aber erst mal weglassen.
  • Auch der Sabotageauftrag des Ministeriums fehlt. Den könnte man sicher als Zustand modellieren. Aber letztlich ändert sich nicht wirklich etwas am Zustand, es gibt auch keine Wahlmöglichkeit für den Spieler, und deshalb lasse ich das sein. Das Erscheinen des Boten ist eher eine zusätzlich ausgelöste Aktion, die beim Übergang von Z2 nach Z3 automatisch ausgelöst wird, wenn auch mit zeitlicher Verzögerung.

In Java würde man diesen Automaten so implementieren (Stoff der 10. und 12. Jahrgangsstufe am Gymnasium in Bayern, fällt Schülerinnen und Schülern nicht schwer):

public class MrSacks  {
    int state = 0;
    /* states:
     * 0 on offer
     * 1 accepted
     * 2 first package delivered 
     * 3 second package delivered
     * 4 successful north pole
     * 5 story finished
     */
 
    void receiveMessage(String message) {
        if (state==0) {
            if (message.equals("annehmen")) {
                state = 1;
                furchtErhoehen(5); 
            }
            else if (message.equals("ablehnen")) {
                state = 5;
                furchtErhoehen(10);                
            }
        }
        else if (state==1) {
            if (message.equals("abliefern")) {
                state = 2;
                furchtErhoehen(5);
            }
        }
        else if (state==2) {
            if (message.equals("abliefern")) {
                state = 3;
                furchtErhoehen(10);
            }
        }
        else if (state==3) {
            if (message.equals("abliefern")) {
                state = 4;
                furchtErhoehen(-20);
            }
            else if (message.equals("sabotieren")) {
                state = 5;
                furchtErhoehen(-10);
            }
        }
        else if (state==4) {
            if (message.equals("abholen")) {
                state = 5;
                geldErhoehen(20); 
            }
        }
    }
}

Wenn man die Methode receiveMessage jeweils mit den richtigen Argumenten aufruft, durchlebt man quasi die Stationen der Geschichte. Allerdings ist das ja nur das nackte Gerüst der Geschichte. Lebendig und verständlich wird sie erst durch Text, und der fehlt noch.

Der Text der Geschichte

Wir haben: eine Methode, die abhängig von einer Nachricht und dem aktuellen Zustand die Zustände ändert und eventuell noch anderes auslöst.

Wir brauchen: eine Methode, die abhängig vom aktuellen Zustand und dem aktuellen Ort dem Spieler einen bestimmten Text anzeigt und (mehrere) Entscheidungsmöglichkeiten anbietet – und wenn sich der Spieler für eine Möglichkeit entscheidet, muss das unserer ersten Methode kommuniziert werden, damit die Entscheidung dann auch ausgeführt werden kann. Das wird etwas komplizierter.

Zentral ist für mich die Klasse Report. Ein Report ist der Bericht einer Geschichte zu einem bestimmten Ort im Spiel, zu einem bestimmten Zeitpunkt, also abhängig vom Zustand der Geschichte. Ein Report enthält eine kurze Beschreibung einer Situation und beliebig viele Optionen. Aus diesen Optionen werden dann später zum Beispiel die Knöpfe, mit denen der Spieler Entscheidungen treffen kann. Eine Option (ein Knopf) erhält einen Text (eine Beschriftung, die der Spieler sieht) und eine Message (eine Nachricht, die der Spieler nicht sieht, die aber losgeschickt wird, sobald der Spieler sich für diese Option entscheidet).

sunless_report
So könnte der View einen Report darstellen. Oder ganz anders: Hauptsache, er hat alle nötigen Informationen dazu.

Wenn der Spieler an einem Ort ankommt, werden alle mit dem Ort verbundenen Stories gebeten, einen Report abzugeben. Der kann auch mal null sein, wenn es zu diesem Zeitpunkt nichts zu sagen gibt. Alle Reports zu diesem Ort werden vom Model gebündelt und an den View geschickt, damit der die Reports darstellen kann. Dazu hat der View eine Methode showReports. Mehr braucht es erst mal nicht. Der View legt zum Beispiel für jeden Report einen eigenen Absatz an, und am Ende jedes Reports wird für jede Option des Reports ein Knopf mit einer Nachricht dahinter angelegt, den der Spieler drücken kann.

Im vereinfachten Klassendiagramm, noch ohne Darstellung der Bewegungsmöglichkeiten, sieht das so aus:

sunless_classes

Und in Java wäre die Methode für die Geschichten-Klasse dann so:

    Report createReport(String location) {
        Report r = null;
        if (location.equals("London")) {
            if (state==0) {
                String message = "Hohoho! Willst du mich an drei Orte meiner Wahl bringen?";
                Option o1 = new Option("Ja","annehmen");
                Option o2 = new Option("Nein","ablehnen");                
                Option o3 = new Option("Später","abwarten");                
                r = new Report("Weihnachtsmonster", message, o1, o2, o3);
            }
            else if (state==4) {
                String message = "Der Weihnachtsmann hat dir ein Geschenk dagelassen. Willst du es öffnen?";
                Option o1 = new Option ("Ja", "abholen");
                r = new Report("Weihnachtsmonster", message, o1);
            }
        }
        else if (location.equals("Anaheim")|| location.equals("Argentinien") ) {
            if (state==1) {
                String message = "Hohoho! Ist es in Ordnung, wenn ich mein dunkles Geschenk hier abgebe?";
                Option o1 = new Option("Ja","annehmen");
                Option o2 = new Option("Nein","abwarten");
                r = new Report("Weihnachtsmonster", message, o1, o2);
            }
        }
        else if (location.equals("Beorns Halle") || (location.equals("Britannien"))) {
            if (state==2) {
                String message = "Hohoho! Ist es in Ordnung, wenn ich mein dunkles Geschenk hier abgebe?";
                Option o1 = new Option("Ja","annehmen");
                Option o2 = new Option("Nein","abwarten");
                r = new Report("Weihnachtsmonster", message, o1, o2);
            }
        }
        else if (location.equals("Nordpol")) {
            if (state==3) {
                String message = "Du hast die Gelegenheit, dem Weihnachtsmonster zu helfen oder seine Pläne zu sabotieren.";
                Option o1 = new Option("Helfen","abliefern");
                Option o2 = new Option("Sabotieren","sabotieren");
                r = new Report("Weihnachtsmonster", message, o1, o2);
            }
        }
        return r;
    }

Natürlich wird die Geschichte besser, wenn man mehr Reports einbaut. Und was noch fehlt, sind Antworten des Weihnachtsmann, durch die man überhaupt erst erfährt, dass man zuerst nach Anaheim oder Argentinien, danach zu Beorns Halle oder nach Britannien, und danach zum Nordpol muss. Gemach, gemach.

Soweit, wie ich das jetzt geschildert habe, existiert auch ein Prototyp. Funktioniert, einschließlich der automatischen Anzeige von Bewegungsmöglichkeiten: für jeden Nachbarort einen Knopf, der einen nach dem Klick dorthin befördert. Die Reports werden in einer TabbedPane angezeigt, also mit kleinen Reitern oben. (Scrollbarer Text wäre eine Alternative.) Jeder Report hat unten die Buttons mit den Optionen.

Mein Hauptproblem ist noch Folgendes. Ich finde es sehr unelegant, zwei verschiedene, aber doch ähnliche Methoden zu haben. Methode 1 (createReport), um dem Spieler anzubieten, was er für Aktionen auslösen kann. Methode 2 (receiveMessage), um die Entscheidung des Spielers dann umzusetzen. Das Bindeglied ist ist message, die letztlich mittelbar von Methode 1 gesendet und von Methode 2 empfangen wird:

sunless_mein_problem

Am liebsten hätte ich nur eine Methode, Methode 1 (createReport), in der schon unmittelbar drinsteht, was ausgeführt werden soll, wenn der Spieler sich für eine Option entscheidet. Dazu müsste ich entweder Funktionen als Argumente übergeben, was mit Java inzwischen wohl geht, ich aber nicht weiß, ob ich das mit Schülern machen soll. Oder ich müsste ein Objekt einer anonymen inneren Klasse anlegen (zu einer Unterklasse von, sagen wir, Result, mit einer zu überschreibenden execute-Methode). Dann bräuchte ich allein Methode 1 (createReport), und die Optionen, die dem Report als Möglichkeit übergeben würden, sähen dann so aus:

Report createReport(String location) {
    Report r = null;
    if (location.equals("London")) {
        if (state==0) {
            String message = "Hohoho! Willst du mich an drei Orte meiner Wahl bringen?";
            Option o1 = new Option("Ja", new Result() {
                      @Override public void execute() {
                          state = 1;
                          furchtErhoehen(5);                                                
                      }
                  } );
            Option o2 = new Option("Nein", new Result() {
                      @Override public void execute() {
                          state = 5;
                          furchtErhoehen(10);                                                
                      }
                  } );
            Option o3 = new Option("Später", new Result());                
            r = new Report("Weihnachtsmonster", message, o1, o2, o3);

Ist das für Schüler leichter verständlich als das mit den zwei separaten Methoden? Der Report landet dann letztlich beim View, zusammen mit den verschiedenen Optionen, zu deren jeder ein Objekt der anonymen Result-Unterklasse gehört, und wenn der entsprechende Knopf gedrückt wird, wird die execute-Methode dieses Objekts ausgeführt. Der Controller wird dabei gar nicht mehr gefragt.

sunless_report_alternative

Mit den anonymen Unterklassen geht das ganze übersichtlicher und für die Zukunft auch flexibler, deswegen gefällt mir das besser.
Aber ich sehe die Gefahr, dass die Schüler dann einfach unverstandenen Code abtippen, und das ist ja auch wieder nicht das Ziel.


Vielleicht kann ich das Ende des Schuljahres mit meiner 10. durchspielen. Man könnte die typische Heldenreise damit modellieren oder die Odyssee. Weltraumfahrten oder neblichtes London, die zwölf Heldentaten des Herakles. Eine kleine Gruppe implementiert die Welt, mit schönen Beschreibungen für jeden Ort, Bildern und Musik dazu. Die anderen schreiben Geschichten. EIne Geschichte gebe ich als Beispiel vor. Und dann vielleicht doch noch ein Handelssystem? Gegenstände, die der Spieler mit sich führen kann, auch als Token dafür, dass er schon bestimmte Dinge erledigt hat?

Nachtrag: Ja, das geht auch ohne anonyme Klassen in einer einzigen Methode! Aber die wird dadurch sehr unübersichtlich. Auch keine Lösung.

Nachtrag: Hier geht es zum fertigen Projekt (2017).