Hello Dart: Einführung in die Programmierung (Deutsch)

Teil 4: Variablen

Mit Schleifen haben wir gelernt, bestimmte Ereignisse zu wiederholen, solange eine Bedingung erfüllt ist. Nun möchten wir aber folgendes tun:

Der Spieler soll eine Spur von fünf Sternen legen.

Fünf Sterne

Dies wäre natürlich recht einfach, wenn wir putStar() und move() fünfmal aufrufen, jedoch wenig elegant. Schöner wäre es, wenn unser Spieler mitzählt, wie viele Sterne er bereits abgelegt hat. Damit der Spieler zählen kann, braucht er ein “Gedächtnis”, d.h. konkret einen Speicher. Beim Programmieren sind die Speicherplätze durch Variablen ansprechbar.

Zählen mit Variablen

var i;
i = 0;

while (i < 5) {
  putStar();
  move();

  i = i + 1;
}

Erklärungen

  1. Mit var i; wird Speicherplatz für eine Variable mit dem Namen i reserviert. Man sagt: Die Variable i wird deklariert.
  2. Durch i = 0; wird der Variable i der Wert 0 zugewiesen. Da es die erste Wertzuweisung für die Variable ist, sagt man auch: Die Variable i wird initialisiert.
  3. Deklaration und Initialisierung werden meistens zusammengefasst wie folgt:
    var i = 0;
  4. Für die Bedingung i < 5 wird der Vergleichsoperator < benutzt (weitere Vergleichsoperatoren siehe Tabelle weiter unten).
  5. Bei der Zuweisung i = i + 1; muss man zuerst den rechten Teil anschauen. Es bedeutet: “Nimm den aktuellen Wert von i, addiere 1 dazu und speichere den neuen Wert wieder unter dem Namen i ab.”

Weitere Hinweise zu Variablen

  • Es ist möglich, eine Variable mit einem endgültigen, unveränderlichen Wert zu versehen, d.h. sie zu einer Konstanten zu machen:
    const anzahl = 5;
    Dann könnte man im obigen Programmbeispiel while (i < anzahl) schreiben.
  • Variablen schreibt man mit einem Kleinbuchstaben, wie die Methodennamen.

Datentypen in Dart

In Dart gibt es ein paar vordefinierte Datentypen. Mit Datentypen gibt man an, was in eine Variable gespeichert wird. Diese Angaben sind in Dart freiwillig. Das heisst, man kann alle Variablen einfach mit var deklarieren, wie wir es oben gemacht haben. Ich empfehle aber, meistens den Datentyp anzugeben. Dies hilft Fehler früh zu erkennen, da Dart Hinweise geben wird, wenn wir versuchen einen falschen Datentyp in eine Variable zu speichern.

Merke: Alles, was in eine Variable gespeichert werden kann, wird in Dart als Objekt bezeichnet. Der Datentyp eines Objektes nennen wir eine Klasse. Klassen und Objekte sind die Grundelemente der objektorientierten Programmierung.

Später werden wir unsere eigenen Klassen erstellen. Jetzt schauen wir uns zuerst die Grunddatentypen von Dart an.

Für weitere Informationen zu den Grunddatentypen siehe Dart Up and Running - Chapter 2: Built-in types.

Typ Beschreibung Beispiel
int Ganze Zahlen 1, 2, -1233123
double Fliesskommazahlen 0.5, -333.234
String Text in einer beliebigen Länge. Text wird immer zwischen einfache oder doppelte Anführungszeichen gestellt. 'Ich bin ein Text' oder "Ich bin auch ein Text"
bool Ein Boolean ist ein Wahrheitswert, der entweder wahr oder falsch sein kann. true oder false
List Eine Sammlung von Objekten. Wird manchmal auch Array genannt. [1, 2, 3]
Map In einer Map kann man Objekte speichern als Schlüssel und Werte. { 'schlüssel-1': 'wert-1', 'schlüssel-2': 'wert-2' }

Vergleichsoperatoren

Folgende Operatoren können in Dart für Vergleiche verwendet werden. Das Ergebnis ist jeweils ein bool, das heisst entweder true oder false.

Operator Beschreibung Beispiel
== gleich k == 2
!= ungleich k != 12
> grösser als k > 67
< kleiner als k < 12
>= grösser als oder gleich k >= 45
<= kleiner als oder gleich k <= 23

