Hallo,
wer kennt nicht das Spiel NIGHT DRIVER für den C64 ?
Ich dachte mir, so schwer kann das nicht in BASIC zu programmieren sein, also habe ich damit angefangen (noch ohne Kurven):
10 DEFINT A-J
20 OPTION BASE 1
30 DIM CY(10),DY(10)
40 S$=CHR$(179):T$=CHR$(219)
50 B=1:REM INDEX FOR HIGHLIGHTED MARK
60 MAX=.4:V=MAX:REM INITIAL DELAY
70 CLS:LOCATE 23,14
80 PRINT "PRESS 'A' TO ACCELERATE, 'Y' TO SLOW DOWN OR 'Q' TO QUIT";
90 FOR I=1 TO 10:READ CX(I),CY(I):NEXT I:REM READ COORDS FOR PHASE 1
100 FOR I=1 TO 10:READ DX(I),DY(I):NEXT I:REM READ COORDS FOR PHASE 2
120 REM MAIN PROGRAM
130 FOR I=1 TO 10
140 REM DRAW 1ST PHASE
150 LOCATE CY(I),CX(I):IF B=I THEN PRINT T$; ELSE PRINT S$;
160 LOCATE CY(I),79-CX(I):IF B=I THEN PRINT T$; ELSE PRINT S$;
170 REM DELETE 2ND PHASE (EVEN IF NOT YET DRAWN)
180 LOCATE DY(I),DX(I):PRINT " ";
190 LOCATE DY(I),79-DX(I):PRINT " ";
200 NEXT I
210 GOSUB 410:REM KEY PRESSED?
220 FOR I=1 TO 10
230 REM DRAW 2ND PHASE STREET
240 LOCATE DY(I),DX(I):IF B=I THEN PRINT T$; ELSE PRINT S$;
250 LOCATE DY(I),79-DX(I):IF B=I THEN PRINT T$; ELSE PRINT S$;
260 REM DELETE 1ST PHASE DRAWINGS
270 LOCATE CY(I),CX(I):PRINT " ";
280 LOCATE CY(I),79-CX(I):PRINT " ";
290 NEXT I
300 GOSUB 410:REM KEY PRESSED?
400 GOTO 130
410 LOCATE 1,1:PRINT "SPEED";41-INT(V*100);" ";
420 B=B+1:IF B>10 THEN B=1
430 K$=INKEY$
440 IF K$="q" OR K$="Q" THEN 500
450 IF K$="a" OR K$="A" THEN V=V-.01:IF V<.02 THEN V=.02
460 IF K$="y" OR K$="Y" THEN V=V+.01:IF V>MAX THEN V=MAX
470 Z=TIMER+V:WHILE Z>TIMER:WEND:REM NOW WAIT V SEC
480 SOUND INT(MAX*200-V*200)+37,1
490 RETURN
500 LOCATE 24,1:END
510 DATA 30,2, 29,4, 28,6, 27,8, 25,10, 23,12, 20,14, 16,16, 11,18, 5,20
520 DATA 29,3, 28,5, 27,7, 26,9, 24,11, 22,13, 19,15, 15,17, 10,19, 4,21
Dann habe ich mir aber gesagt, wenn ich die Kurven (mindestens 2 Varianten) auch implementiere, wächst die Anzahl der DATA Werte (pro "Bild" immerhin 40 Werte).
Was noch schlimmer ist, das muss man dann alles ausprobieren, ein Blatt mit Rechenkästchen/Karomuster wäre dann angebracht.
Ausserdem kann man dann nicht die Kurven stufenweise stärker machen, sondern man muss sich wie bereits erwähnt bei den DATA Werten festlegen.
Aber es geht auch viel eleganter:
10 DEFINT A-J
40 S$=CHR$(179):T$=CHR$(219)
50 B=1:REM INDEX FOR HIGHLIGHTED MARK
60 MAX=.4:V=MAX:REM INITIAL DELAY
70 CLS:LOCATE 23,14
80 PRINT "PRESS 'A' TO ACCELERATE, 'Y' TO SLOW DOWN OR 'Q' TO QUIT";
120 REM MAIN PROGRAM
130 FOR I=1 TO 10
140 REM DRAW 1ST PHASE
145 M=INT(.25*(I*I))
150 LOCATE I*2,44+M:IF B=I THEN PRINT T$; ELSE PRINT S$;
160 LOCATE I*2,35-M:IF B=I THEN PRINT T$; ELSE PRINT S$;
170 REM DELETE 2ND PHASE (EVEN IF NOT YET DRAWN)
180 LOCATE I*2+1,45+M:PRINT " ";
190 LOCATE I*2+1,34-M:PRINT " ";
200 NEXT I
210 GOSUB 410:REM KEY PRESSED?
220 FOR I=1 TO 10
230 REM DRAW 2ND PHASE STREET
235 M=INT(.25*(I*I))
240 LOCATE I*2+1,45+M:IF B=I THEN PRINT T$; ELSE PRINT S$;
250 LOCATE I*2+1,34-M:IF B=I THEN PRINT T$; ELSE PRINT S$;
260 REM DELETE 1ST PHASE DRAWINGS
270 LOCATE I*2,44+M:PRINT " ";
280 LOCATE I*2,35-M:PRINT " ";
290 NEXT I
300 GOSUB 410:REM KEY PRESSED?
400 GOTO 130
410 LOCATE 1,1:PRINT "SPEED";41-INT(V*100);" ";
420 B=B+1:IF B>10 THEN B=1
430 K$=INKEY$
440 IF K$="q" OR K$="Q" THEN 500
450 IF K$="a" OR K$="A" THEN V=V-.01:IF V<.02 THEN V=.02
460 IF K$="y" OR K$="Y" THEN V=V+.01:IF V>MAX THEN V=MAX
470 Z=TIMER+V:WHILE Z>TIMER:WEND:REM NOW WAIT V SEC
480 SOUND INT(MAX*200-V*200)+37,1
490 RETURN
500 LOCATE 24,1:END
Die Zeilennummern habe ich mal ähnlich gelassen, damit man die zwei Ansätze vergleichen kann.
Als Nächstes versuche ich die Kurven zu implementieren, bitte Geduld.