Materialien zu Band 1

Unten finden sich weitere kurze BASIC-Programme mit Vorschlägen zum Experimentieren und Verändern. Sie dürfen die Programme und ihre modifizierten Fassungen gern weiter publizieren. Bitte geben Sie dabei aber immer den Namen des Autors der Ursprungsversion und die Creative-Commons-Lizenz mit an. Alle hier angegebenen Programme stehen unter der Lizenz CC BY NC-SA 4.0.

»Rasen mit 310 km/h«

Autor: Peter Dassow, Quelle: Classic-Computing, für IBM-PC mit BASICA 3.30 oder GW-BASIC

5 REM ORIGINAL-VERSION VON PETER DASSOW (CC BY-NC-SA 4.0)
10 DEFINT A-Z:RANDOMIZE TIMER:D!=TIMER:S=RND*40!+20:C=S+4:O=C:CLS
20 LOCATE 11,1:FOR I=1 TO 12:PRINT SPC(S);"|";SPC(10);"|":NEXT I:Z=0:V!=.3
30 R=RND*7:IF R<3 THEN M=-1 ELSE IF R=3 THEN M=0 ELSE M=1
40 LOCATE 2,1:PRINT "KM:";Z;" VMAX:";310-CINT(V!*1000!):S=S+M
50 LOCATE 23,1:IF S>58 THEN S=58 ELSE IF S<1 THEN S=1
60 PRINT SPC(S%);"| |";" ":PRINT:Z=Z+10:T=SCREEN(10,C):LOCATE 10,C
70 PRINT "*";:LOCATE 9,O:PRINT " ";:IF T=32 THEN O=C:IF TIMER<D!+1 THEN 110 ELSE 90
80 LOCATE 3,1:PRINT "CRASH!":SOUND 37,5:LOCATE 23,1:END
90 IF V!>.1 THEN V!=V!-.01 ELSE IF V!>.05 THEN V!=V!-.005 ELSE V!=V!-.001
100 D!=TIMER:SOUND Z/10+100,2:IF V!<0 THEN V!=0
110 K$=INKEY$:T!=TIMER+V!:WHILE TIMER<T!:WEND
120 IF K$="" THEN 30
130 IF K$="n" THEN C=C-1:GOTO 30
140 IF K$="m" THEN C=C+1:GOTO 30
150 IF K$="q" THEN LOCATE 23,1:END

Modifizieren Sie dieses Programm so, dass es auch auf anderen Homecomputern funktioniert. Dabei sind besonders zeitsparende Algorithmen wichtig, denn sie bestimmen, wie schnell ihr Auto im Spiel fährt. Hier finden Sie die Befehlsreferenzen von BASICA bzw. GW-BASIC.


»Avoider«

Autor: Andy C. Spencer, Quelle: retrocomputermuseum.co.uk, für Sinclair ZX Spectrum (ab 16K)

10 BORDER 0: PAPER 0: INK 7: CLS: LET sc=0: LET n=22703
20 POKE 23692,255: PRINT AT 21,INT (RND*32); INK 6;".": PRINT: POKE n,45: LET sc=sc+1: IF INKEY$="z" THEN LET n=n-1
30 IF INKEY$="x" THEN LET n=n+1
40 IF PEEK (n+32)<>7 THEN PRINT AT 2,2;"CRASHED - YOU SCORED ";sc: PRINT AT 4,2;"PRESS ENTER TO PLAY AGAIN": INPUT i$: LET sc=0
50 GO TO 20

Das Programm stellt ein kleines Geschicklichkeitsspiel dar. Sie steuern die Spielfigur mit den Tasten z und x. Das Programm ist so geschrieben, dass es beim Auflisten auf eine Bildschirmseite passt – das führt zu vielen Programmzeilen mit durch Doppelpunkte getrennten Befehlen … und damit zu Spaghetti-Code. Modifizieren Sie das Programm nach der Philosophie des „Strukturierten Programmierens“, indem Sie jedem Befehl eine eigene Zeile geben, erklärende REM-Kommentare einfügen und die Kontrollstrukturen sichtbar machen.


