Basic Mega65 - Boulder Dash

There are 413 replies in this Thread which has previously been viewed 79,596 times. The latest Post (June 2, 2025 at 3:42 PM) was by Endurion.

  • ...

    Wie kann man Beträge löschen, wenn sie kompellt falsch waren ?

    :D :D Ich liebe den Sound vom C64ér :thumbsup: :thumbsup: :thumbsup:

    Edited 2 times, last by Drachen (May 26, 2022 at 5:37 PM).

  • Werde ich dann in zu unseren Programm BD I - Klon assimilieren. :D

    Helfen vielleicht die neuen ROM Befehle den Bildschirminhalt an bestimmten Stellen abzufragen?Please login to see this attachment.

    Oh das müsste man mal Testen.

    Ein echt klasser Befehl. Spart ein haufen Peeks und Pokes. :D

  • Hi Acron

    wollte gerade dein Programm untersuchen und testen. Beim übertragen in das C64Studio werden die Zeilennummer nicht richtig geschrieben siehe Bild

    Please login to see this attachment.

    Könntest du das nocheinmal als BAS Datei speichern für das C64Studio ?

  • Oh das ist schon richtig so, das Programm wurde mit Exobasic erstellt. Hier das richtige Programm zum Arbeiten.

    Wow, das ist aber ein schneller Bildschirmaufbau.

    Da werde ich wohl diese neue Routine in unser Programm einpflegen.

    Muss nur auf die Variabel aufpassen.

    Als letztes bleiben die hohen Zeilennummern, die bremsen ebenfalls etwas.

    Die Zeilennummeren werde ganz am Schluß änderen. Jetzt möchte ich sie nur großräumig auslegen damit ich zwischendrinen was einpflanzen kann wenn es nötig ist. :D

    Die neue Levelaufbauroutine ist eine sehr gute Leistung von dir.

    Jetzt über das lange Wochenend habe ich Zeit haben um das in unser Programm einpflegen.

    Acron warum benutzt du nicht Restor mit Zeilennummer.

    Das setzt den interen Zeiger von Read Data direkt auf auf diese Datazeilen. Dann könnte die Zeile 240 eventuell so ausehen

    Code
    240 RESTORE 1430 :REM DATAZEILE PSEUDO ZUFALL BEI SCHWIERIGKEITSGRAD 1

    Ja ich weis, später brauchen wir auch die ersten Datazeilen. :)


    Was ich mir auch überlegt habe, das komplette Programm mit eine neuen Variabelsystem zu versehen. Es ähnelt dem Hex-System z.B von A-O. Bei O angekommen geht es dann mit AA, BA, CA usw. Aber bei so einen System muss man sich dann alles auf einen Zellet notieren, damit man weis welche Variabel schon belegt sind.

    Was meint ihr Acron und TheRalWanderer sollen wir es so machen. Wenn ja nehme ich mir die Zeit und ändere das dann ab.

  • Ich bin ein Freund davon, wichtige Variablen so zu benennen, dass ihr Inhalt zumindest halbwegs ableitbar ist, wenn man im Code gedanklich drin ist.


    Daher hatte ich sowas wie PD oder PS (Position Diamanten, Steine) usw.

  • Ich bin ein Freund davon, wichtige Variablen so zu benennen, dass ihr Inhalt zumindest halbwegs ableitbar ist, wenn man im Code gedanklich drin ist.


    Daher hatte ich sowas wie PD oder PS (Position Diamanten, Steine) usw.

    Ja da bin ich deiner Meinung. Nur wird es immer schwriger immer einen passen Variabelnamen zu finden der gerade passt. :)

    Es wäre schön, wenn das so wie beim Assembler funktionieren würde , da werden die Labelnamen beim compilieren in Adressen umgewandelt.

    Und somit brauche ich nichtdarauf zu achten wie lange der Labelmane ist.

    OK dann belasse ich das so wie es ist und pflege nur die neue Aufbauroutine ein. ^^

  • Die Zeilennummeren werde ganz am Schluß änderen. Jetzt möchte ich sie nur großräumig auslegen damit ich zwischendrinen was einpflanzen kann wenn es nötig ist.

    Warum benutzt du den Label Mode nicht, da hat man das Problem erst gar nicht.

    Acron warum benutz du nicht Restor mit Zeilennummer. Das setzt den interen Zeiger von Read Data direkt auf auf diese Datazeilen. Dann könnte die Zeile 240 eventuell so ausehen

    Bei den Leveldaten war das nicht nötig, da alle Level einfach nur angezeigt werden. Im fertigen Spiel wird das Restore Zeilennummer sogar gebraucht, sobald der Spieler das Level wiederholen muss.

    Was ich mir auch überlegt habe, das komplette Programm mit eine neuen Variabelsystem zu versehen

    Mit den Namen der Variablen kämpfe ich auch und das Find/Replace arbeitet leider nicht zuverlässig. Blöderweise gibt es im Basic-Editor des C64Studio keine Deklarierung von Variablen-Namen / Labels usw., dann hätten wir das Problem erst gar nicht.

    Ach wäre sowas schön und übersichtlich, ein Traum so in Basic zu programmieren.

    !DEFVAR SPACE=L

    !DEFVAR STEIN=S

    !DEFVAR DIAMANT=D

    !DEFKON UNTEN=40

    !DEFKON LINKS=-1

    !DEFLAB STEIN_LIEGT

    !DEFLAB DIAMANT_LIEGT

    HAUPT_SCHLEIFE

    ON GOTO STEIN_LIEGT,DIAMANT_LIEGT

    STEIN_LIEGT

    IF PEEK(SCREEN+POS+UNTEN) = SPACE THEN POKE SCREEN+POS+UNTEN,STEIN : POKE SCREEN+POS,SPACE : GOTO HAUPT_SCHLEIFE

    Es ist praktisch unmöglich, ein schnelles Programm zu schreiben, wenn man es in Basic programmiert.

  • Das sollte man mal den Mega65 vorschlagen, vielleicht bauen die sowas ein. (Ach träumen kann so schön sein ^^)

    Oder wir können Endurion fragen ob er sowas in seinen C64Studion einbauen kann.

  • Ach wäre sowas schön und übersichtlich, ein Traum so in Basic zu programmieren.

    TSB macht das so. Das hier ist das Hauptprogramm meiner WiC64-Uhr "TickTack":

    Code
    110 init
    120 colour,f3%: div: zifferblatt: x$=""
    130 repeat: stellen: get x$: digital: settime: adjust: credits
    140 until x$="x"
    150 finish
    190 end

    Arndt

    GoDot C64 Image Processing
    Please login to see this link. - Please login to see this link. - Please login to see this link.
    Please login to see this link. - Please login to see this link. - Please login to see this link.

  • Lange Variablennamen erkennen und automatisch durch kürzere ersetzen, und dabei auch noch eventuelle Duplikate vermeiden, interessante Idee :)

    GoDot: Bei dem Snippet musst du mir aber erklären, was da was macht. Das ist mir auf den ersten und zweiten Blick nicht ersichtlich. Gefühlt sehe ich da auch nur x$ als Variable, das andere sind doch Funktions-Aufrufe, oder?

    C64Studio: Please login to see this link. - Please login to see this link. --- C64Studio WIP: Please login to see this link. - Please login to see this link. --- Please login to see this link.

  • Lange Variablennamen erkennen und automatisch durch kürzere ersetzen, und dabei auch noch eventuelle Duplikate vermeiden, interessante Idee :)

    Wenn das gehen würde, wäre das echt klasse.

  • Bei dem Snippet musst du mir aber erklären, was da was macht. Das ist mir auf den ersten und zweiten Blick nicht ersichtlich.

    Das ist die QLock-Uhr mit dem Zeichensatz von Retrofan (die Tick-Tack-Uhr, von der ich gesprochen hatte, fängt aber so ähnlich an). Hier zur Veranschaulichung ein Screenshot:

    Please login to see this attachment.

    "Zifferblatt" malt dieses Zifferblatt. Danach folgt ein Repeat-Until-Loop, der auf Tastendruck (auf x$) jedes Mal Zwischenhalt macht bei: "Stellen" aktualisiert (ohne besonderen Tastendruck) einfach die Zeitanzeige laut TI$ in dem Format, das du hier siehst. "Digital" zeigt nach Taste "h" (für "Help") die Zeit unten links in der Ecke in Ziffern an (hier: "9:52") und blendet sie nach nochmal Drücken wieder aus. "Settime" schaut nach, ob du "s" gedrückt hast und wenn ja, holt QLock sich die Uhrzeit erneut vom WiC64 ab. Mit "a" für "Adjust" stellst du die Uhr von Hand (TI$-Format). "Credits" erhältst du mit der Taste "c" (da stehen dann die Namen der Urheber an der Stelle, wo jetzt die Minutenkugeln zu sehen sind). Und schließlich (nach Taste "x") gibt's ein "Finish", wo der Screen ein bisschen blinkt und sowas. :smile:

    Gefühlt sehe ich da auch nur x$ als Variable, das andere sind doch Funktions-Aufrufe, oder?

    Ja, wobei TSB (in Simons'-Basic-Tradition) keine echten (geschlossenen) Funktionsprozeduren und auch keine echte Werteübergabe über Klammern wie Pascal kennt. Variablen gelten nach wie vor überall. Hier der Anfang der Variablenliste zur Illustration (mit dem Retrofan -Zeichensatz):

    Please login to see this attachment.

    Arndt :smile:

    GoDot C64 Image Processing
    Please login to see this link. - Please login to see this link. - Please login to see this link.
    Please login to see this link. - Please login to see this link. - Please login to see this link.

  • Hallo Leute

    hier mal wieder ein kleines Update unser BD-Klon in Basic.

    Jetzt kann man Level 1 bis Level 5 durchspielen.

    Ich habe auch Acron seine neue Levelaufbauroutine mit eingepflegt. Jetzt werden die Level in ca. 3 Sekunden aufgebaut statt in 5 Sekunden. :D

    Also man gut mit spielen, den einzigen Wermutstropfen den ich endecken konnte , ist die Geschwindigkeit der Butterflys. Sind nur wenige vorhanden rasen sie dahin.

    da bräuchte man eine dynamische Bremse. Und man erwischt sie dann kaum. Im Level 4 bleiben sie in ihre Kreisbewegung hängen. Warum weis ich nicht. :nixwiss:

    Sobald ich ein Stein hineinwerfe und er wird nicht getroffen, fängt er an richtig zu laufen.

    Aber teste es mal.

    Und wie immer, wenn euch was einfällt was man verbesseren kann, immer hier im Forum schreiben :Peace

    Please login to see this attachment.

    Please login to see this attachment.

  • Helfen vielleicht die neuen ROM Befehle den Bildschirminhalt an bestimmten Stellen abzufragen?

    Vielleicht mag ja jemand sowas wie DRAWARRAYTOSCREEN(ARRAY2D,CHARMAPARRAY,XPOS,YPOS) implementieren:

    POKEt den Inhalt von ARRAY2D - also typischerweise einer Karte - ab XPOS/YPOS auf den Bildschirm und nutzt dabei CHARMAPARRAY als Mapping (von "Zahl in ARRAY2D" zu Screencode und Farbe; 0 zum Übergehen der Position).

    Das sollte in ASM recht einfach zu implementieren sein und ist flexibel (man kann damit sogar recht fixe Zeichen-"Sprites" implementieren).

    TC& haut mich nicht vom Hocker: Da fängt man sich mittendrin in der Implementierung eine böse Multiplikation ein UND da der Befehl zum Zeichnen hundertfach aufgerufen werden muss, kann das gar nicht schnell sein/werden.

    Please login to see this link. - Please login to see this link.

  • Helfen vielleicht die neuen ROM Befehle den Bildschirminhalt an bestimmten Stellen abzufragen?

    Vielleicht mag ja jemand sowas wie DRAWARRAYTOSCREEN(ARRAY2D,CHARMAPARRAY,XPOS,YPOS) implementieren:

    POKEt den Inhalt von ARRAY2D - also typischerweise einer Karte - ab XPOS/YPOS auf den Bildschirm und nutzt dabei CHARMAPARRAY als Mapping (von "Zahl in ARRAY2D" zu Screencode und Farbe; 0 zum Übergehen der Position).

    Das sollte in ASM recht einfach zu implementieren sein und ist flexibel (man kann damit sogar recht fixe Zeichen-"Sprites" implementieren).

    TC& haut mich nicht vom Hocker: Da fängt man sich mittendrin in der Implementierung eine böse Multiplikation ein UND da der Befehl zum Zeichnen hundertfach aufgerufen werden muss, kann das gar nicht schnell sein/werden.

    Kann sein, dass ich dich hier jetzt nicht korrekt verstanden habe, aber ich denke, Please login to see this link. mit BASIC 65 geht zumindest in diese Richtung.

  • Habe Level 4 mit dem Schmetterling etwas durchgetestet. Damit ist mir Folgendes aufgefallen oder passiert. Beim ersten Start des Levels drehen die Schmetterlinge falsch herum. Nachdem man ein Leben verloren hat, variiert die Drehrichtung, mal drehen alle richtig, mal nur einige. Das Erschlagen eines Schmetterlings mit einem Stein ist sehr ungenau, obwohl der Stein am Fallen ist, dreht der Schmetterling einfach um. Wenn das Erschlagen gelingen, kann man die Diamanten nur von oben an sicher einsammeln, ansonsten kann es passieren das man dabei erschlagen wird. Ab und zu passiert sogar etwas ganz komisches, nachdem erschlagen eines Schmetterlings sind in der letzten Box ganz rechts plötzlich zwei Schmetterlinge vorhanden. Die Kollision durch die Schmetterlinge ist praktisch nicht vorhanden, solange der Spieler nicht im Weg steht. Damit die Kollision besser funktioniert, musst du vorher alle vier Richtungen überprüfen, ob sich dort der Spieler oder die Amöbe befindet.

    Es ist praktisch unmöglich, ein schnelles Programm zu schreiben, wenn man es in Basic programmiert.

  • Ab und zu passiert sogar etwas ganz komisches, nachdem erschlagen eines Schmetterlings sind in der letzten Box ganz rechts plötzlich zwei Schmetterlinge vorhanden.

    Ja sowas hat mir TheRealWanderer auch geraten, wenn man Gegenstände zerstört, sie aus den Array zu löschen. Tja ich wusste nicht wie. Da ich nicht genau weis welche Array es genau trift.

    Ich bekomme zwar die Bildschirmadresse herraus, aber nicht um welchen Array es sich handelt.

    Ich habe da echt lange gerätselt. Ich bin dazu dann über gegangen nach einer Explosion einfach das Spielfeld nochmal abzuscannen. Ist aber ja nur eine Notlösung, da ja das Array ja dann immer noch vorhanden ist.

    Oder gibt es einen Basic 65 Befehl den ich überlesen habe, der einen Array komplett leer, das wäre sehr hilfreich.

    Klar könnte ich auch im Code mit einer For - Next schleife löse, aber das würde den Spielfluß nur stören. Gut das mag jetzt bei einer Explosion nicht ins Gewicht fallen, aber lasse es mal viele sein.

    Aber dafür wird es sicherlich auch eine Lösung geben. ^^

    Jetzt bin ich gerade dabei, eine konstande Zeit anzeige zu machen.

    Gibt es einen Basic-Befehl was ich den Rasterstrahl abfragen kann. Dann kann ich den als Taktgeber verwenden.

    Ansonsten nehme ich eine Variabel, die ich innerhalb des Main-Loops hochzähle lasse. Und ab eine bestimmten Ergenins, dann die Cave-Time um eins vermindern.

    Hat aber der Nachteil, das das niemals konstant ist. Denn jenachdem was im Spielfeld los ist, ist der Main-Loop schneller oder langsamer. (Aber gerechter zum Spieler ^^)

  • Ahhh ich weiß was du meinst und das ist ein echtes Problem. Ein Gegner wird von einem Stein erschlagen, im Bildschirmspeicher ist das Position X vom Stein und X+40 für den Gegner. Die Position vom Stein im Array ist bekannt, da dieser die Explosion ausgelöst hat, da könnte man einfach eine Position wählen, die außerhalb des Spielfelds liegt. Beim Gegner ist Position logischerweise unbekannt, dafür müsste man das Array durchsuchen welches Objekt POS X+40 belegt und diesen ebenfalls außerhalb des Spielfelds legen. Aber wenn die Explosion weitere Gegner erwischt, müssten diese ebenfalls gesucht und entfernt werden. Bei vielen Gegnern wie im Level M könnte das extrem langsam sein. Und es könnten eventuell noch weitere Nebenwirkungen beim Diamanten-Array auftreten, wenn die Schmetterlinge sich in Diamanten verwandeln und den Platz von vorhandenen Diamanten einnehmen. Dann sind im Array zwei oder mehr Einträge vorhanden, für ein und demselben Diamanten und beim Herunterfallen erscheinen diese dann.

    Mir fällt leider keine bessere Lösung ein, als alle Array zu durchsuchen und die doppelten Einträge zu entfernen.

    Es ist praktisch unmöglich, ein schnelles Programm zu schreiben, wenn man es in Basic programmiert.

  • Ahhh ich weiß was du meinst und das ist ein echtes Problem. Ein Gegner wird von einem Stein erschlagen, im Bildschirmspeicher ist das Position X vom Stein und X+40 für den Gegner. Die Position vom Stein im Array ist bekannt, da dieser die Explosion ausgelöst hat, da könnte man einfach eine Position wählen, die außerhalb des Spielfelds liegt. Beim Gegner ist Position logischerweise unbekannt, dafür müsste man das Array durchsuchen welches Objekt POS X+40 belegt und diesen ebenfalls außerhalb des Spielfelds legen. Aber wenn die Explosion weitere Gegner erwischt, müssten diese ebenfalls gesucht und entfernt werden. Bei vielen Gegnern wie im Level M könnte das extrem langsam sein. Und es könnten eventuell noch weitere Nebenwirkungen beim Diamanten-Array auftreten, wenn die Schmetterlinge sich in Diamanten verwandeln und den Platz von vorhandenen Diamanten einnehmen. Dann sind im Array zwei oder mehr Einträge vorhanden, für ein und demselben Diamanten und beim Herunterfallen erscheinen diese dann.

    Mir fällt leider keine bessere Lösung ein, als alle Array zu durchsuchen und die doppelten Einträge zu entfernen.

    TheRealWanderer meint

    "Wegen den Array löschen, würde ich es gar nicht so kompliziert machen. Im Prinzip muss, wenn ein Butterfly mit einem Stein kaputt gemacht wurde, lediglich der letzte Butterfly aus dem Array an dessen Stelle kopiert werden und der Arrayzähler (ZB?) um eins vermindert werden. Wenn kein Butterfly mehr vorhanden ist, muss aus dem Mainloop der Sprung in die Bewegungsroutine unterbunden werden. (Das gleich natürlich auch für den Firefly.)"
    Was ich mal versuchen werde ist folgendes.

    Ich lösche alle Arrays und lasse das komplette Feld nochmal einlesen. Mal schauen wieviel Zeit das in Anspruch nimmt.