Magic Disk 64

home to index to html: MD8911-KURSE-BASIC_KURS_TEIL_9-2.html
 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 erle-
digt 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 Spielprogram-
men  ihre Verwendung finden. Erst einmal
zur Arbeitsweise von RND. Mit  dem  Aus-
druck 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  Kommastel-
len)  in  einem  vordefinierten Wertebe-
reich 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 schrei-
ben, 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  For-
mel  benutzen  und vorher in X und Y be-
stimmte Werte festlegen.                
Es sei jedoch noch zu erwähnen, daß  die
Zufallszahlen,  die  RND  liefert  nicht
unbedingt "zufällig" sind. Der 64er  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  ha-
ben immer dieselben Zufallszahlen erhal-
ten. Probieren Sie das doch einmal aus. 
Lassen Sie sich einmal ein paar Zufalls-
zahlen, direkt nach dem Einschalten  des
64ers ausgeben, schalten Sie dann wieder
AUS  und  EIN,  und rufen Sie wieder mit
RND ein paar Zahlen ab. Sie werden fest-
stellen,  daß  diese haargenau dieselben
sind, die wir vorher  auch  hatten.  Das
kann  höchst  negative  Auswirkungen auf
ein Spiel haben, zumal Sie bei dem  Lot-
tobeispiel von oben immer dieselben Zie-
hungen hätten.                          
Um  dieses  Problem  zu  umgehen gibt es
einen kleinen Trick. Der 64er  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  vor-
definierte  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 anzei-
gen,  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  Variablendefi-
nition  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  in-
ternen 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öti-
gen, 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änderun-
gen 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  Disketten-
operationen  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ön-
nen  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  einge-
hender Behandelt haben)                 
Nun noch zu der Sache mit  den  Zufalls-
zahlen.  TI spielt dabei eine große Rol-
le. Um praktisch die  internen  Zufalls-
zahlen  "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 durcheinander-
geworfen haben, so daß wir ab jetzt sehr
gut mit unserer Allgemeinformel Zufalls-
werte abrufen  können,  die  jetzt  auch
verschieden voneinander sind.           
In  unserer  allgemeinen  Formel für Zu-
fallszahlen 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  be-
deutet  das,  das  immer  auf die nächst
kleinere Zahl abgeschnitten  wird,  dem-
nach  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  Feh-
ler, der schon  von  Anfang  an  im  Be-
triebssystem  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 64er 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  ver-
abschiede mich zunächst  von  Ihnen  und
hoffe, Ihnen  die  Programmierung  Ihres
C64  einigermaßen  verständlich   veran-
schaulicht zu haben.                    
                        Ihr Uli Basters 



Valid HTML 4.0 Transitional Valid CSS!