________________________________________________________________________
| ||||||||||||||||
5. Programmieren der Ausführungsblöcke
| ||||||||||||||||
5.1. Arten von AktionenAktionen sind Folgen von Anweisungen, die Objekte, Räume oder den Spieler verändern. Aktionen können definiert werden als
Die Aktionen werden sequentiell abgearbeitet. Dabei steht in jeder Zeile eine Anweisung. Nachfolgend werden die Standardprozeduren erläutert. Für die Variablen in den Beschreibungen gilt:
Alle anderen Bezeichner sind ganze Zahlen. | ||||||||||||||||
5.2. Grundprozeduren und -funktionenZur Erleichterung des Programmierens sind schon einige Grundprozeduren vorhanden, die hier kurz erklärt werden: 5.2.1. TextprozedurenDas wichtigste Element in einem Text-Adventure sind wohl die Texte, die auf dem Bildschirm ausgegeben werden sollen. Daher sollen die Befehle zur Textausgabe hier an erster Stelle stehen.
5.2.2. VariablenzuweisungenZur Zuweisung von Variablen stehen folgende allgemeinen Prozeduren zur Verfügung, die anstelle der in den meisten Programmiersprachen üblichen Zuweisungen der Form x = y verwendet werden können:
5.2.3. Prozeduren für Räume und zur FortbewegungFür die Behandlung der Räume gibe es ebenfalls eine Anzahl in TAG vordefinierter Funktionen:
5.2.4. ObjekteUm die Objekte hin- und herjonglieren zu können, gibt es folgende Anweisungen:
5.2.5. Allgemeine SpielprozedurenDiese Prozeduren sind für das allgemeine Spielgeschehen:
5.2.6. Prozeduren zur Belegung von FeldernZur leichteren Handhabung der Felder gibt es folgende Prozeduren:
| ||||||||||||||||
5.3. BedingungenBedingungen sind Abfragen, ob ein Ereignis wahr oder falsch ist. In TAG werden Bedingungen immer in runde Klammern gesetzt. Dabei dürfen keine Klammern ineinandergeschachtelt werden. Ein Schrägstrich vor der Klammer verneint die Bedingung. Bedingungen können miteinander verknüpft werden. Gültige Verknüpfungen sind und und oder: Bed und Bed ist wahr, wenn beide Bedingungen wahr sind. Bed oder Bed ist wahr, wenn mindestens eine der Bedingungen wahr ist.Achtung! TAG behandelt nicht, wie allgemein üblich, die Und-Verknüpfung vorrangig vor der Oder-Verknüpfung, sondern arbeitet die Verknüpfungen der Reihe nach ab. TAG versteht keine verschachtelten Klammern, deshalb müssen Bedingungen, die zuerst ausgewertet werden sollen, mit einer SeiBed-Anweisung einer Hilfsflagge zugewiesen werden:
Da keine verschachtelten Bedingungen verstanden werden, ist es wichtig, zu wissen, wie man verknüpfte Bedingungen ausdrücken kann. So ist z.B.: /(a und b) = /a oder /b /(a oder b) = /a und /b Auf diese Weise kommt man noch einmal um den lästigen Umweg der Hilfsvariablen herum. Die Verneinung einer verneinten Bedingung ist natürlich wieder die Bedingung selber. Doppelte Verneinungen heben sich also auf und werden auch nicht von TAG verstanden. Man kann die Auswertung von links auch auch ausnutzen, um Prioritäten zu setzen: a oder (b und c) -> b und c oder a a oder /(b und c) -> /b oder /c oder a (Dies funktioniert natürlich nur, solange nur eine Verknüpfung vorrangig behandelt werden soll.) TAG kennt verschiedene Bedingungen:
Als Abkürzung kann man mehrere Bedingungen des gleichen Typs in einer zusammenfassen, indem man das letzte Wort wiederholt. Zum Beispiel werden folgende Bedingungen (aObj = Schere Messer Gabel) /(aRaum = Ruine Park) (xObj in Eimer Tasche) /(xObj geschlossen abgeschlossen) von TAG in die folgenden Ketten umgewandelt: (aObj = Schere) oder (aObj = Messer) oder (aObj = Gabel) /(aRaum = Ruine) und /(aRaum = Park) (xObj in Eimer) oder (xObj in Tasche) /(xObj geschlossen) und /(xObj abgeschlossen) Normale Bedingungen werden mit oder verknüpft, verneinte mit und. Diese Abkürzung funktioniert nur bei den Vergleichen mit Operator, bei Ortsangaben, bei Zuständen und bei Attributen. Außerdem muß die Bedingung immer von der selben Art sein. (aObj abgeschlossen in Tasche) funktioniert also nicht. Die folgenden Konstrukte sind jedoch erlaubt: (aObj = akteur Hans) (Nummer < X Y 25) Bedingungen spielen in bestimmten Anweisungen eine Rolle. Dieses sind die Wenn-dann-Anweisungen, die Bed(ingungs)-Anweisungen und ihre Abkürzungen sowie verschiedene Arten von Schleifen. Eine Wenn-dann-Anweisung ermöglicht es, einen oder mehrere Befehle nur dann auszuführen, wenn eine Bedingung erfüllt ist. Die Syntax ist: Wenn (Bed) dann [...] Ende Dabei ist Bed eine Bedingung aus beliebig vielen Einzelbedingungen und das Auslassungszeichen [...] steht für beliebige Anweisungen. Jede dieser Anweisungen steht dabei in einer eigenen Zeile. Alle Anweisungen bis zum Schlüsselwort Ende werden nur ausgeführt, wenn Bed wahr ist. Zum Beispiel Wenn (aRaum draußen) und (Sturm = 15) dann Text 'Der Himmel zieht sich langsam zu und ein unangenehmer Wind bläst scharf über das Land.' Ende Wenn-dann-Anweisungen können auch ineinander geschachtelt werden. (Maximal können 12 Wenn-dann-Bedingungen ineinander liegen.) Wenn (Fisch hier) dann Text 'Es riecht hier ziemlich streng.' Wenn (Katze hier) dann Text 'Die Katze stürzt sich auf den Fisch und vertilgt ihn hastig (und nicht gerade manierlich...)' ObjNach Fisch Nirwana Ende Ende Sehr häufig möchte man zusätzlich Anweisungen geben, wenn die Bedingung nicht erfüllt ist. Dazu kann man die Wenn-dann-Anweisung mit sonst erweitern: Wenn (Bed) dann [...] sonst [...] Ende Wenn Bed wahr ist, werden alle Ausführungen bis zum Kennwort sonst durch geführt, die Ausführungen zwischen sonst und Ende werden übersprungen. Ist die Bedingung Bed falsch, so wird der erste Teil bis sonst übersprungen und nur der zweite Teil von sonst bis Ende durchgeführt. Danach geht es weiter. Zum Beispiel: Text 'Der Bauer sagt:' Wenn (Regen) dann Text '"Verdammtes Scheißwetter heute!"' sonst Text '"Ein schöner Tag, nicht wahr?"' Ende Wenn der Bereich der Wenn-dann-Anweisung nur eine Anweisung enthält und es keinen sonst-Bereich gibt, kann man die Anweisung durch Weglassen des Wortes dann abkürzen. So sind die folgenden drei Anweisungen äquivalent: Wenn (x > 15) dann Sei x 0 Ende Wenn (x > 15) Sei x 0 Wenn (x > 15) Sei x 0 Ob die Anweisung direkt hinter der Bedingung oder in der nächsten Zeile steht, ist dabei egal. Die Anweisung kann auch eine weitere Bedingung oder eine Schleife sein. Diese Notation kann praktisch sein, aber man muß aufpassen, daß man dann und das abschließende Ende wegläßt. Im Zweifelsfall empfiehlt es sich immer, die komplette Schleife anzugeben, um Mißverständnisse auszuschließen. Sehr häufig werden aber Bedingungen abgefragt, um zu prüfen, ob ein Befehl des Spielers durchführbar ist oder nicht. Ist die Bedingung nicht erfüllt, passiert aber nichts. Dazu dient die Bed-Anweisung. Sie springt sofort zum Ende des Ausführungsblocks und gibt nur einen Text aus. Die Syntax ist: Bed (Bed) 'Text' oder Dabei ist Bed die zu erfüllende Bedingung. Ist sie wahr, geht es weiter im Programm. Ist sie falsch, so wird Text Nr aus Block oder der nachfolgend in Anführungszeichen angegebene Text ausgegeben und der Ausführungsblock sofort gestoppt. Dies soll in einem Beispiel verdeutlicht werden: Wir möchten den Befehl graben neu einführen. Als Werkzeug (aObj2) akzeptieren wir nur den Spaten. Bef graben [...] Ausf [...] Bed (aObj2 = Spaten) 'Wie soll ich denn mit [dem aObj2] graben? Das mußt Du mir aber erst erklären.' [...] AusfEnde Anmerkung: Da die Bedingungen unter Umständen sehr lang sein können, finde ich es schöner, den Text in die nächste Zeile zu schreiben. Aus diesem Grund kann bei der Bed-Anweisung der Textstring auch in der nächsten Zeile stehen, während er bei anderen Anweisungen wie Text oder String immer auf derselben Zeile wie der Befehl stehen muß. Das hat außer der Optik des Datensatzes keinen besonderen Grund. Aber das Auge programmiert schließlich mit. Zwei Bedingungen sind besonders wichtig, nämlich, ob das Objekt hier ist und ob der Spieler das Objekt bei sich hat. Dafür gibt es besondere Bedingungen:
Sollen Anweisungen häufiger wiederholt werden, so kann man in TAG einfache Schleifen programmieren, die solange ausgeführt werden, wie eine bestimmte Bedingung wahr ist. Solange (Bed) [...] Ende Dabei muß natürlich vom Programmierer sichergestellt werden, daß die Bedingung durch die Anweisungen in der Schleife falsch werden kann, so daß die Schleife zu einem Ende kommt. Ist das nicht der Fall, so hängt sich das Programm auf, da immer und immer wieder die Schleife abarbeitet. So ist zum Beispiel folgendes Solange (1 < 5) [...] Ende eine Endlos-Schleife, da 1 immer kleiner als 5 ist, was immer auch in der Schleife passiert. Ist die Bedingung beim ersten überprüfen falsch, so wird alles, was zwischen Solange und Ende steht, nicht ausgeführt. TAG kennt auch Schleifen, die eine Variable von einem festen Wert zu einem nächsten zählen. Dies entspricht den Do- oder For-Schleifen, die es in den meisten Programmiersprachen gibt: Schleife Var {von bis} {(Bed)} [...] Ende Es muß die Variable angegeben werden, die variiert werden soll. Dies kann eine Flagge, oder eine beliebige Variable sein. Dann werden die Grenzen des Interwalls angegeben, das Var durchlaufen soll. Bei Flaggen müssen sie angegeben werden, bei Objekten, Räumen und Befehlen werden implizit alle Objekte, Räume und Befehle durchlaufen, wenn sie nicht angegeben werden. Weitehin kann eine Bedingung angegeben werden, so daß Werte übersprungen werden, die diese Bedingung nicht erfüllen. Das ist bei Objekten praktisch: Schleife xObj (xObj in Handtasche) [...] Ende Ähnlich wie die Solange-Schleife arbeitet eine Wiederhole-Schleife. Hier wird die Bedingung nur am Ende der Schleife anbgefragt. Wiederhole [...] bis (Bed) Hier werden die Anweisungen zwischen Wiederhole und bis solange ausgeführt, bis eine Bedingung wahr ist. Da die Überprüfung hier am Ende der Schleife erfolgt, werden die Ausführungen [...] auf jeden Fall mindestens einmal ausgeführt. Eine weitere Bedingungsabfrage ist der Jenach-Befehl, der eine Vereinfachung des Wenn-dann-Befehls für einfache Bedingungen des Typs (X = Y) ist. Jenach ist sehr nützlich, wenn eine Variable auf verschiedene Werte hin überprüft werden soll. Die Syntax ist: Jenach Var (Ber1) [...] (Ber2) [...] (Ber3) [...] ... Ende Dabei steht Var für eine definierte Flagge, für eine Objektvariable, eine Raumvariable oder einen Befehl. Die Ber sind verschiedene Bereiche. Je nach Var können sie Zahlen von 0 bis 255, Objekte, Räume oder Befehle enthalten. Gültige Bereiche sind:
Nach den Bereichsdefinitionen in Klammern folgen dann in gewohnter Form TAG-Anweisungen. Die erste Anweisung kann in derselben Zeile wie die Definition des Bereichs stehen. Ist der momentene Wert von Var in einem Bereich enthalten, so werden die Ausführugen, die nach dem Bereich stehen, ausgeführt, bis ein neuer Bereich definiert wird. Wichtig! Ist Var in einem Bereich und wurden die dazugehörigen Anweisungen abgearbeitet, so wird automatisch zur Ende-Marke gesprungen. Es können also überschneidende Bereiche angegeben werden, aber es wird nur der erste Bereich, in dem sich die Variable befindet behandelt. Nach der gleichen Logik wird sonst einfach als der komplette Bereich der möglichen Werte betrachtet. Es können weitere Bereiche nach sonst definiert werden, aber sie sind wirkungslos. Also, ein kleines Beispiel: Jenach Monat (2) Sei Tage 28 (4 6 9 11) Sei Tage 30 (sonst) Sei Tage 31 Wenn (Monat = 12) dann Text 'Es weihnachtet sehr!' Ende | (Wenn) Ende | (Jenach) Text 'Der [Ord Monat] hat [Num Tage] Tage.' In diesem Beispiel wird nicht beachtet, daß die Monate nur von 1 bis 12 gehen. So hätten hier auch der 0. oder 13. einunddreißig Tage. | ||||||||||||||||
|