BASIC-Tutorial (Vorwort, Installation, Kapitel 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11)

Arrays, Grafik

9.1. Arrays (Felder) erstellen

Fangen wir zur Abwechslung gleich mit einem Beispiel an: Angenommen, ein Lehrer benötigt 60 Variablen, denn sein Vorhaben ist es, zu einer Klasse alle Namen der Schüler + deren Noten aufzunehmen. Die Klasse hat 30 Schüler, also braucht er zunächst 30 String-Variablen für die Namen der Schüler. Dazu noch 30 Integer-Variablen, um die Noten abzuspeichern. Wir könnten als Variablen-Bezeichner für die Namen der Schüler deren Vornamen nehmen und bei den Bezeichnern für die Variablen zum Abspeichern der Noten den Vornamen des Schülers + Unterstrich + note verwenden (z.B. andreas_note).

Nun stehen wir vor (mindestens) zwei Problemen. Erstens wäre es für den Lehrer sicher auch praktisch, wenn er alle Namen und Noten auf einmal in einer Liste ausgeben könnte. Um das zu erreichen, wäre sehr viel Tipparbeit nötig. Die viele Tipparbeit ist zugleich unser zweites Problem.

Abhilfe schafft hier ein Array, auch als Datenfeld oder Matrix bezeichnet. Ein Array beinhaltet (fast) beliebig viele Variablen gleichen Typs. Stellen Sie sich vor, Sie haben 4 Variablen vom Typ Integer (Ganzzahlentyp). Diese fassen wir quasi zusammen. Die einzelnen Werte bleiben natürlich erhalten, aber auf die 4 Variablen (Elemente) greifen wir nach einem bestimmten Schema zu. Dieses sieht so aus: Arraybezeichner[Index]. Der Index reicht in diesem Beispiel von 0 bis 3 und bezeichnet eines der 4 Elemente. Der Arraybezeichner ist der Name des Arrays. Nehmen wir als Bezeichner datensatz an. Über datensatz[1] wird dann auf das zweite Element zugegriffen, da bei 0 zu zählen begonnen wird.

Ein Array wird folgendermaßen vereinbart:

DIM Name (Von TO Bis) AS Typ

Das eben genannte Beispiel sieht dann so aus:

DIM datensatz (0 TO 3) AS Integer

Letztere Zeile deklariert das Array datensatz, bestehend aus 4 Elementen vom Typ Integer. Diese sind:

  1. datensatz[0]
  2. datensatz[1]
  3. datensatz[2]
  4. datensatz[3]

Übrigens hätten wir als unteren Index auch 1 nehmen können. Dann würden sich die Indizes von 1 bis 4 erstrecken (wiederum 4 Elemente).

Beim Typ String gibt es eine Besonderheit zu nennen: Vereinbart man eine Variable vom Typ String, so kann diese Variable max. 255 Zeichen aufnehmen. Was darüber hinausgeht, wird abgeschnitten. Will man eine obere Grenze festlegen (Maximallänge; alles darüber wird abgeschnitten), so kann man das folgendermaßen tun:

DIM datensatz (0 TO 3) AS String * Maximallänge

Beispiel:

DIM zehnzeichen (0 TO 3) AS String * 10

Hier wurde das Array zehnzeichen mit 4 Elementen vom Typ String festgelegt. Eines davon kann maximal einen String von 10 Zeichen Länge aufnehmen.

Abschließend noch die Realisierung des Beispiels, das ganz zu Beginn gebracht wurde. Es demonstriert zugleich, wie auf das Array über den Index in eckiger Klammer zugegriffen wird:

CLS
DIM namen (1 TO 30) AS STRING	' Vornamen
DIM noten (1 TO 30) AS INTEGER	' Zugehoerige Schulnoten
FOR i = 1 TO 30			' Array durchlaufen (von 1 bis 30)
  PRINT i; ". Schueler..."
  INPUT "Name: ", namen[i]	' z.B. namen[3] => Vorname des 3. Schuelers
  INPUT "Note: ", noten[i]
NEXT i
PRINT ""
PRINT "Alle Schuelerdaten werden noch einmal ausgegeben ..."
FOR i = 1 TO 30
  PRINT namen[i]; " - "; noten[i]
NEXT i

9.2. Grafikmodus, Textmodus

Bisher haben wir, ohne es extra bekannt geben zu müssen, im Textmodus gearbeitet. In diesem Modus können Sie lediglich reinen Text auszugeben. Grafiken zeichnen ist nicht möglich, sofern sich diese nicht aus Textzeichen zusammensetzen (aber Derartiges werden Sie wahrscheinlich nicht als "vollwertige" Grafiken ansehen; Stichwort: ASCII-Art). In diesem und den folgenden Abschnitten beschäftigen wir uns mit einfachen Themen der Grafik-Programmierung.

Bevor wir Grafiken darstellen können, müssen wir zunächst einmal in den hierfür geeigneten Modus - den Grafikmodus - umschalten. Dies geschieht mit dem Befehl SCREEN.

Jedoch gibt es nicht bloß einen Grafikmodus, sondern gleich mehrere Grafikmodi. Dies hat nichts damit zu tun, dass man hiermit die Programmierer ärgern möchte, sondern geht auf die technische Entwicklung im Laufe der Zeit zurück. Laufend gab es Neuentwicklungen und Grafikkarten waren in der Lage, immer höhere Auflösungen und Bildwiederholfrequenzen darzustellen. Weiters kam hinzu, dass Monitore nun auch in der Lage waren, eine immer größere Farbanzahl anzuzeigen (bis rd. 16,7 Millionen Farben; 3 versch. Farben (rot, grün, blau) mit je 256 Möglichkeiten gibt 2563 = 16.777.216 Farben).