Achtung: Der Vergleich auf “Gleichheit” hat immer zwei Gleichheitszeichen ==. Mit einem einzelnen Gleichheitszeichen = geschieht eine Zuweisung!

Arithmetische Operatoren

Zur Berechnung können folgende arithmetische Operatoren verwendet werden:

Operator Beschreibung Beispiel
+ Addition h = w + 34
- Subtraktion y = 3.4 – t
* Multiplikation z = h * 3.56
/ Division d = m / v
% Modulo (liefert den Rest der Division) count = w % 2

AUFGABE 4.01: Counting Stars

Sternenspur

Der Spieler soll von links nach rechts gehen und dabei die Sterne zählen.

Hinweise:

  1. Definieren und initialisieren Sie eine Variable, zum Beispiel mit
    int count = 0;
  2. Schreiben Sie darunter eine Schleife, in der die Variable immer um eins erhöht wird:
    count = count + 1;
  3. Die Variable sollte nur erhöht werden, wenn der Spieler auf einem Stern ist.
  4. Am Schluss soll der Spieler angeben, wie viele Sterne er gezählt hat. Mit ${count} können wir die Variable in einen Text einfügen:
    say('Ich habe ${count} Sterne gefunden.');
Gültigkeitsbereich von Variablen: Variablen sind immer nur innerhalb des Blockes (zwischen den geschweiften Klammern) gültig, in welchem sie deklariert wurden. Man kann sie auch ausserhalb der Funktionen deklarieren. Dann sind sie in der ganzen Klasse verfügbar, oder, falls sie sogar ausserhalb einer Klasse deklariert werden, sind sie überall verfügbar.

AUFGABE 4.02: Cleaning Up

Aufräumen

Der Spieler soll alle Sterne wegräumen.

Hinweise:

  1. Sie können den Baum verwenden, um herauszufinden, wann der Spieler am Ende angekommen ist mit einer Schleife while (!treeFront()) {...}.
  2. Entfernen Sie zuerst die Sterne auf der ersten Zeile.
  3. Drehen Sie am Rand und entfernen Sie die Sterne auf der zweiten Zeile.
  4. Führen Sie nun eine bool-Variable ein, damit sich der Spieler merkt, in welche Richtung er läuft, zum Beispiel so:
    bool goingRight = true;
  5. Mit dieser Variable können Sie nun herausfinden, ob der Spieler am rechten oder am linken Rand angekommen ist und entsprechend umdrehen muss. Ein bool kann wie folgt in einer Bedingung verwendet werden:
    if (goingRight) {...}
  6. Denken Sie daran, die neue Richtung in die Variable zu setzen, sobald sich der Spieler dreht:
    goingRight = false;
  7. Verbesserung: Damit der Code übersichtlicher wird, könnten Sie zwei Funktionen machen zum Umdrehen: turnAroundRight() und turnAroundLeft().

AUFGABE 4.03: Inverting

Invertieren

Die Welt hat eine quadratische Fläche und am Schluss einen Baum. Innerhalb der Fläche ist ein Muster aus Sternen gelegt, das vom Spieler invertiert (=umgedreht) werden soll. Achten Sie darauf, dass Ihr Code übersichtlich bleibt und lagern Sie allenfalls Teile in eigene Funktionen aus.

AUFGABE 4.04: Chessboard

Schachbrett

Die Welt hat eine quadratische Fläche und am Schluss einen Baum. Innerhalb der Fläche soll ein schachbrettartiges Muster aus Sternen gelegt werden.

AUFGABE 4.05 (schwierig): Tree Line

Baumreihe

In dieser Welt hat es verschiedene Baumreihen. Der Spieler soll nun die Länge (in Anzahl Bäumen) der längsten Baumreihe ermitteln und ausgeben. Zwischen den Baumreihen ist immer mindestens ein Feld Platz. Auf dem letzten Feld liegt ein Stern.


Wie weiter?

Fahren Sie weiter mit Teil 5: Funktionen


Quellen
Planet Cute Bilder stammen von Daniel Cook (Lostgarden.com), veröffentlicht unter CC BY 3.0.
Oleg Yadrov hat die “Planet Cute” Bilder weiterentwickelt und mir zur Verfügung gestellt. Optimiert wurden sie mit dem grossartigen TexturePacker.
Einige Übungen in Hello Dart sind inspiriert von Kara. Kara wurde entwickelt von Jürg Nievergelt, Werner Hartmann, Raimond Reichert und anderen.