»Uhr«

Autor: Volker Pohlers für Z9001/KC-87 und MSX

1 !UHR V.POHLERS 03.06.2009 FUER GRAF14
5 CLS:SCREEN1:GCLS:ZERO(40,24):CIRCLE(0,0),22
100 !ZEIT HOLEN
110 H=PEEK(29)+PEEK(30)/60:M=PEEK(30):S=PEEK(31)
200 !SEKUNDE
210 IFS0=STHENGOTO260
220 A=S0*PI/30:X=SIN(A)*16:Y=COS(A)*16:LINE(0,0)-(X,Y),0:S0=S
260 A=S*PI/30:X=SIN(A)*16:Y=COS(A)*16:LINE(0,0)-(X,Y)
300 !MINUTE
310 IFM0=MTHENGOTO360
320 A=M0*PI/30:X=SIN(A)*16:Y=COS(A)*16:LINE(0,0)-(X,Y),0:M0=M
360 A=M*PI/30:X=SIN(A)*16:Y=COS(A)*16:LINE(0,0)-(X,Y)
400 !STUNDE
410 IFH0=HTHENGOTO460
420 A=H0*PI/6:X=SIN(A)*12:Y=COS(A)*12:LINE(0,0)-(X,Y),0:H0=H
460 A=H*PI/6:X=SIN(A)*12:Y=COS(A)*12:LINE(0,0)-(X,Y)
900 T$=INKEY$:IFT$<>""GOTO1000
910 GOTO100
1000 SCREEN0

Das Programm stellt eine analoge Uhr auf dem Bildschirm dar. Zeile 110 holt die Uhrzeit aus Systemzellen des Z9001. Zeile 5 ist die Initialisierung der Grafik. Prinzipiell sollte das Programm auf MSX-Rechnern laufen.


»Code-Wort«

Autor: Björn Benner für Commodore 64

1 PRINT"{Clear/Home}":POKE 53280,0:POKE 53281,0:PRINT"(White)"
2 PRINT SPC(10)"{RVS ON}-=LAUFENDER CODE=-"
3 PRINT:PRINT:PRINT"UEBER DEN BILDSCHIRM LAEUFT EIN"
4 PRINT"VERSCHLUESSELTES WORT, WELCHES"
5 PRINT"RICHTIG EINGEGEBEN WERDEN MUSS!"
6 PRINT:PRINT"LEICHTE STUFE = L / SCHWERE STUFE = S":INPUT"WELCHE STUFE";A$
7 IF A$ = "L" THEN GOTO 9
8 IF A$ = "S" THEN GOTO 14
9 PRINT"{Clear/Home}":FOR L=1 TO 500:PRINT" C64{CRSR Links}{CRSR Links}{CRSR Links}";:FOR I=1TO80:NEXT I:NEXT L
10 PRINT"ìENTSCHLUESSELE DEN CODE!":INPUT"KLARTEXT";L$
11 IF L$ <> "C64" THEN 19
12 IF L$ = "C64" THEN 13
13 PRINT:PRINT"RICHTIG!":CLR:FOR X = 1 TO 900:NEXT X:GOTO 1
14 PRINT"{Clear/Home}":FOR L=1TO500:PRINT" CLASSIC COMPUTING{CRSR Links x 17}";:FORI=1TO80
15 NEXT I:NEXT L
16 PRINT"ìENTSCHLUESSELE DEN CODE!":INPUT"KLARTEXT";S$
17 IF S$ <>"CLASSIC COMPUTING" THEN 19
18 IF S$ = "CLASSIC COMPUTING" THEN 13
19 PRINT"FALSCHER CODE!":FOR X = 1 TO 900:NEXT X:CLR:GOTO 1

Die in geschweiften Klammern angegebenen Anweisungen in den Zeilen 1, 2, 9 und 14 sind Steuercodes. Die Anführungszeichen müssen gesetzt werden. Für die genaue Anwendung / Funktion bitte im Commodore C64 Handbuch nachsehen.
Der String / Text C64 in Zeile 9 und der String / Text CLASSIC COMPUTING in Zeile 14 müssen mit gedrückter SHIFT-Taste eingegeben werden, damit der Text als Sonderzeichen dargestellt wird. Leerstellen bei den Strings bitte beachten.