Die wichtigsten Modi in QBasic werden im Folgenden aufgezählt:

Modus Beschreibung Auflösung Farbanzahl
0 Textmodus 80 * 25 16 Farben
12 Grafikmodus 640 * 480 16 Farben
13 Grafikmodus 320 * 200 256 Farben

Wer 256 Farben nutzen möchte, muss sich mit einer Auflösung von 320 * 200 begnügen. 640 * 480 ist übrigens die höchste Auflösung, die wir in QBasic verwenden können.

Das Umschalten in einen anderen Modus sieht folgendermaßen aus:

SCREEN Modus

9.3. Punkte zeichnen

Nun können wir mit dem Zeichnen beginnen. Den ersten Befehl, den Sie kennen lernen werden, ist PSET. PSET erlaubt es, Punkte auf dem Bildschirm zu platzieren. Sie müssen lediglich wissen, wohin mit dem Punkt, geben die Koordinaten (X-, Y-Position) an, und der Punkt erscheint am Bildschirm.

PSET (X-Koordinate, Y-Koordinate)

Das nächste Programm - eine kleine Grafikspielerei - gibt an Zufallskoordinaten (mittels Zufallsgenerator erzeugt) Punkte aus:

CLS
SCREEN 12	' 640*480, 16 Farben
RANDOMIZE TIMER
FOR i = 0 TO 300
  PSET (i / RND, RND + i + RND)
NEXT i

Was entsteht, ist ein wirres Muster von Punkten. Ändern Sie einfach mal die Zeile, in der es an die Ausgabe der Punkte geht (PSET ...) nach Ihren Wünschen ab. Übrigens ist die Berechnung eine rein willkürliche. Welche Berechnung verwendet wird, ist natürlich vollkommen egal. Ebenso egal ist, ob überhaupt eine Berechnung verwendet wird. Ziel des Beispiels ist nur, viele Punkte an möglichst verschiedenen Positionen zu platzieren.

Sie können die Punktfarbe damit beeinflussen, indem Sie - wie bei der Arbeit im Textmodus - COLOR dazu verwenden. COLOR 12 vor PSET erzeugt roten Punkt. Zur Textausgabe können Sie PRINT benutzen.

9.4. Linien zeichnen

Der nächste Befehl, den Sie kennen lernen, ist LINE. Dessen Funktion ist wohl nicht schwer zu erraten: Linien zeichen. Die Syntax sieht folgendermaßen aus:

LINE (X-Start, Y-Start)-(X-Ziel, Y-Ziel), Farbe

Sollten Sie sich über die eigenartige Syntax wundern: LINE ist - falls Sie Gegenteiliges vermutet hatten - keine Funktion, sondern, wie Sie in der QBasic-Hilfe nachlesen können, ein Statement, also ein (Q)Basic-eigenes Sprachelement!

Der Punkt X: 0, Y: 0 liegt links oben, und nicht, wie mathematisch üblich, links unten! Die Linie benötigt einen Start- und einen Endpunkt. Vom Start- bis zum Endpunkt wird dann die Linie gezogen. Ähnlich ist es, wenn sie etwas mit der Hand zeichnen. Irgendwo setzen Sie den Stift an, ziehen eine Linie und irgendwo nehmen Sie den Stift wieder vom Blatt weg. Die Punkte des Ansetzens (Startpunkt) und Wegnehmens (Zielpunkt) werden benötigt. Als Farbe können Sie auch eine der bekannten (siehe Kap. 4) Farbnummern angeben (0 bis 15). Allerdings sind hier Werte bis 255 erlaubt, wenn in einem Modus gearbeitet wird, der dies unterstützt.

Ein Beispiel zum leichteren Verständnis:

LINE (200, 100)-(400, 300), 12

Diese rote Linie (Farbcode 12) erstreckt sich vom Startpunkt X: 200, Y: 100 bis zum Endpunkt X: 400, Y: 300. Ein komplettes Beispiel, in dem auch Linien vorkommen, folgt im Zusammenhang mit CIRCLE weiter unten.

9.5. Kreise zeichnen

Zum Abschluss dieses kurzen Kapitels möchte ich noch CIRCLE erwähnen. CIRCLE ermöglicht es, - Überraschung - Kreise zu zeichnen. Dazu werden ein Startpunkt, ein Radius und ein Farbwert benötigt. Um wieder ein Beispiel aus dem "richtigen" Leben zu nennen: Wenn Sie mit einem Zirkel einen Kreis zeichnen, müssen Sie an einem Punkt einstechen, dieser Punkt entspricht dem Startpunkt (X/Y). Danach wählen Sie einen Radius, um zu bestimmen, wie groß der Kreis werden soll.

Die Syntax sieht folgendermaßen aus:

CIRCLE (X-Koordinate, Y-Koordinate), Radius, Farbe

Im abschließenden Grafikbeispiel wird die Verwendung von CIRCLE und LINE demonstriert. Nebenbei wird auch noch ein Hinweistext in roter Farbe auf dem Bildschirm ausgegeben.

CLS
SCREEN 12	' 640*480, 16 Farben
COLOR 12	' hellrot
PRINT "Eine Linie sowie ein Kreis werden gezeichnet ..."
LINE (50, 50)-(50, 400), 2
CIRCLE (500, 250), 100, 5
Vorheriges Kapitel Nächstes Kapitel