Einen Textadventure-Interpreter programmieren - Adventurekurs für BASIC Einsteiger
In dieser Kursreihe für Programmieranfänger zeige ich euch eine Möglichkeit, ein Text-Adventure auf dem C64 zu programmieren. Die Eingaben des Spielers sollen analysiert werden. Dazu schreiben wir einen einfachen Interpreter, der den eingegebenen Satz in seine Worte zerlegt und unnötige Worte aussortiert.
Dazu brauchen wir auch neue Befehle: Mit LEFT$, MID$, RIGHT$ und LEN analysieren wir die eingegebene Zeichenkette.
Mit GOSUB können wir Programmteile von verschiedenen Stellen aus anspringen und an den Sprungpunkt zurück kehren.
MIT GET in Kombination mit IF fragen warten wir einen Tastendruck ab.
Hier der Link zum öfter zitierten BASIC Grundlagenvideo: • Dein Einstieg in die P...
Die komplette Playlist mit allen Kursvideos findet ihr hier: • Lerne als BASIC Einste...
Supporte mich und meinen Kanal!
Kanalmitgliedschaft: / @c64
Meine Kaffeekasse: streamelements.com/n3rdroom/tip
0:00:00 Neue Befehle
0:01:18 GOSUB
0:10:13 Die Stringfunktionen: LEFT$ MID$ RIGHT$
0:14:03 Der Projektstand
0:16:28 Die Eingabe in einzelne Wörter zerlegen
0:46:16 Dreiwortparser
0:48:56 Unnötige Worte ausfiltern
1:14:50 Welche Befehle kennt das Spiel
1:28:39 Der GET Befehl: Auf Taste warten
1:33:26 Der Befehl GEHE
Links:
Discord: / discord
Instagram: / n3rdroom
TikTok: / n3rdroom
Facebook: / n3rdroom
Web: www.n3rdroom.de
#c64 #basic #programmierenlernen
Ich mag die ganze Kurse. Selbst programmier ich nix (eher nur Musikinstrumente), aber es macht einfach Spass mitzuhören. Bist mittendrin vom "Du" in deine reguläre "euch" Form gewechselt. Die passt aber auch besser zu dir und die ist man von den ganzen Livestreams und Disketten Dienstagen gewöhnt.
Huch, das ist mir garnicht aufgefallen. 😅
Klasse Video Dickes Lob ! Du kannst sehr gut Erklären.
Vielen Dank!
1:22:05 Na dann schreib doch mehr Kommentare rein. 😊 Langsam fällt es mir schwer zu folgen. Aber nee, "Code ist Dokumentaion genug". Wie auf Arbeit. 😅
Ja, es wird beim nächsten mal ein komplettes Cleanup geben, incl. Kommentare. 😅
😀like59👍
Habe gerade was bezüglich der Verbesserung von INPUT und der Ausgabe des ? "herausgefunden". Es ist möglich einen Eingabekanal per OPEN 50,0 zu eröffnen, der die Tastatur verwendet. Wird dann mit INPUT# 50,EG$ eine Eingabe "Angefordert", so entfällt die Ausgabe eines "?", das frei mit dem Cursor über den Bildschirm laufen geht aber auch damit noch :( . Mit OPEN 3,3 kann auch der SCRREN als Kanal geöffnet werden, und INPUT#3,L$ liest eine ganze Bildschirmzeile ab Cursorposition in L$, kann sicher auch mal nützlich sein....
1:08:30 Zeile 2195 würde ich löschen und in Zeile 2200 das WI als Ende der for-Schleife nehmen. Du hast ja nicht immer 8 Wörter in EW$. Zeile 2240 musst du dann anpassen.
Im Spiel "Im Tal des Echsenkönigs" hatte ich so einen Parser, der bis zu 4 Befehle nacheinander abarbeiten konnte. Ich muss mal suchen, ob ich das noch irgendwo liegen habe und sende dir das dann... ich will dann auch keine DM60, wie damals dafür haben 😉 Übrigens konnte man bei mir den Cursor nicht über den Bildschirm flitzen lassen... aber ich gucke mal weiter, vielleicht gehst du das Problem ja noch an. Edit: Ein Coder entschuldigt sich nicht... er bittet um harte und gerechte Bestrafung... ☝🤨
Ja, eine Eingaberoutine wird noch kommen... 🙂 Zu den 4 Befehlen: ich halte es einfach nicht für Sinnvoll in einem Adventure. Außer man kennt die Lösung schon und will noch schneller durchrennen, als mit Einzelbefehlen... 😅
Wann machst du denn wieder einen Diskettendienstag? (-:
Sobald es die Zeit zulässt... 🙈😉
Jedenfalls nicht am Sonntag. 😂
Hach, war das schön als busy-waiting (wie im GET-Beispiel) noch ein legitimes Programmierkonzept war...^^ Geht eigentlich eventbasiert irgendwas über Basic? Vielleicht irgendein Jump in einen Basic-Handler wenn z.B. eine Taste gedrückt wird oder ein Timer abläuft?
Nein, Events kennt das BASIC von damals noch nicht, zumindest nicht auf dem C64.
@@C64 Gibts denn jumptabels und interrupts in die man was reinpoken kann?
@@agentomat ja klar, die gibt's. Aber genaueres dazu kann ich dir nicht sagen, da ich mich damit nicht ausreichend auseinander gesetzt habe... 😅🙈
@@agentomat Man kann sich natürlich in den Keyboard-Interrupt einklinken, allerdings nicht direkt aus Basic heraus. Allerdings sollten Interrupt-Routinen auch nie zu lang werden, weil so lange alle anderen Interrupts geblockt werden, jedenfalls ist das mein Kenntnisstand dazu.
@@MangoJones139 Am coolsten wäre natürlich es wie bei einem OS zu machen und eine ISR auf einen Timer-Interrupt zu machen und dann z.B. den Tastaturpuffer dort auszulesen, falls es so einen Puffer und so einen Interrupt beim C64 gibt. Aber ich ahne, dass man wenn, dann von da auch keinen Sprung in Basic-Code machen kann.
44:00 wäre es nicht sinnvoller das Resultat von LEN(EG$) in eine Variable zu schreiben, satt es mehrfach immer wieder ermitteln zu lassen, gerade in der Schleife?
Guter Punkt, da hast Du recht! 🙂
Das ist eigentlich immer eine gute Idee, wenn man das Ergebnis einer Funktion zwischen, wenn es mehrfach verwendet wir. Könnte man z.B. auch beim MID$(EG$,I,1) machen
Ja stimmt, da MID$ sowohl bei dem IF als auch bei der Zuweisung wenn's kein Leerzeichen ist aufgerufen wird... da ist wohl noch Optimierungspotenzial... 🤗🤗
Da der C64 Interpreter ja leider von Microsoft ist, geht bei der Richtungsprüfung leider nicht: "C and (A or B)" statt "(A or B) and C"; um sich die "teure" String-Prüfung zu sparen wenn man eh nicht in die Richtung gehen kann. Man kann aber schreiben: IF C THEN IF A or B THEN Raum = NeuerRaum - ich wollte es nur gesagt haben 😃
Das habe ich noch vergessen: wenn man in der IF Zeile noch Platz hätte, kann man mit I=5 noch die Schleife beenden.
Um ehrlich zu sein, TL;DW. Vielleicht habe ich die Stelle übersprungen, wo Du erklärst warum du interpretierst wie Du interpretierst. Trotzdem folgender Gedanke: Wäre es nicht robuster, den zerlegten Satz von links nach rechts erst nach einem gültigen Verb und dann nach einem dazu passenden Objekt zu durchsuchen? Ohne vorher ungültige Wörter auszusieben, wo es dem Spieler doch nur beliebt etwas einzugeben, auf das Du vorher niemals kommst. Dann könnte der Interpreter 'gehe norden" genau so deuten wie 'wohl an, so gehe gen norden treuer gefährte' (ein bisschen Pathos kann nie schaden) Außerdem könnte der Interpreter z.B. nach 'nutze' 'axt' noch weitersuchen nach baum, tür, zwergenschädel usw usf
Der Gedanke ist sehr gut. 🙂 Ich habe einen simplen Parser gewählt, um das ganze hinten raus nicht zu kompliziert zu machen. Allerdings ist das ganze ja recht modular. Vll. baue ich es später nochmal um, wenn ich die Gegenstände mit drin habe! 🤔😁
@N3rdroom kannst du mal gucken, ob da ein Kommentar von mir im Spam hängen geblieben ist? Ich hatte vor ein paar Tagen was geschrieben und zufällig gesehen, dass offenbar nur ich den hier sehen kann. An einem anderen Rechner mit anderem Account ist er nicht zu sehen.
Hmm... also ich sehe nicht, das irgendwas zurück gehalten wurde... 🤔
@@C64 komisch, aber danke fürs schauen. Dann werde ich den alten Kommentar gleich mal löschen und neu einstellen
So ihr Lieben! Folgende Frage: Ich orientiere mich gerade hier dran, um ein Action-Adventure zu gestalten. Mir geht langsam der Speicher aus, daher fuchse ich mich grade rein wie ich die DATAs als Bin -Datei auslagere. W E I L ---> Es soll mit dem selben Basic auf Spektrum, C64 und CPC 6128 laufen !!! Frage -> Warum nimmt der Schneider ein "GOSUB" in einer Schleife wahr, exekutiert auch den Befehl, ebenso wie der C64, aber der Sinclair will nicht. Wo ist der Unterschied der Schleife mit "Gosub" zu dem eines CPC?
Hallo, das kann ich Dir leider nicht beantworten, da ich das System nicht kenne... 🙈
@@C64 Kein Ding. Vielleicht weiß es jemand. Falls nicht, ich habe einen Compiler gefunden. Liegt vermutlich am AMSDOS Basic.