»Farb-Sprite-Demo«

Autor: Simon Stelling-de San Antonio für Commodore 64

10 DIMA$(64):FORI=0TO30:X$=X$+CHR$(29):NEXT:V=53248:POKE32+V,0:POKE28+V,255
20 FORI=0TO7:POKEI+I+V,308-I*39AND255:POKEI+I+1+V,90:POKE2040+I,13:READK(I)
30 POKE39+I+V,8+I:NEXT:POKE16+V,3:POKE21+V,255:POKE33+V,0:POKE37+V,RND(-78)
40 POKE38+V,1:W$="PLEASE WAIT...  ":PRINTCHR$(142)CHR$(8)CHR$(5)CHR$(147)W$
50 FORI=832TO894:READY:POKEI,255ANDY+164:NEXT:D=54272:G=12:Q=64:Z=3.1415/64
60 FORI=0TO63:P=RND(1)*947+1071:POKEP,90:POKED+P,K(7ANDI):POKED+19+P,G:G=27-G
70 POKE19+P,46:NEXT:R=18+V:H=7:G=10:J=9:FORI=0TO63:PRINTCHR$(19)W$I+1" /  64"
80 ON1ANDIGOTO100:P=RND(1)*911+1071:POKED+1+P,H:POKED+40+P,G:POKEP,233:H=20-H
90 POKE1+P,223:POKE40+P,95:POKE41+P,105:POKED+P,1:POKED+41+P,J:G=13-G:J=15-J
100 S$=CHR$(19):FORX=0TO7:Y=229-SIN((I+X*4AND63)*Z)*179:C=127ANDY
110 S$=S$+CHR$(29)+CHR$(18-128*(Y<128))+CHR$(C-Q*(C<32)-32*(C>63)-32*(C>95))
120 NEXT:A$(I)=S$+LEFT$(X$,23+(IAND7))+CHR$(48+K(I/8+IAND7)):NEXT:POKE788,52
130 PRINTCHR$(19)CHR$(144)W$W$:POKE648,208:B$=CHR$(9)+CHR$(154)+CHR$(147)
140 FORI=0TO63:WAITR,Q:PRINTA$(I);:NEXT:IFPEEK(198)=0THEN140
150 POKE648,4:POKE21+V,0:PRINTB$;:POKE32+V,14:POKE33+V,6:POKE788,49:POKE198,0
160 DATA10,8,2,4,3,5,14,15,95,91,220,106,6,12,106,6,-4,150,6,8,150,6,4,70,6,6
170 DATA70,6,5,70,6,6,70,6,5,70,6,6,70,6,5,70,6,6,70,6,5,70,6,5,6,6,5,6,6,5
180 DATA150,6,0,134,6,0,106,6,236,102,6,236,94,177,156
190 REM  WRITTEN 5/2016 BY
200 REM   SIMON STELLING-DE SAN ANTONIO

Das Basic-Programm demonstriert die besonderen Grafikfähigkeiten des Commodore 64, indem es zeigt, wie sich acht verschiedenfarbige Multicolor-Sprites sehr schnell und flüssig über einen farbigen Hintergrund bewegen. Das Basic-Programm zeigt die Sprites zunächst statisch an und beginnt damit, den farbigen Hintergrund aufzubauen. Dies dauert einen Moment, was das Programm auch durch die Anzeige von „PLEASE WAIT“ und einen Zähler, der von 1 bis 64 läuft, deutlich macht. Danach startet die Bewegung der Sprites. Wenn man dann genug gesehen hat, kann man das Programm durch Drücken einer beliebigen Taste wieder beenden. Das Programm ist in BASIC geschrieben und verwendet keinen Maschinensprache-Teil. Das Programm enthält keinen SYS-Befehl und verwendet nur die normalen BASIC-Befehl des Commodore Basic 2.0 auf dem Commodore 64. Natürlich verwendet das Programm oft den POKE-Befehl, da dies auf dem Commodore 64 mit Basic 2.0 der normale Weg ist, um z.B. Sprites darzustellen. Das Programm enthält ausschließlich Befehle und Zeichen, die problemlos in einem Buch abgedruckt und über eine normale Tastatur (sowohl C64-Tastatur als auch heutige PC-Tastatur) eingegeben werden können. Beispielsweise verwendet es den Ausdruck CHR$(147) anstelle der (kürzeren) Zeichenfolge Anführungszeichen – „Inverses Herz“ – Anführungszeichen. Jede Zeile des BASIC-Programms ist kürzer als 80 Zeichen. Das Programm enthält genau 20 Zeilen, von denen aber die letzten 2 Zeilen reine Kommentar-Zeilen sind.


