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, 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(...).
  • GOSUB / RETURN‑Logik: Viele GOSUBs springen zu Unterprogrammen, die sofort RETURN ausführen oder GOTO auf Zeilennummern, die anderswo wiederverwendet wurden — das führt zu unvorhersehbarem Verhalten.
  • Unklare/fehlerhafte Bedingungen: z. B. IF A = P(I) THEN GOTO 260 : RETURN — das RETURN nach GOTO ist sinnlos und verwirrend.
  • Variablenbenennung und Zweck: S, P, D, B, A werden mehrfach und inkonsistent verwendet; das macht das Programm schwer lesbar und fehleranfällig.
  • Bildschirmsteuerung / Eingabe: 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).

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; 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.

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

  • 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.
  • Die Zeichnungsroutine ist bewusst minimal; für echtes Spielfeld muss man PETSCII‑Positionierung (z. B. PRINT mit Cursorpositionierung oder POKE in 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 GET vs. 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)?



0
0
0.000
1 comments
avatar

ja, ChatGPT hats mir dann auch gesagt^

0
0
0.000