You are viewing a single comment's thread:
Das sagt Copilot dazu:
Der gezeigte Code ist nicht korrekt für Commodore 64 BASIC V2. Er enthält mehrere Syntax‑ und Logikfehler (doppelte Zeilennummern, falsche Verwendung von RND, Arrays nicht dimensioniert, widersprüchliche GOSUB/RETURN‑Flüsse u. a.). Unten erkläre ich die wichtigsten Probleme und liefere eine bereinigte, lauffähigere Struktur als Ausgangspunkt.
300, 600, 800, 1000, 1100): BASIC führt nur die letzte Definition einer Zeilennummer aus — das zerstört die Programmstruktur.P(1) wird verwendet, aber P wurde nie mit DIM deklariert; gleichzeitig wird P auch als Skalar (P = 0) benutzt — Namekonflikt.RND‑Aufruf: RND(400) ist falsch. In C64 BASIC ist RND(1) (oder RND(0)) üblich; um Zufallszahlen in einem Bereich zu erzeugen, multipliziert man RND(1) mit der gewünschten Spanne und nimmt INT(...).RETURN ausführen oder GOTO auf Zeilennummern, die anderswo wiederverwendet wurden — das führt zu unvorhersehbarem Verhalten.IF A = P(I) THEN GOTO 260 : RETURN — das RETURN nach GOTO ist sinnlos und verwirrend.S, P, D, B, A werden mehrfach und inkonsistent verwendet; das macht das Programm schwer lesbar und fehleranfällig.SCREEN 1 und DEFDBL A-Z sind nicht unbedingt falsch, aber deren Einsatz muss konsistent sein; Tastatureingabe (Richtung) fehlt oder ist nicht korrekt implementiert (GET, INKEY$ o.ä. fehlt).DIM PX(25), PY(25) für Körpersegmente.X = INT(RND(1) * 21) für Werte 0..20.dirX, dirY, headX, headY, len.GET A$ / INKEY$ (je nach Interpreter) verwenden, damit das Spiel weiterläuft, auch wenn keine Taste gedrückt wird.PRINT CHR$(147) löscht Bildschirm; PRINT mit TAB oder POKE für Grafik; für ein einfaches Text‑Snake reicht PRINT mit Koordinaten nicht — man braucht POKE/PRINT an Positionen oder ein PETSCII‑Raster.Das folgende Programm ist ein vereinfachtes, strukturiertes Gerüst in BASIC‑Stil. Es ist als Ausgangspunkt gedacht — je nach gewünschter Darstellung (Text/PETSCII/Bitmap) und Eingabemethode (GET/INKEY$) sind Anpassungen nötig.
10 REM SNAKE - GRUNDGERUEST
20 DIM PX(25), PY(25)
30 len = 3
40 headX = 10 : headY = 10
50 dirX = 1 : dirY = 0
60 REM initiale Koerperposition
70 FOR i = 1 TO len
80 PX(i) = headX - (i-1)*dirX
90 PY(i) = headY - (i-1)*dirY
100 NEXT i
110 REM zufallsstart fuer "apple"
120 RANDOMIZE
130 appleX = INT(RND(1)*20) : appleY = INT(RND(1)*15)
140 CLS
150 GOSUB 400 : REM zeichne initial
160 GOSUB 300 : REM hauptschleife
170 END
300 REM HAUPTSCHLEIFE
310 GET A$ : IF A$ <> "" THEN GOSUB 500
320 headX = headX + dirX : headY = headY + dirY
330 REM verschiebe Koerper
340 FOR i = len TO 2 STEP -1
350 PX(i) = PX(i-1) : PY(i) = PY(i-1)
360 NEXT i
370 PX(1) = headX : PY(1) = headY
380 REM pruefe Kollision mit Wand
390 IF headX < 0 OR headX > 39 OR headY < 0 OR headY > 24 THEN GOSUB 700 : RETURN
400 REM pruefe Kollision mit Koerper
410 FOR i = 2 TO len
420 IF headX = PX(i) AND headY = PY(i) THEN GOSUB 700 : RETURN
430 NEXT i
440 REM pruefe apple
450 IF headX = appleX AND headY = appleY THEN len = len + 1 : appleX = INT(RND(1)*20) : appleY = INT(RND(1)*15)
460 GOSUB 600 : REM zeichne
470 FOR t = 1 TO 200 : NEXT t : REM einfache Verzögerung
480 GOTO 310
500 REM TASTENVERARBEITUNG (A$ enthält Taste)
510 IF A$ = "W" OR A$ = "w" THEN dirX = 0 : dirY = -1 : RETURN
520 IF A$ = "S" OR A$ = "s" THEN dirX = 0 : dirY = 1 : RETURN
530 IF A$ = "A" OR A$ = "a" THEN dirX = -1 : dirY = 0 : RETURN
540 IF A$ = "D" OR A$ = "d" THEN dirX = 1 : dirY = 0 : RETURN
550 RETURN
600 REM ZEICHNEN (sehr einfach, nur Textausgabe als Platzhalter)
610 PRINT CHR$(147) : REM Bildschirm loeschen
620 PRINT "SNAKE LEN:"; len
630 PRINT "APPLE:"; appleX; appleY
640 REM Koerper ausgeben (hier nur als Liste)
650 FOR i = 1 TO len
660 PRINT i; PX(i); PY(i)
670 NEXT i
680 RETURN
700 REM GAME OVER
710 PRINT "GAME OVER" : END
Hinweise zum Beispielgerüst
DIM deklariert Arrays; len ist die aktuelle Länge der Schlange.RANDOMIZE und RND(1) erzeugen Zufallszahlen; INT(RND(1)*N) liefert 0..N-1.GET A$ ist ein Platzhalter für nicht‑blockierende Tastenerfassung; auf manchen C64‑Emulatoren/Interpretern ist GET A$ oder INKEY$ zu verwenden.PRINT mit Cursorpositionierung oder POKE in Bildschirmram) verwenden.GET vs. INKEY$ und wie man auf dem echten C64 Tasten abfragt.Möchtest du, dass ich aus dem Gerüst eine komplett lauffähige C64 BASIC V2‑Version erstelle (mit PETSCII‑Anzeige und funktionierender Tastatursteuerung)?
ja, ChatGPT hats mir dann auch gesagt^