Einen Textadventure-Interpreter programmieren - Adventurekurs für BASIC Einsteiger

2024 ж. 25 Сәу.
1 995 Рет қаралды

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.

    @ElecV@ElecV Жыл бұрын
    • Huch, das ist mir garnicht aufgefallen. 😅

      @C64@C64 Жыл бұрын
  • Klasse Video Dickes Lob ! Du kannst sehr gut Erklären.

    @Christian-Drackert@Christian-Drackert Жыл бұрын
    • Vielen Dank!

      @C64@C64 Жыл бұрын
  • 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. 😅

    @hugoegon8148@hugoegon8148 Жыл бұрын
    • Ja, es wird beim nächsten mal ein komplettes Cleanup geben, incl. Kommentare. 😅

      @C64@C64 Жыл бұрын
  • 😀like59👍

    @vijovideo-johnnykicker@vijovideo-johnnykicker Жыл бұрын
  • 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....

    @AlexanderKurtz@AlexanderKurtz Жыл бұрын
  • 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.

    @hugoegon8148@hugoegon8148 Жыл бұрын
  • 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... ☝🤨

    @carstuskaktus7638@carstuskaktus7638 Жыл бұрын
    • 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... 😅

      @C64@C64 Жыл бұрын
  • Wann machst du denn wieder einen Diskettendienstag? (-:

    @SonganDrakensang@SonganDrakensang Жыл бұрын
    • Sobald es die Zeit zulässt... 🙈😉

      @C64@C64 Жыл бұрын
    • Jedenfalls nicht am Sonntag. 😂

      @mad_circuits@mad_circuits Жыл бұрын
  • 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?

    @agentomat@agentomat Жыл бұрын
    • Nein, Events kennt das BASIC von damals noch nicht, zumindest nicht auf dem C64.

      @C64@C64 Жыл бұрын
    • @@C64 Gibts denn jumptabels und interrupts in die man was reinpoken kann?

      @agentomat@agentomat Жыл бұрын
    • @@agentomat ja klar, die gibt's. Aber genaueres dazu kann ich dir nicht sagen, da ich mich damit nicht ausreichend auseinander gesetzt habe... 😅🙈

      @C64@C64 Жыл бұрын
    • @@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@MangoJones139 Жыл бұрын
    • @@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.

      @agentomat@agentomat Жыл бұрын
  • 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?

    @AlexanderKurtz@AlexanderKurtz Жыл бұрын
    • Guter Punkt, da hast Du recht! 🙂

      @C64@C64 Жыл бұрын
    • 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

      @kiwischolz9811@kiwischolz9811 Жыл бұрын
    • 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... 🤗🤗

      @C64@C64 Жыл бұрын
  • 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 😃

    @Wolfgang.-@Wolfgang.- Жыл бұрын
    • Das habe ich noch vergessen: wenn man in der IF Zeile noch Platz hätte, kann man mit I=5 noch die Schleife beenden.

      @Wolfgang.-@Wolfgang.- Жыл бұрын
  • 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

    @jxrx@jxrx Жыл бұрын
    • 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! 🤔😁

      @C64@C64 Жыл бұрын
  • @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.

    @kiwischolz9811@kiwischolz9811 Жыл бұрын
    • Hmm... also ich sehe nicht, das irgendwas zurück gehalten wurde... 🤔

      @C64@C64 Жыл бұрын
    • @@C64 komisch, aber danke fürs schauen. Dann werde ich den alten Kommentar gleich mal löschen und neu einstellen

      @kiwischolz9811@kiwischolz9811 Жыл бұрын
  • 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?

    @Orschd@Orschd Жыл бұрын
    • Hallo, das kann ich Dir leider nicht beantworten, da ich das System nicht kenne... 🙈

      @C64@C64 Жыл бұрын
    • @@C64 Kein Ding. Vielleicht weiß es jemand. Falls nicht, ich habe einen Compiler gefunden. Liegt vermutlich am AMSDOS Basic.

      @Orschd@Orschd Жыл бұрын
KZhead