Technische Tips und Tricks: Ein Parser für Adventures B. Kühnast Wenn man ein eigenes Adventure schreibt, muß man die Eingaben des Spielers in eine computergerechte Form bringen. Dazu (zum "Übersetzen") benutzt man einen Parser. Weil Turbo-Basic die besten String-Befehle enthält, ist das Programm in dieser Sprache geschrieben. DAS HAUPTPROGRAMM --------------------------------------- 100 TRAP 190 110 DIM SATZ$(8 ),WORT$ 20),ERG$(40),VERB$(10),ERG1$(40) 120 INPUT ">",SATZ$ 130 EXEC PARSER 140 ? "'"ERG$"'" 150 GOTO 120 --------------------------------------- Zeile 10 sorgt dafür, daß bei Fehlern in Zeile 190 gesprungen wird. Dort wird versucht, das nächste Wort zu finden. Danach werden die Variablen dimensioniert, und zwar SATZ$ - Text, den der Spieler eingab WORT$ - Wort, das aus dem Satz gelesen wird ERG$ - Der Text für den Computer. Natürlich kann man das Ergebnis auch in Zahlen umsetzen VERB$ - Wort aus dem Wortschatz ERG1$ - Puffer für ERG$ In Zeile 120 wird der Satz eingegeben. Das Komma sorgt dafür, daß kein Fragezeichen erscheint. Danach wird der Parser aufgerufen (130) und das Ergebnis angeziegt(140). (In Klammern die Zeilennummern.) DER PARSER --------------------------------------- 170 PROC PARSER 180 FOUND=0:ERG$="":ERG1$=ERG$ 190 P=INSTR(SATZ$," ") 200 VERB$="" 210 IF P=1 220 SATZ$=SATZ$(2,LEN(SATZ$)) 230 GOTO 190 240 ENDIF 250 IF P=0 260 WORT$=SATZ$ 270 SATZ$="" 280 ELSE 290 WORT$=SATZ$(1,P) 300 SATZ$=SATZ$(P,LEN(SATZ$)) 310 ENDIF --------------------------------------- Nach dem Zurücksetzen der Variablen (180) wird im Satz nach dem nächsten Leerzeichen gesucht (190). Liegt dies an der ersten Stelle (210), wird der Satz gekürzt (220) und weitergesucht. Wird kein Leerzeichen gefunden (250), wird der ganze Satz als Wort genommen (260), andernfalls das Wort abgeschnitten (290) und der Satz gekürzt (300). --------------------------------------- 320 RESTORE 620 330 READ VERB$ 340 P1=UINSTR(WORT$,VERB$) 350 READ ART 360 IF P1>0 370 FOUND=FOUND+1 380 IF ART=1 390 ERG1$=ERG$ 400 VERB$(LEN(VERB$)+1)=" " 410 ERG$=VERB$ 420 ERG$(LEN(ERG$)+1)=ERG1$ 430 ELSE 440 ERG$(LEN(ERG$)+1)=VERB$ 450 ENDIF 460 ELSE 470 GOTO 330 480 ENDIF --------------------------------------- Wir lesen ein Verb aus dem Wortschatz (ab Zeile 620) ein (330) und vergleichen es mit dem Wort (340). UINSTR sorgt dafür, daß Groß- und Kleinbuchstaben keinen Unterschied machen. Wird das Word gefunden, wird der Zähler erhöht (370). Wir brauchen zwei Worte pro Satz, Verb und Objekt. Welche Art das gefundene Wot hat, wird durch die Variable ART eingelesen (350). Ist es ein Verb, wird ein Leerzeichen angehängt (400) und im Erhebnis nach vorne gesetzt (410-420). Ist es ein Objekt, wird es einfach hinten angehängt. Das ganze wiederholt sich so lange, bis entweder der Satz vollständig ist oder das Wort nicht gefunden wurde. In diesem Fall wird das nächste Wort gesucht. Ist der Satz vollständig übersetzt, aber keine 2 Wort gefunden, gibt es eine Fehlermeldung. In jedem Fall wird das Ergebnis mitgeteilt, und der nächste Satz kann eingegeben werden. Natürlich ist dieses Programm nicht vollständig, es könnte allerdings noch ausgebaut werden. Ich hoffe, die Funktionsweise wurde einigermaßen verständlich - Ausprobieren hilft! CU!