Kapitel 4: Weitere BASIC-Befehle
Einleitung
Die folgenden Kapitel richten sich an diejenigen Computerbenutzer, die bereits Erfahrung mit der Programmsprache BASIC haben. Es werden einige Methoden vorgestellt, die man zum Schreiben fortgeschrittener Programme benötigt.
Diejenigen, die erst mit dem Programmieren angefangen haben, werden einige Abschnitte vielleicht nicht sofort verstehen. Aber – nur Mut; für die beiden besonders unterhaltsamen Kapitel “SPRITE-GRAFIK” und “TONERZEUGUNG” haben wir uns auch ein paar Beispiele für den Anfänger einfallen lassen. Diese Beispiele werden Ihnen einen Eindruck davon vermitteln, welche faszinierenden Grafik- und Tonmöglichkeiten in Ihrem COMMODORE 64 stecken. Für diejenigen, die gar nicht genug kriegen können, haben wir im Anhang M noch eine Liste von BASICLehrbüchern zusammengestellt.
Detaillierte Informationen speziell für den COMMODORE 64 können Sie dem PROGRAMMIERHANDBUCH zum COMMODORE 64 entnehmen, das in Kürze bei Ihrem Fachhändler erhältlich sein wird.
Bewegung auf dem Bildschirm
Wir wollen nun noch einmal das üben, was wir bis jetzt gelernt haben, und noch einige neue Methoden dazu lernen. Nehmen Sie sich Mut und tippen Sie das nachstehende Programm ein. Das Bemerkenswerte an diesem Programm ist, daß der PRINT-Befehl zur Steuerung des Cursors benutzt wird. Wenn Sie im Programm z. b. den Cursor nach links bewegen wollen, so drücken Sie beim Eintippen die <CRSR>– und die <SHIFT>-Taste. Im Programmausdruck (auch “Listing” genannt) wird dies durch zwei senkrechte Streifen markiert. Das programmgesteuerte Löschen des Bildschirms mit <SHIFT> <CLR/HOME> wird durch ein revers (negativ) dargestelltes Herz repräsentiert.
Wenn Sie das Programm richtig abgetippt haben, so erscheint nach dem Start ein Ball, der zwischen dem linken und dem rechten Rand hin- und her reflektiert wird.
In Zeile 10 steht hinter dem REM (von REMark = Anmerkung) ein Kommentar, der den Programmtitel enthält; er hat keinerlei Auswirkung auf den Programmablauf. In Zeile 20 wird der Bildschirm gelöscht. Zeile 25 enthält 10 mal den Befehl Cursor abwärts; hierdurch wird die Ballbewegung in die Bildschirmmitte verlagert. Wenn Sie die Zeile 25 weglassen, wird sich der Ball am oberen Bildschirmrand hin- und herbewegen. Beachten Sie, daß bei einer FOR … NEXT-Schleife FOR und
NEXT-Anweisung in einer Zeile stehen können. Mehrere BASIC-Befehle in einer Zeile müssen jedoch durch Doppelpunkte getrennt werden. In Zeile 30 befindet sich der erste Teil einer Schleife, die dafür sorgt, daß sich der Ball horizontal (von links nach rechts) über den gesamten, 40 Spalten breiten, Bildschirm bewegt.
In Zeile 40 wird eine Menge Arbeit geleistet. Als erstes wird ein leeres Feld (auch “Space” genannt) gedruckt, dann wird der Ball gedruckt und schließlich wird der Cursor nach links bewegt, um die Vorbedingung für ein erneutes Löschen des Balls zu schaffen.
Die Schleife in den Zeilen 50 und 60 dient nur dazu, die Bewegung des Balls zu verlangsamen. Ohne diese Schleife wäre der Ball kaum sichtbar. In Zeile 70 befindet sich die zweite Hälfte der Schleife, deren erste Hälfte sich in Zeile 30 befindet. Jedesmal, wenn diese Schleife durchlaufen wird, bewegt sich der Ball um eine Cursorposition auf dem Bildschirm nach rechts. Wie aus den verbindenden Pfeilen im obigen Programmausdruck deutlich hervorgeht, haben wir eine Schleife in einer Schleife (sog. geschachtelte Schleifen) konstruiert.
Wenn Sie diese Methode, Schleifen innerhalb anderer Schleifen laufen zu lassen, anwenden, so müssen Sie darauf achten, daß die zuerst geöffnete Schleife als letzte geschlossen wird. Überkreuzungen, die Sie z. B. durch Vertauschen der Zeilen 60 und 70 herbeiführen können, führen zu Fehlermeldungen.
In den Zeilen 80 bis 120 wird der umgekehrte Bewegungsablauf auf dem Bildschirm erzeugt. Da die beiden Bewegungsrichtungen auf dem Bildschirm jedoch nicht völlig gleichberechtigt sind, sehen die einander entsprechenden Zeilen 40 und 90 etwas unterschiedlich aus. Zum Schluß geht das Programm zurück zur Zeile 20 und alles fängt wieder von vorn an.
Zum besseren Verständnis des Programms bringen wir noch eine kleine Änderung in Zeile 40 an:
Starten Sie das Programm noch einmal und schauen Sie was passiert. Da wir die Cursorsteuerung weggelassen haben, bleibt der Ball auf dem Bildschirm, bis er durch den “reflektierten” von rechts kommenden Ball gelöscht wird.
Input
In den bis jetzt besprochenen Programmen bestand keine Möglichkeit, den Ablauf zu beeinflussen, ohne das Programm selbst zu ändern. Benutzt man die INPUT-Anweisung (INPUT = Eingabe), so hat man die Möglichkeit, während des Programmablaufs Informationen an das Programm zu übergeben.
Das folgende Programm soll Ihnen eine Vorstellung davon geben, wie man mit der INPUT-Anweisung arbeitet:
An der Stelle, wo Sie einen INPUT programmiert haben, hält das Programm an, und ein Fragezeichen signalisiert, daß der Computer eine Eingabe von der Tastatur erwartet. Geben Sie nun irgend eine Folge von Zeichen ein und drücken die <RETURN>-Taste, so druckt der Computer aus: SIE GABEN EIN und dahinter den von Ihnen eingegebenen Text.
Um ein Programm komfortabler zu gestalten, kann man zusammen mit dem INPUT einen Kommentar auf den Bildschirm bringen, der z. B. angibt, welche Eingabe erwartet wird. Dieser Kommentar darf allerdings nicht länger als 38 Zeichen sein. Das Format (d. h. soviel wie Schreibweise) der INPUT-Anweisung ist:
Dabei kann die Variable eine Stringvariable oder eine numerische Variable sein.
Wenn Sie auf den Kommentar verzichten wollen, brauchen Sie nur einzugeben: INPUT VARIABLE
Das folgende Programm, das Temperaturangaben in FAHRENHEIT und CELSIUS ineinander umrechnet, benutzt vieles von dem, was Sie bis jetzt gelernt haben:
Zusammen mit dem INPUT in Zeile 10 wird ein Text auf dem Bildschirm ausgegeben.
In den Zeilen 20, 30 und 40 wird die Eingabe überprüft. Wenn “nichts” eingegeben wird, d. h. nur die <RETURN>-Taste gedrückt wurde, so wird das in Zeile 20 festgestellt; das Programm geht nach Zeile 10 zurück und wartet auf eine neue Eingabe. Wurde “C” eingegeben, so bewirkt die Zeile 30 einen Sprung in die Zeile 100, dort beginnt der Programmteil, der Fahrenheit in Celsius umrechnet. Nach Eingabe von “F” springt das Programm nach 50. Jede andere Eingabe führt (wegen Zeile 45) zu einem Sprung nach 10 und damit zu einer erneuten Abfrage.
Wenn das Programm richtig eingetippt wurde, so fragt es ab, welche Umrechnung gewünscht wird, verlangt dann die Eingabe des entsprechenden Temperaturwertes und rechnet um.
Die Umrechnungsformeln können in jedem Grundlehrbuch der Physik nachgelesen werden; ihre Umsetzung in ein BASIC-Programm ist sehr einfach.
Nachdem die Umrechnung erfolgt ist und der entsprechende Wert ausgedruckt wurde, kehrt das Programm wieder in die Zeile 10 zurück und wartet auf ein neue Eingabe. Der Bildschirm könnte zu diesem Zeitpunkt etwa so aussehen.
Wenn das Programm zufriedenstellend gelaufen ist, sollten Sie es zur späteren Verwendung auf Band oder Diskette abspeichern.
GET
Mit Hilfe der GET-Anweisung können Sie jeweils ein Zeichen von der Tastatur in den Rechnerspeicher einlesen ohne die <RETURN>-Taste zu betätigen. Die Eingabe von Daten läßt sich dadurch in vielen Fällen erheblich beschleunigen. Das eingegebene Zeichen wird der Variablen zugeordnet, die hinter der GET-Anweisung steht. Die folgende Routine illustriert, wie GET arbeitet:
Wenn Sie das Programm starten, so wird als erstes der Bildschirm gelöscht. Drücken Sie eine Taste, so bewirkt Zeile 20, daß das zugehörige Zeichen auf dem Bildschirm ausgedruckt wird. Dann wartet die GET-Anweisung auf eine neue Eingabe. Beachten Sie, daß das Zeichen erst durch den PRINT-Befehl auf dem Bildschirm erscheint. Der zweite Befehl in Zeile 10 ist sehr wichtig. Da GET ununterbrochen arbeitet (im Gegensatz zu INPUT, wo ja die Eingabe durch <RETURN> bestätigt wird), wird geprüft, ob eine Taste gedrückt wurde. Solange das nicht der Fall ist (d. h. solange A$ = “”), bleibt das Programm in Zeile 10. Überprüfen Sie doch mal, was passiert, wenn Sie den zweiten Teil der Zeile weglassen.
Um das Programm anzuhalten müssen Sie <RUN/STOP> <RESTORE> drücken. Das Temperatur-Umrechnungs-Programm können Sie leicht mit GET-Anweisungen ausstatten, wenn Sie die Zeilen 10, 20 und 40 in folgender Weise umschreiben und Zeile 45 löschen:
Die Erzeugung von Zufallszahlen
Ihr COMMODORE 64 enthält eine große Zahl eingebauter Funktionen. Sie können diese Funktionen im Rahmen von BASIC-Programmen wie Unterprogramme benutzen. Dazu brauchen Sie nur die gewünschte Funktion mit ihrem Namen aufzurufen.
Sowohl beim Schreiben von Lernprogrammen wie auch von Spielprogrammen ist es oft von Vorteil, Zufallszahlen zu verwenden; so z.B. wenn Sie ein Würfelspiel simulieren wollen. Für diese Zwecke benützt man sinnvollerweise die RND-Funktion (abgeleitet von RaNDom = zufällig). Tippen Sie das folgende Programm ein, um zu sehen, wie die RND-Funktion arbeitet:
Nach Beendigung des Programms sollte der Bildschirm etwa wie folgt aussehen:
Sie haben andere Zahlen? Nun, kein Wunder, die Zahlen sollen ja auch zufällig sein.
Lassen Sie das Programm ein paar mal laufen und vergewissern Sie sich, daß stets andere Zahlen ausgedruckt werden. Allen Zahlen gemeinsam ist nur die Eigenschaft, daß sie zwischen 0 und 1 liegen (jedoch nie die Werte 0 und 1 selbst annehmen). Außerdem erhalten wir 9-stellige Dezimalbrüche, oder sogar Zahlen in wissenschaftlicher Notation.
Was machen wir nun, wenn wir ein Würfelspiel darstellen wollen und dafür Zahlen im Bereich von 0 bis 6 und dazu noch ganzzahlig brauchen? Gehen wir erst einmal das erste Problem an, nämlich die Änderung des Bereichs, in dem die Zufallszahlen liegen.
Ändern Sie zu diesem Zweck die Zeile 20 Ihres Programms wie folgt ab:
Nun liegen die Zahlen etwa für ein Würfelspiel im richtigen Bereich, aber die Nachkommastellen stören noch. Aber auch für diesen Fall haben wir eine eingebaute Funktion in unserem COMMODORE 64:
Die INT-Funktion (abgeleitet von INTeger = ganze Zahl) schneidet die Nachkommastellen einer Dezimalzahl ab.
Ändern Sie die Zeile 20 noch einmal wie folgt ab und starten Sie das Programm:
Nun stört nur noch eine Tatsache; statt der Zahlen zwischen 1 und 6 erhalten wir welche zwischen 0 und 5. Wir ändern deshalb die Zeile 20 ein letztes Mal:
Jetzt liefert uns das Programm die gewünschten Zahlen.
Sie können auf diese Weise Zufallszahlen in jedem gewünschten Bereich der Zahlenskala erzeugen. Die Größe des Bereichs wird vorgegeben durch die Zahl mit der Sie die RND-Funktion multiplizieren. Durch Hinzuaddieren einer Zahl können Sie diesen Bereich beliebig verschieben. Wenn Sie nur ganze Zahlen erhalten wollen, wenden Sie noch die INT-Funktion an. Schematisch ausgedrückt sieht das etwa so aus:
Zahlenratespiel
Nachdem wir uns so lange mit dem Erklären der Zufallszahlen aufgehalten haben, wollen wir endlich auch eine Anwendung bringen. Das folgende Programm zeigt nicht nur eine sinnvolle Anwendung der RND-Funktion, sondern bringt auch einige neue Programmiertricks.
Die Zufallszahl, die in diesem Programm verwendet wird, wurde der Variablen NM zugeordnet.
Sie können zu Beginn des Programms festlegen, welche maximale Größe die Zahl, die Sie erraten sollen, annehmen kann. Dann können Sie mit dem Raten beginnen.
Das Programm kommentiert Ihre Eingaben und gibt Ihnen Hinweise darauf, wie groß die zu erratende Zahl ist. Dies wird programmtechnisch mit Hilfe von IF … THEN-Anweisungen realisiert, in denen die vom Computer ausgewählte Zahl mit Ihrer Eingabe verglichen wird.
Versuchen Sie nun einmal das Programm so abzuändern, daß der Benutzer auch die untere Grenze der vom Rechner vorgegebenen Zufallszahlen eingeben kann.
Bei jedem Rateversuch, den Sie machen, wird die Variable CN um 1 erhöht, um die Anzahl der Fehlversuche zu ermitteln, die ja nach Auffinden der “richtigen” Zahl vom Computer zusammen mit dem Text “TOLL SIE HABEN DIE ZAHL ERRATEN” ausgegeben wird. Nun können Sie mit einem neuen Spiel beginnen, in dem der COMMODORE 64 natürlich eine neue Zufallszahl vorgibt.
Würfelspiel
Das folgende Programm simuliert ein Würfelspiel mit zwei Würfeln. Viel Glück!
Überprüfen Sie Ihr Wissen über das Programmieren in BASIC und versuchen Sie zu verstehen, wie das Programm aufgebaut ist.
Zufallsgrafiken
Daß man auch Grafiken auf Zufallszahlen aufbauen kann, sehen Sie an folgendem kleinen Programm:
Das Wichtigste in diesem Programm steht in der Zeile 20, die die CHR$-Funktion enthält. Je nachdem welche Zahl zwischen 0 und 255 Sie in Klammern hinter den Funktionsnamen setzen, erhalten Sie jeweils ein anderes Zeichen. Die Codetabelle, aus der hervorgeht, wie die Zahlen und Zeichen einander zugeordnet sind, ist im Anhang F dieses Handbuchs abgedruckt.
Sie können den Zahlenwert, der einem Zeichen zugeordnet ist, aber auch selbst ermitteln, wenn Sie die ASC-Funktion benutzen. Sie tippen nur ein:
Wobei X für das Zeichen steht, dessen Zahlencode Sie wissen wollen. Es kann sich hierbei um jedes druckbare Zeichen, einschließlich der Grafikzeichen, handeln. Der Code, um den es hier geht, wird im allgemeinen als ASCII-Code bezeichnet. Die ASC-Funktion ist die Umkehrfunktion der CHR$-Funktion. D. h., wenn Sie die mit ASC ermittelte Zahl (z. B. Y) in die CHR$-Funktion einsetzen, so erhalten Sie nach Eingabe von
das Zeichen X ausgedruckt.
Tippen Sie nun ein
so erhalten Sie die Grafikzeichen ausgedruckt, die sich vorn rechts auf der M- und der N-Taste befinden, und aus denen sich ein Irrgarten von der Art aufbauen läßt, wie ihn unser kleines Programm erzeugt hat.
Wenden wir nun die Formel 205.5 + RND(1) an, so werden Zahlen zwischen 205.5 und 206.5 erzeugt. Die Wahrscheinlichkeiten dafür, daß eine Zahl größer oder kleiner als 206 ist, sind gleich groß. Da die CHR$-Funktion die Nachkommastellen ignoriert, werden also die Zeichen mit den Codes 205 und 206 mit gleicher Häufigkeit ausgedruckt.
Sie können diese Wahrscheinlichkeit und damit das Aussehen der Grafik dadurch verändern, daß Sie den Ausgangswert 205.5 um einige Zehntel vergrößern oder vermindern.