»Moiré«

Autor: Jochen Emmes für Apple II mit Applesoft-BASIC

5 REM MOIREE-FARBE OHNE BEFEHL
10 PRINT "SCHRITTWEITE: ";
20 INPUT X
30 HGR2
40 FOR I=40 TO 240 STEP X
50 HPLOT I,1 TO 140,100
60 HPLOT I,190 TO 140,100
70 NEXT
80 FOR I=1 TO 190 STEP X
90 HPLOT 40,I TO 140,100
100 HPLOT 240,I TO 140,100
110 NEXT
120 GET A$
130 TEXT

Das Programm generiert auf dem Monitor eine Moiré-Grafik im HiRes-Grafikmodus.


»Jump Ball«

Autor: Dirk Schneider, Quelle: Forum64 für Commodore 64

10 X=21 : XX=1.8 : DIM Y(104) : V=53248 :SI=54272 : POKE V+32,13 : POKEV+33,5
20 POKE SI+24,15 : POKE SI+4,129 : POKE SI+5,9 : POKE SI+6,15 : POKE SI,100
30 PRINT CHR$(147) CHR$(5) : PRINT : PRINT : PRINT " MOMENT BITTE..."
40 FOR I=0 TO 3.1416 STEP 0.03 : Y(J)=233-SIN(I)*150 : J=J+1
50 PRINT CHR$(19) : PRINT " " CHR$(19) : PRINT 105-J : NEXT I
60 FOR I=0 TO 62 :READ A : POKE 832+I,A : NEXT I
70 POKE 2040,13 : POKE V+39,7 : POKEV+21,1 : PRINT CHR$(147)
80 PRINT : PRINT TAB(4)"JUMPBALL BY DIRK 'HEXWORX' SCH."
90 FH=233 : GOSUB 170 : FOR I=0 TO 104 : POKE V+1,Y(I)
100 X=X+XX : IF X>321 THEN GOTO 160
110 IF X<21 GOTO 160
120 IF X>255 THEN XP=X-255 : POKE V+16,1 : GOTO 140
130 XP=X : POKE V+16,0
140 POKE V,XP : NEXT : F=F+1 AND 15 : IF F=5 THEN F=6
150 POKE V+39,F : GOTO 90
160 XX=XX*-1 : FH=Y(I) : GOSUB 170 : POKE V+32,PEEK(V+32)+1 AND 255 : GOTO 100
170 POKE SI+1,(233-FH)/32 : POKE SI+4,0 : POKE SI+4,129 : RETURN : DATA 0,62,,
180 DATA 255,128,3,207,224,7,63,240,14,255,248,29,255,252,27,255,252,59,255,254
190 DATA 63,255,254,127,255,255,127,255,255,127,255,255,63,255,254,63,255,254
200 DATA 31,255,252,31,255,252,15,255,248,7,255,240,3,255,224,0,255,128,,62,,13

Der berühmte „Boing“-Ball hier in BASIC nachprogrammiert. Die Daten für das Ball-Sprite finden sich in den DATA-Zeilen 180-200. Ändern Sie diese Angaben, um eine andere Grafik springen zu lassen. Die Flugkurve wird hier übrigens durch eine Sinusfunktion bestimmt. In der Natur findet der schiefe Wurf auf Basis einer Parabelfunktion statt. Gelingt es Ihnen, die physikalisch korrektere Fallbewegung in das Programm einzubauen?


