RE: Here is what Qwen 3.5 still cannot answer, still struggles with C64 coding skills. Full transcript (Qwen3.5-35B-A3B)
You are viewing a single comment's thread:
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)?
ja, ChatGPT hats mir dann auch gesagt^