Okay, wir sind immer noch in den 80ern aber jetzt auf dem PC – das CBM BASIC-Programm nach GW-BASIC portiert das bis MS-DOS 4 als Programmiersprache dabei war. Die speziellen Kommentare für den Basic-Boss-Compiler sind weg, dafür sind alle Integer-Variablen jetzt entsprechend mit dem % benannt um sie zu Integer-Variablen zu machen. GW-BASIC kennt Befehle für Grafik und um einzelne Zeichen abzufragen, deshalb muss nicht mehr mit PEEK/POKE/WAIT direkt auf Speicher und Hardware zugegriffen werden. IF/THEN kennt nun auch ein ELSE. Und der SWAP-Befehl macht die entsprechende Subroutine überflüssig.
Code: Alles auswählen
100 RANDOMIZE -TIMER:SL%=640:SC%=350:DP=.3:MV%=5:A%=1:CD=.35
105 DIM CP%(SL%),CV%(SL%)
110 PRINT"Create and place cars...":GOSUB 5000:SCREEN 9
200 FOR Y%=0 TO SC%-1:GOSUB 500:GOSUB 1000:NEXT
210 WHILE INKEY$="":WEND:GOTO 200
500 ' ******************************
510 ' One simulation step.
520 '
530 ' 1. Update velocities.
540 FOR I%=0 TO CC%:IF I%=CC% THEN J%=0 ELSE J%=I%+1
550 V%=CV%(I%)+A%:D%=CP%(J%)-CP%(I%)-1:IF D%<0 THEN D%=D%+SL%
560 IF V%>D% THEN V%=D%
570 IF V%>MV% THEN V%=MV%
580 IF V%>=1 THEN V%=V%+(RND(1)<DP)
590 CV%(I%)=V%:NEXT
700 ' 2. Update positions.
710 FOR I%=0 TO CC%:CP%(I%)=(CP%(I%)+CV%(I%)) MOD SL%:NEXT:RETURN
1000 ' ******************************
1010 ' Plot row.
1020 '
1030 LINE (0,Y%)-(SL%,Y%):FOR I%=0 TO CC%:PRESET (CP%(I%),Y%):NEXT:RETURN
5000 ' ******************************
5010 ' Create cars.
5020 '
5030 CC%=INT(SL%*CD)-1:FOR I%=0 TO SL%-1:CP%(I%)=I%:NEXT
5040 FOR I%=0 TO SL%-1:J%=INT(RND(1)*(SL%-I%))+I%:SWAP CP%(I%),CP%(J%):NEXT
5050 F%=0:FOR I%=0 TO CC%-1:J%=I%+1
5055 IF CP%(I%)>CP%(J%) THEN F%=-1:SWAP CP%(I%),CP%(J%)
5060 NEXT:IF F% THEN 5050
5070 RETURN
Eigentlich hätte man hier auch schon was mit den Variablennamen machen können, weil GW-BASIC mehr als zwei Zeichen erlaubt. Aber da GW-BASIC Programme oft von anderen Systemen portiert waren (wie in diesem Fall) oder dorthin portiert werden sollten, war es nicht unüblich die zwei Zeichen Grenze nicht zu überschreiten. Zudem sind nur Grossbuchstaben möglich was sich Variablennamen die aus mehr als einem Wort zusammengesetzt sind, unschön liest. Und es wird schwieriger Anweisungen und Funktionen von Variablen zu unterscheiden. Man hat bei GW-BASIC ja kein Syntaxhighlighting wie hier im Forum.
Edit: Doch mal mit längeren Namen:
Code: Alles auswählen
100 RANDOMIZE -TIMER:STREET.LEN%=640:STEPCOUNT%=350:CAR.DENSITY=.35:MAX.V%=5
105 ACCEL%=1:DECEL.PROB=.3:DIM CAR.POS%(STREET.LEN%-1),CAR.V%(STREET.LEN%-1)
110 PRINT"Create and place cars...":GOSUB 5000:SCREEN 9
200 FOR Y%=0 TO STEPCOUNT%-1:GOSUB 500:GOSUB 1000:NEXT
210 WHILE INKEY$="":WEND:GOTO 200
500 ' ******************************
510 ' One simulation step.
520 '
530 ' 1. Update velocities.
540 FOR I%=0 TO CC%:IF I%=CC% THEN J%=0 ELSE J%=I%+1
550 V%=CAR.V%(I%)+ACCEL%:D%=CAR.POS%(J%)-CAR.POS%(I%)-1
555 IF D%<0 THEN D%=D%+STREET.LEN%
560 IF V%>D% THEN V%=D%
570 IF V%>MAX.V% THEN V%=MAX.V%
580 IF V%>=1 THEN V%=V%+(RND(1)<DECEL.PROB)
590 CAR.V%(I%)=V%:NEXT
700 ' 2. Update positions.
710 FOR I%=0 TO CC%
715 CAR.POS%(I%)=(CAR.POS%(I%)+CAR.V%(I%)) MOD STREET.LEN%:NEXT:RETURN
1000 ' ******************************
1010 ' Plot row.
1020 '
1030 LINE (0,Y%)-(STREET.LEN%,Y%):FOR I%=0 TO CC%
1035 PRESET (CAR.POS%(I%),Y%):NEXT:RETURN
5000 ' ******************************
5010 ' Create cars.
5020 '
5030 CC%=INT(STREET.LEN%*CAR.DENSITY)-1
5035 FOR I%=0 TO STREET.LEN%-1:CAR.POS%(I%)=I%:NEXT
5040 FOR I%=0 TO STREET.LEN%-1:J%=INT(RND(1)*(STREET.LEN%-I%))+I%
5045 SWAP CAR.POS%(I%),CAR.POS%(J%):NEXT
5050 F%=0:FOR I%=0 TO CC%-1:J%=I%+1
5055 IF CAR.POS%(I%)>CAR.POS%(J%) THEN F%=-1:SWAP CAR.POS%(I%),CAR.POS%(J%)
5060 NEXT:IF F% THEN 5050
5070 RETURN