»Dreiklang«

Autor: Ingolf Ihrig für Acorn Archimedes A3000

10 COLOUR 127:VDU 28,10,18,50,4:CLS
20 PRINT TAB(2,2) "3klang in Stereo / Doc Phura 2016"
30 COLOUR 125:PRINT:GOSUB 100:GOSUB 170
40 PRINT:PRINT TAB(4,4) "Bitte auswaehlen:"
50 PRINT:PRINT TAB(6) "1) Ouinte in Mono"
60 PRINT:PRINT TAB(6) "2) Ouinte in Stereo"
70 PRINT:PRINT TAB(6) "3) Ton aus":PRINT:PRINT TAB(6) "4) Ende"
80 W$ = GET$
90 ON VAL(W$) GOSUB 170,160,200,150 ELSE 80:GOTO 80
100 SOUND OFF:VOICES 4
110 *CHANNELVOICE 2 StringLib-Soft
120 *CHANNELVOICE 3 StringLib-Soft
130 *CHANNELVOICE 4 StringLib-Soft
140 RETURN
150 VDU 26:SOUND OFF:CLS:END
160 SOUND ON:STEREO 2,-127:STEREO 3,0:STEREO 4,127:GOTO 180
170 SOUND ON:STEREO 2,0:STEREO 3,0:STEREO 4,0
180 SOUND 2,-15,53,400,100:SOUND 3,-15,61,400,200:SOUND 4,-15,81,400,300
190 RETURN
200 SOUND 2,0,0,0:SOUND 3,0,0,0:SOUND 4,0,0,0:RETURN

Das Programm spielt einen Dreiklang dreistimmig (na, so was!) und in Stereo oder Mono. Das konnte damals nicht jeder Heimcomputer.


»SAY«

Autor: Henrik Kühn für Commodore Amiga mit AmigaBASIC

SAY TRANSLATE$("It was just a one liner to do speech synthesis with Amiga Basic.")
FOR i=0 to 8
  READ how%(i)
NEXT i
SAY TRANSLATE$("It could even talk with different speed or tune or gender."), how%
DATA 140,0,160,0,22000,64,11,1,0

Das Programm demonstriert die Sprachsynthese des Amiga unter BASIC. Hierbei können sogar verschiedenen Stimmen/Stimmlagen gewählt werden. Experimentieren Sie mit den how%-Werten in der DATA-Zeile.


»Langton’s Ant«

Autor: Simon Ferré, Quelle: Facebook für Sinclair ZX Spectrum

10 BORDER 2: INK 0: PAPER 6: CLS 
20 RANDOMIZE 
30 LET x=128: LET y=88: LET g=0
40 DIM t(2)
50 LET xd=1: LET yd=0
60 IF POINT (x,y) THEN GO TO 100
70 PLOT OVER 1;x,y
80 IF xd=0 THEN LET t(1)=yd: LET t(2)=0: GO TO 130
90 LET t(1)=0: LET t(2)=0-xd: GO TO 130
100 PLOT OVER 1;x,y
110 IF xd=0 THEN LET t(1)=0-yd: LET t(2)=0: GO TO 130
120 LET t(1)=0: LET t(2)=xd
130 LET xd=t(1): LET yd=t(2)
140 LET x=x+xd: IF x<1 OR x>254 THEN LET x=128
150 LET y=y+yd: IF y<1 OR y>174 THEN LET y=88
160 LET g=g+1: PRINT #0;AT 0,0;"Generations: ";g
170 GO TO 60

Langtons Ameise ist die Simulation eines einfachen Turing-Automaten, also eines Computermodells. Das Programm steht in der Tradition der zellulären Automaten (zu denen auch das bekannte »Game of Life« gehört). Auf der oben verlinkten Facebook-Seite finden sich weitere Beispiele und Adaptionen des Programms.