Das sagt Copilot dazu:
Kurzantwort
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.
Hauptprobleme im Originalcode
- Doppelte Zeilennummern (z. B. mehrere
300,600,800,1000,1100): BASIC führt nur die letzte Definition einer Zeilennummer aus — das zerstört die Programmstruktur. - Array‑Nutzung:
P(1)wird verwendet, aberPwurde nie mitDIMdeklariert; gleichzeitig wirdPauch als Skalar (P = 0) benutzt — Namekonflikt. RND‑Aufruf:RND(400)ist falsch. In C64 BASIC istRND(1)(oderRND(0)) üblich; um Zufallszahlen in einem Bereich zu erzeugen, multipliziert manRND(1)mit der gewünschten Spanne und nimmtINT(...).- GOSUB / RETURN‑Logik: Viele GOSUBs springen zu Unterprogrammen, die sofort
RETURNausführen oderGOTOauf Zeilennummern, die anderswo wiederverwendet wurden — das führt zu unvorhersehbarem Verhalten. - Unklare/fehlerhafte Bedingungen: z. B.
IF A = P(I) THEN GOTO 260 : RETURN— dasRETURNnachGOTOist sinnlos und verwirrend. - Variablenbenennung und Zweck:
S,P,D,B,Awerden mehrfach und inkonsistent verwendet; das macht das Programm schwer lesbar und fehleranfällig. - Bildschirmsteuerung / Eingabe:
SCREEN 1undDEFDBL A-Zsind nicht unbedingt falsch, aber deren Einsatz muss konsistent sein; Tastatureingabe (Richtung) fehlt oder ist nicht korrekt implementiert (GET,INKEY$o.ä. fehlt).
Wichtige Korrekturen / Regeln
- Einmalige Zeilennummern verwenden und logisch gliedern (Initialisierung, Hauptschleife, Unterroutinen).
- Arrays deklarieren: z. B.
DIM PX(25), PY(25)für Körpersegmente. - RND richtig verwenden: z. B.
X = INT(RND(1) * 21)für Werte 0..20. - Eindeutige Variablennamen: z. B.
dirX,dirY,headX,headY,len. - Eingabe nicht blockierend:
GET A$/INKEY$(je nach Interpreter) verwenden, damit das Spiel weiterläuft, auch wenn keine Taste gedrückt wird. - Kollisionsprüfung: Kopf gegen Wand und Kopf gegen Körper sauber prüfen.
- Zeichen/Anzeige:
PRINT CHR$(147)löscht Bildschirm;PRINTmitTABoderPOKEfür Grafik; für ein einfaches Text‑Snake reichtPRINTmit Koordinaten nicht — man brauchtPOKE/PRINTan Positionen oder ein PETSCII‑Raster.
Bereinigte Struktur (Beispielgerüst, kommentiert)
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
DIMdeklariert Arrays;lenist die aktuelle Länge der Schlange.RANDOMIZEundRND(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 istGET A$oderINKEY$zu verwenden.- Die Zeichnungsroutine ist bewusst minimal; für echtes Spielfeld muss man PETSCII‑Positionierung (z. B.
PRINTmit Cursorpositionierung oderPOKEin Bildschirmram) verwenden.
Nächste Schritte ich kann übernehmen
- Vollständige, lauffähige Version schreiben (inkl. PETSCII‑Zeichnung, nicht‑blockierender Eingabe und Kollisionen).
- Erläuterung zu
GETvs.INKEY$und wie man auf dem echten C64 Tasten abfragt. - Optimierung: bessere Verzögerung (Timer), Anzeige, Highscore, Level.
Möchtest du, dass ich aus dem Gerüst eine komplett lauffähige C64 BASIC V2‑Version erstelle (mit PETSCII‑Anzeige und funktionierender Tastatursteuerung)?
RE: Here is what Qwen 3.5 still cannot answer, still struggles with C64 coding skills. Full transcript (Qwen3.5-35B-A3B)