Inhaltsverzeichnis

Kapitel 8: Felder (Arrays)

Merke
Ein Feld (englisch: array) ist ein Speicherbereich, der viele gleichartige Objekte bzw. Werte enthält.

Vorsicht: Felder werden von 0 an durchnummeriert. Bei obigem Beispiel enthält das Feld also die vier Variablen noten[0], noten[1], noten[2] und noten[3].

    public ArrayTest(){
 
        // Array deklarieren und Speicherplatz reservieren:
        int[] noten = new int[6];
 
        // Werte der Elemente im Array setzen:
        noten[0] = 1;
        noten[1] = 2;
        noten[2] = 4;
        noten[3] = 3;
        noten[4] = 6;
        noten[5] = 5;
 
        // Ausgabe des 3. Elements:
        System.out.println(noten[2]);
 
        // Ändern des 3. Elements
        noten[2] = 3;
 
        System.out.println(noten[2]);
 
        // Ausgabe der Anzahl der Elemente:
        System.out.println(noten.length);
 
        // Berechne den Mittelwert aller Noten
        int i = 0;
        double summe = 0;
 
        while(i < noten.length){
 
            summe = summe + noten[i];
 
            i++;
        }
 
        double mittelwert = summe/noten.length;
 
        System.out.println("Mittelwert: " + mittelwert);
 
 
    }

Aufgaben

  1. Lagere die Mittelwertberechnung in eine eigene Methode aus!
  2. Schreibe eine Methode, die die beste Note im Feld noten ermittelt und zurückgibt!

Lösung

    private double mittelwert(int[] notenliste){
        int i = 0;
        double summe = 0;
 
        while(i < notenliste.length){
            summe = summe + notenliste[i];
            i++;
        }
 
        return summe/notenliste.length;
 
    }
 
    private double besteNote(int[] notenliste){
 
        int beste = 6;
 
        for(int i = 0; i < notenliste.length; i++){
            if(notenliste[i] < beste){
                beste = notenliste[i];
            }
        }
 
        return beste;
    }

Anwendung: Einfache Particle Engine

Hier die Klasse für die Partikel:

import sge.Kreis;

public class Particle {

    private Kreis k;
    private double vx, vy;  // Geschwindigkeit in x- bzw. y-Richtung

    public Particle(double x, double y, double vx, double vy){
        this.vx = vx;
        this.vy = vy;

        k = new Kreis(x, y, 7);
        k.setFuellfarbe("gelb");
        k.setFuellfarbeAlpha(200);  // leicht durchsichtig
    }

    public void zeitschritt(){
        k.verschieben(vx, vy);
        vy += 0.04;
        if(vy > 0){
            k.setFuellfarbe("orange");
            k.setFuellfarbeAlpha(128);
        }
    }

    public boolean istAußerhalbDesFensters(){
        return k.istAußerhalbDesFensters();
    }

    public void vernichten() {
        k.vernichten();
    }
}

Die Partikel werden von der Klasse ParticleEmitter erzeugt und im Feld particles abgelegt. Alle 10 ms wird die Position jedes Partikels neu berechnet. Falls der Partikel das Fenster verlässt, wird er vernichtet und, seine Objektreferenz aus dem Feld particles entfernt und dafür ein neuer Partikel erzeugt.
Hier die Klasse ParticleEmitter:

import sge.Fenster;
import sge.Timer;
import sge.TimerListener;
 
public class ParticleEmitter implements TimerListener {
 
    // Wir speichern alle Partikel in einem Feld, damit wir
    // später alle 10 ms die Positionen aller Partikel neu berechnen 
    // und überflüssige Partikel entfernen können:
    private Particle[] particles = new Particle[200];
 
    // Objektreferenz aufs Fenster, damit wir dessen Größe ermitteln können
    private Fenster f;
 
    public ParticleEmitter(){
 
        f = new Fenster(); // Fenster öffnen
 
        // Der Timer sorgt dafür, dass timerSignalVerarbeiten alle 10 ms aufgerufen wird:
        Timer timer = new Timer(this, 10);
        timer.start();
 
    }
 
    @Override
    public void timerSignalVerarbeiten() {
 
        // Falls es im Feld particles eine Leerstelle (Wert == null) gibt, erzeuge einen neuen 
        // Partikel und lege seine Objektreferenz dort ab.
        for(int i = 0; i < particles.length; i++){
            if(particles[i] == null){
                Particle particle = new Particle(f.getBreite()/2, f.getHoehe() - 20,
                        Math.random()*10.0 - 5, -5 - Math.random() * 5);
                particles[i] = particle;
                break;
            }
        }
 
        // Für alle Partikel im Feld particles: Ändere die Position und
        // entferne den Partikel, falls er sich aus dem Fenster herausbewegt hat:
        for(int i = 0; i < particles.length; i++){
 
            if(particles[i] != null) {
 
                particles[i].zeitschritt();
 
                if(particles[i].istAußerhalbDesFensters()){
                    particles[i].vernichten();
                    particles[i] = null;
                }
 
            }
 
        }
 
    }
}

Hier noch der Code der Starterklasse:

public class ParticleEmitterStarter {

    public static void main(String[] args) {
        new ParticleEmitter();
    }

}