Chapter_6: "Creating Special Actions in Our Game" $
Wir fügen dem Spiel nun einige spezielle Aktionen hinzu, die der Spieler, das bist Du, ausführen muss, um das Spiel zu gewinnen. Mit dem ersten Kommando wird die Kette an den Eimer geschmiedet. Diese Aktion findet auf dem Dachboden des Hauses statt. Sinn macht das natürlich nur, wenn das nicht schon bereits erledigt ist. Deswegen wird als erstes eine neue globale Variable definiert, die festhält, ob diese Aktion schon stattgefunden hat oder nicht. Auch sollte der Spieler die Kette und den Eimer im Gepäck haben. Die Antwort des Kommandos weld ist also an viele Bedingungen gebunden. Sind alle Voraussetzungen erfüllt, wird geschmiedet, das heißt, die globale Variable chain_welded wird auf true gesetzt.
chain_welded: false$
infix("weld")$ "weld"(subject,object):= if location='attic and subject='chain and object='bucket and have('chain) and have('bucket) and not chain_welded then ( chain_welded: true, "the chain is now securely welded to the bucket. ") else "you cannot weld like that. "$
Da in diesem Fall zwei Argumente verwendet werden, wurde das Kommando als Infix-Operator definiert. An dieser Stelle soll jetzt keine Diskussion darüber losgetreten werden, ob die Begriffe subject und object grammatikalisch richtig gewählt wurden. Es bleibt jedenfalls zu hoffen, dass der geneigte Leser hier über die sprachlich nicht wirklich elegante Formulierung des Kommandos hinwegsehen kann.
chain weld bucket;
==> you cannot weld like that.
Offensichtlich waren noch nicht alle Bedingungen erfüllt.
Ist die Kette einmal sicher an den Eimer geschmiedet, können wir damit dann Wasser aus dem Brunnen holen.
bucket_filled: false$
infix("dunk")$
"dunk"(subject,object):= if location='garden and subject='bucket and object='well and have('bucket) then ( if chain_welded then ( bucket_filled: true, "the bucket is now full of water. ") else "the water level is too low to reach.") else "you cannot dunk like that. "$
Wir sehen, dass sich die Befehle weld und dunk sehr ähneln. Beide überprüfen erst einmal, ob Ort, Subjekt und Objekt stimmen. Man findet dann aber wiederum auch genug Unterschiede, so dass man nicht alles in eine einzige Funktion stecken kann. Aber, wie gesagt, Maxima baut auf Lisp auf, und das heißt, das es auch für dieses Problem eine Lösung gibt: SPELs.