NextMindAnmelden
ProgrammierenSpielgerüstSpickzettel

Viele Dinge merken

Arrays speichern feste Reihen; ArrayLists wachsen und schrumpfen - für Blöcke, Ziele und Projektile.

Das kannst du danach

0 von 5 abgehakt
  • Du kannst ein Array anlegen und mit einem Index einzelne Werte lesen und schreiben.
  • Du weißt, warum die Zählung bei 0 beginnt und was array.length bedeutet.
  • Du kannst ein Array mit einer Schleife füllen und durchgehen.
  • Du kennst den Unterschied zwischen einem Array (feste Größe) und einer ArrayList (wächst und schrumpft).
  • Du hast mehrere gleichartige Bauteile deines Spiels in einer einzigen Datenstruktur gesammelt.

Melde dich an, um deinen Stand zu speichern.

Vierzig Variablen wären zu viel

Am Ende des letzten Kapitels blieb eine Frage offen. Du kannst jetzt prüfen, ob ein Ball einen Block trifft. Aber eine Breakout-Mauer hat vierzig Blöcke, und jeder muss einzeln verschwinden können, wenn er getroffen wird — die anderen neununddreißig bleiben stehen.

Erst überlegen

Ohne ein neues Werkzeug: Wie würdest du dir merken, welcher von vierzig Blöcken noch da ist und welcher schon zerstört wurde?

Genau dieses Problem löst ein Array: eine einzige Variable, die sich nicht einen, sondern viele Werte merkt — durchnummeriert, damit eine Schleife darüber laufen kann.

Ein Array anlegen

boolean[] nochDa = new boolean[40];

Das legt Platz für 40 Werte an, alle vom selben Typ. Auf einen einzelnen Wert kommst du über seinen Index in eckigen Klammern — und die Zählung beginnt bei 0, nicht bei 1:

BeispielEin frisches Array
int[] hoehen = new int[5];

void setup() {
size(340, 160);
background(250);

fill(40);
textSize(16);
text("hoehen[0] ist " + hoehen[0], 20, 40);
text("hoehen.length ist " + hoehen.length, 20, 70);
}

Erst überlegen

int[] werte = {10, 22, 7, 45, 3}; Was liefert werte[2]?

Arrays

Füllen und durchgehen

Feste Werte gibst du direkt beim Anlegen an. Sollen sie erst berechnet werden — etwa zufällig —, füllst du sie mit einer Schleife:

BeispielZufällige Balken
int[] hoehen = new int[8];

void setup() {
size(360, 240);

for (int i = 0; i < hoehen.length; i++) {
  hoehen[i] = int(random(30, 180));
}
}

void draw() {
background(250);
noStroke();
fill(70, 130, 220);

for (int i = 0; i < hoehen.length; i++) {
  rect(20 + i * 40, 220 - hoehen[i], 30, hoehen[i]);
}
}

Zwei Schleifen mit demselben Muster for (int i = 0; i < hoehen.length; i++): Die erste füllt das Array einmalig in setup(), die zweite liest es bei jedem Bild wieder aus, um zu zeichnen. Das Array merkt sich die Werte dazwischen — bei fünf oder achtzig Elementen genau gleich.

Jetzt verbindest du das mit dem Abprall aus Kapitel 3. Statt einer einzigen x-Variablen bekommt jeder Ball seinen eigenen Platz im Array — und dieselbe Schleife bewegt und prüft sie alle:

BeispielFünf Bälle prallen unabhängig voneinander ab
int anzahl = 5;
float[] x = new float[anzahl];
float[] tempo = new float[anzahl];
float radius = 16;

void setup() {
size(400, 260);
for (int i = 0; i < anzahl; i++) {
  x[i] = random(radius, width - radius);
  tempo[i] = random(1, 4);
}
}

void draw() {
background(250);
noStroke();
fill(70, 130, 220);

for (int i = 0; i < anzahl; i++) {
  x[i] = x[i] + tempo[i];

  if (x[i] > width - radius || x[i] < radius) {
    tempo[i] = -tempo[i];
  }

  circle(x[i], 40 + i * 45, radius * 2);
}
}

Erst überlegen

Ohne Array bräuchtest du für fünf Bälle fünf eigene Variablenpaare (x1/tempo1, x2/tempo2, ...) und fünf fast identische Codeblöcke. Was ändert sich, wenn plötzlich 20 Bälle gebraucht werden?

Die Grenze eines Arrays

Ein Array hat eine Schwäche: Seine Größe steht fest, sobald du es mit new int[5] anlegst. Für „vierzig Blöcke, die die ganze Zeit da sind" reicht das — die Anzahl ändert sich ja nie, nur ihr Zustand (noch da oder zerstört).

Für „Projektile, die beim Schießen entstehen und beim Verlassen der Fläche wieder verschwinden" reicht ein Array nicht mehr, denn dort ändert sich die Anzahl laufend. Dafür gibt es eine zweite Datenstruktur: die ArrayList. Sie funktioniert wie ein Array, das mitwächst und mitschrumpft.

