3.) Die kleinen, aber feinen, Sonder- funktionen.
Im letzten Abschnitt dieses Artikels
möchte ich mich noch ein wenig um ein
paar kleine Sonderfunktionen kümmern, die BASIC so bietet. Diese kann man
nicht einfach unter einem Überbegriff
zusammenfassen, denn jede Funktion erledigt jeweils eine in sich abgeschlossene
Aufgabe. Fangen wir einmal mit einer der
Wichtigsten dieser Funktionen an, der
RND-Funktion :
RND steht für RaNDom, was soviel heißt
wie Zufall. Mit dieser Funktion können
wir uns Zufallszahlen liefern lassen, wie sie in einer Fülle von Spielprogrammen ihre Verwendung finden. Erst einmal
zur Arbeitsweise von RND. Mit dem Ausdruck RND( X) liefert Ihnen der C64 einen
Zufallswert zwischn 0 und eins, wobei
der Wert von X keine Rolle spielt ( X ist
eine Variable) . Da man aber meist wenig
mit solchen Dezimalbrüchen zwischen 0
und 1 anfangen kann, gibt es auch eine
besondere Formel, mit denen man sich
auch ganze Zahlen ( also OHNE Kommastellen) in einem vordefinierten Wertebereich abrufen kann. Diese Formel lautet
folgendermaßen:
ZU= INT( RND(1)* Y)+ X
Wobei X für die untere, und Y für die
obere Zahlengrenze steht. Wollten wir
also ein kleines Lottoprogramm schreiben, a la "6 aus 49", so müßte unser
Ausdruck folgendermaßen lauten :
ZU=INT(RND(1)*49)+1
Ich habe hier einmal die Werte von X und
Y schon direkt eingesetzt. Natürlich
könnten Sie auch unsere allgemeine Formel benutzen und vorher in X und Y bestimmte Werte festlegen.
Es sei jedoch noch zu erwähnen, daß die
Zufallszahlen, die RND liefert nicht unbedingt " zufällig" sind. Der 64 er ist
eben ein Computer und bei diesen geht
alles immer korrekt und logisch zu. Die
Zufallszahlen, die RND liefert werden
deshalb immer auch nach einem bestimmten
Schema berechnet, so daß es Ihnen gut
passieren kann, daß Sie, wenn Sie den
Rechner gerade frisch eingeschaltet haben immer dieselben Zufallszahlen erhalten. Probieren Sie das doch einmal aus.
Lassen Sie sich einmal ein paar Zufallszahlen, direkt nach dem Einschalten des
64 ers ausgeben, schalten Sie dann wieder
AUS und EIN, und rufen Sie wieder mit
RND ein paar Zahlen ab. Sie werden feststellen, daß diese haargenau dieselben
sind, die wir vorher auch hatten. Das
kann höchst negative Auswirkungen auf
ein Spiel haben, zumal Sie bei dem Lottobeispiel von oben immer dieselben Ziehungen hätten.
Um dieses Problem zu umgehen gibt es
einen kleinen Trick. Der 64 er verwaltet
nämlich auch eine kleine interne Uhr.
Diese Uhr benutzt zwei vordefinierte
Variablen, ähnlich wie bei ST. Diese
Variablennamen dürfen Sie nie für eigene
Zwecke benutzen, da sie vom System vordefinierte Werte enthalten. Zum einen
wäre da die interne Uhr TI$ . TI$ ist
eine Stringvariable, wie man zweifellos
erkennen kann. In ihr steht eine immer
abrufbereite, interne Uhr zur Verfügung.
Wenn Sie also PRINT TI$ eingeben, so
wird der C64 Ihnen die Zeit, seitdem Sie
ihren Rechner eingeschaltet haben anzeigen, in dem Format HHMMSS, wobei HH für
Stunde steht, MM für Minute und SS für
Sekunde. Möchten Sie diese Uhr nun auf
einen eigenen Wert setzen, weil Sie zum
Beispiel die aktuelle Tageszeit in einem
Programm verwenden wollen, so kann man
dies mit einer einfachen Variablendefinition bewerkstelligen. Angenommen es
ist 10 Uhr 42 und 15 Sekunden, dann
reicht folgende Definition vollkommen
aus:
TI$="104215"
Anschließed steht diese Zeit in der internen Uhr gespeichert, die die Sekunden
von diesem Zeitpunkt an mitzählt.
Die zweite Variable, die etwas mit der
Uhr zu tun hat, und die wir auch benötigen, um mit RND " richtige" Zufallszahlen
zu erhalten, heißt TI. Wie Sie sehen
eine numerische Variable. TI wird nun
alle 1/60- Sekunde vom C64 hochgezählt.
Das wiederholt sich solange bis Sie TI$ wieder neu setzen. TI selbst können Sie
nicht verändern. Man kann diese Variable
gut in Programmen benutzt werden, die
ziemlich genau arbeiten sollen, jedoch
sei gesagt, daß BASIC wahrscheinlich zu
langsam ist, als daß solche Veränderungen von BASIC schnell genug festgestellt
werden könnten. Sie können ja einmal ein
bißchen mit TI herumexperimentieren. . .
Es sei ebenfalls noch erwähnt, daß die
interne Uhr TI$ sehr, sehr, ungenau ist.
Es ist gut möglich, daß sie innerhalb von 24 Stunden um eine halbe Stunde ( !) von der wirklichen Zeit abweichen kann.
Auch wenn Sie irgendwelche Operationen
mit Ihrem Diskettenlaufwerk machen, kann
die Uhr gebremst werden. Bei Diskettenoperationen wird sie nämlich gänzlich
abgeschaltet, so daß die Zeit, in der
die Floppy tätig war erst gar nicht
gezählt wurde. Solche Abweichungen können sich sehr schnell summieren, so daß
die Uhr am Ende total falsch geht. Also
Vorsicht bei der Benutzung von TI$ . . .
(" richtige" Uhren kann man eigntlich nur
in Assembler programmieren, doch ich
glaube, daß wir auch schon einmal auf
einer Magic Disk dieses Problem eingehender Behandelt haben)
Nun noch zu der Sache mit den Zufallszahlen. TI spielt dabei eine große Rolle. Um praktisch die internen Zufallszahlen " zu mischen" benutzt man nämlich
einfach folgenden Ausdruck:
X= RND(- TI)
Was wir hier als Ergebnis in X erhalten
kann ignoriert werden. Wichtig ist, daß
wir nun die Zufallszahlen durcheinandergeworfen haben, so daß wir ab jetzt sehr
gut mit unserer Allgemeinformel Zufallswerte abrufen können, die jetzt auch
verschieden voneinander sind.
In unserer allgemeinen Formel für Zufallszahlen zwischen X und Y ist Ihnen
bestimmt der merkwürdige Ausdruck INT
aufgefallen. INT stellt ebenfalls eine
besondere Funktion dar, dieser Befehl
schneidet nämlich ganz einfach bei einer
Dezimalzahl den Nachkommastellen ab. Das
heißt, daß beispielsweise die Zahl
2 .54873 zu einer einfachen 2 reduziert
wird. Die mit INT erhaltenen Zahlen sind
also immer gleich oder kleiner als die
Ursprungszahl. Bei negativen Zahlen bedeutet das, das immer auf die nächst kleinere Zahl abgeschnitten wird, demnach ist INT(-2 .54873) gleich -3, weil
-3 ja kleiner ist als -2 !
Ansonsten hätten wir da noch FRE( X) .
FRE( X) gibt einem den noch verfügbaren
Basicspeicher an, wobei es egal ist, welchen Wert X enthält. Allerdings ist
diese Funktion etwas fehlerhaft. Es ist
quasi unter C64- Kennern ein alter Fehler, der schon von Anfang an im Betriebssystem enthalten war, und meines
Wissens niemals geändert wurde. Es benötigt nämlich einer besonderen Formel, um
den tatsächlichen freien Speicherplatz
zu ermitteln. Geben Sie nämlich nur
FRE(0) ein, so wird Ihnen Ihr 64 er eine
negative Zahl ausspucken, mit der wir im
Endeffekt ja garnichts richtig anfangen
können. Um die wahre Anzahl der freien
Bytes zu erhalten, müssen Sie mit der
folgenden Formel arbeiten :
PRINT 65538+FRE(0)
Nun haben Sie den richtigen Wert.
Damit sind wir nun endgültig am Ende
unseres Basickurses angelangt. Ich verabschiede mich zunächst von Ihnen und
hoffe, Ihnen die Programmierung Ihres
C64 einigermaßen verständlich veranschaulicht zu haben.
Ihr Uli Basters