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:
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:
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:
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);
}
}
| Methode | Wirkung |
|---|---|
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 auffalse, 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 mitdist(), 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.
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.
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.
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.
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.
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.
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 / 5Bei welchem Index steht das ERSTE Element eines Arrays?