ArrayList: wächst und schrumpft

ArrayList<PVector> projektile = new ArrayList<PVector>();

void mousePressed() {
  // Ein neues Projektil entsteht - die Liste wird um eins laenger.
  projektile.add(new PVector(mouseX, mouseY));
}

void draw() {
  background(250);

  for (int i = 0; i < projektile.size(); i++) {
    PVector p = projektile.get(i);
    p.y = p.y - 4;   // fliegt nach oben
    circle(p.x, p.y, 12);
  }
}
MethodeWirkung
liste.add(element)hängt ein Element hinten an - die Liste wird länger
liste.get(i)liefert das Element an Index i
liste.size()Anzahl der Elemente gerade jetzt
liste.remove(i)entfernt das Element an Index i - die Liste wird kürzer

Erst überlegen

Fünf Blöcke sollen einzeln zerstörbar sein, ihre Anzahl ändert sich aber nie. Was passt besser: Array oder ArrayList?

AufgabenBaue Arrays in dein Spiel ein

Dein SpielMehrere Bauteile auf einmalin der Processing-IDE

  • Breakout: Ersetze die Mauer aus Kapitel 4 durch ein boolean[] nochDa — ein Eintrag pro Block. Trifft der Ball einen Block, setzt du den passenden Eintrag auf false, und die Zeichenschleife lässt ihn ab da aus.
  • Aim Trainer: Statt eines einzelnen Ziels ein Array mit mehreren Zielpositionen (float[] zx, float[] zy). Prüfe für jedes einzeln mit dist(), ob es getroffen wurde.
  • Pong: Optional, als Bonus: Lass mehrere Bälle gleichzeitig spielen. Dafür brauchst du wie im Beispiel weiter oben je ein Array für Position und Tempo.

Arbeite in der Processing-IDE weiter — dort wächst dein eigentliches Projekt. Wenn du auch die ArrayList ausprobieren willst, ist dort der richtige Ort dafür.

Sichere deinen Code zusätzlich selbst — auf einem Stick oder in deiner Cloud — und lade ihn am Ende auch in den Moodle-Kurs hoch.

Übung 6.1Level 1Fünf zufällige Höhen

Fülle das Array hoehen beim Start mit fünf Zufallswerten und zeichne für jeden einen Balken.

Dein VersuchProcessing

Tipp: Strg + Eingabe führt den Code aus.

Übung 6.2Level 2Die Summe bilden

Addiere alle Werte im Array zu einer Summe auf und zeig sie mit text() an. Das Ergebnis sollte 66 sein.

Dein VersuchProcessing

Tipp: Strg + Eingabe führt den Code aus.

Übung 6.3Level 3Der größte Wert

Finde den größten Wert im Array, ohne ihn vorher von Auge abzulesen. Das Ergebnis sollte 47 sein.

Dein VersuchProcessing

Tipp: Strg + Eingabe führt den Code aus.

Übung 6.4Level 3Jeder Block einzeln

An Position 2 fehlt eine Lücke in der Blockreihe — der Block dort ist schon zerstört. Sorg dafür, dass nur die Blöcke gezeichnet werden, die noch true in nochDa stehen haben. Das ist genau der Mechanismus hinter Breakout.

Dein VersuchProcessing

Tipp: Strg + Eingabe führt den Code aus.

Übung 6.5Level 4Viele Bälle prallen ab

Aus einem Ball sollen anzahl Bälle werden, jeder mit eigener Position und eigenem Tempo. Ersetze die einzelnen Variablen durch Arrays.

Dein VersuchProcessing

Tipp: Strg + Eingabe führt den Code aus.

Übung 6.6★ SternaufgabeStern: Das Array verschieben

Verschiebe jeden Wert im Array um einen Platz nach links — der erste Wert wandert dabei ganz nach hinten. Aus {1, 2, 3, 4, 5} wird {2, 3, 4, 5, 1}. Kein Wert darf dabei verloren gehen.

Dein VersuchProcessing

Tipp: Strg + Eingabe führt den Code aus.

Sternaufgabe. Die zählt nicht zum Fortschritt — du verlierst also nichts, wenn du sie auslässt. Schaffst du sie, gibt es dafür einen Stern.

Was noch fehlt

Jetzt hast du mehrere Ziele, mehrere Blöcke, mehrere Bälle — alle sauber in Arrays organisiert, statt in vierzig einzelnen Variablen. Dein Spiel reagiert bisher aber nur auf Maus und Klick.

Für Pong und Breakout fehlt noch die Tastatur — ein Schläger, der sich mit den Pfeiltasten bewegt, statt der Maus zu folgen. Und für ein fertiges Spielgefühl fehlen Bilder und Sound. Genau darum geht es im nächsten Kapitel.

Sitzt das?

1 / 5

Bei welchem Index steht das ERSTE Element eines Arrays?