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:

Ich schaff das irgendwie mit VICE nicht. Anscheinend muss man das nochmal ändern mit petcat oder so, .. aber das geht bei mir nicht.

Kannst du mal schauen, ob das ein gültiger Code ist?

10 REM *** SNAKE SPIEL - COMMODORE 64 ***
20 PRINT "SNAKE GAME" : GOTO 300

300 SCREEN 1 : DEFDBL A-Z
400 GOSUB 800 : P = 0

500 REM --- SCHNAPPAZTE ---
600 ON S GOTO 700,800,900,1000

700 IF S=1 THEN GOTO 720 ELSE RETURN
800 IF S=2 THEN GOTO 830 ELSE RETURN
900 IF S=3 THEN GOTO 930 ELSE RETURN
1000 IF S=4 THEN GOTO 1030 ELSE RETURN

720 D=-5 : RETURN
830 D=5 : RETURN
930 D=-1 : RETURN
1030 D=1 : RETURN

110 REM --- KONTROLLE ---
120 IF D=P THEN RETURN : P=D

130 REM --- SCHNAPPAZTE ZUORDNEN ---
140 IF D=5 THEN S=1
150 IF D=-5 THEN S=2
160 IF D=-1 THEN S=3
170 IF D=1 THEN S=4

180 REM --- SCHLAUCHBEWEGUNG ---
190 A = P(1) : B = 0
200 FOR I = 1 TO 25 : P(I) = P(I+1) : NEXT I
210 P(1) = S : B = 1

220 REM --- SCHNAPPE ---
230 IF D=B THEN GOSUB 600 : RETURN

240 REM --- KOLLISIONEN ---
250 A = INT((X / 20)) : B = INT((Y / 20))

260 IF X < 0 OR X > 430 OR Y < 0 OR Y > 390 THEN GOSUB 1000
270 FOR I = 1 TO 25
280 IF A = P(I) THEN GOTO 260 : RETURN
290 NEXT I

300 REM --- NEUE SCHNAPPE ---
310 Y = RND(400) - 200 : X = RND(400) - 200

320 RETURN

1000 PRINT "GAME OVER" : RETURN

600 GOTO 400

800 REM --- STARTEN ---
900 P(1) = 1 : P(2) = 2 : D = 5 : X = 100 : Y = 100 : S = 1 : B = 0
1000 A = 0 : Z = 0

1100 FOR K = 1 TO 10 : S = INT(RND(4)) + 1 : NEXT K

1200 REM --- ZEICHNEN ---
1300 CLS : SCREEN 1

1400 ON S GOSUB 300, 400, 500, 600
1500 ON D GOSUB 700, 800, 900, 1000

1600 WAIT 100 : RETURN

300 REM --- SNAKE TEILE ZUORDNEN ---
400 FOR I = 1 TO 25
500 P(I) = P(I+1) : NEXT I
600 P(1) = S
700 RETURN

800 REM --- KONTROLLE DER SCHNAPPE ---
900 GOTO 1000

1000 REM --- SPIELBEENDEGUNG ---
1100 CLS : PRINT "SPIEL VORUB" : RETURN

Ich habe die Überlegung, zB Dokumente mit einzubinden. Vielleicht würde das helfen. Momentan habe ich etwas gefunden mit 237 Seiten (C64). Das habe ich gekürzt, aber das ladet schon viele Stunden. Ich verwende gerade qwen 3.5 9B und



0
0
0.000
2 comments
avatar

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
avatar

ja, ChatGPT hats mir dann auch gesagt^

0
0
0.000