Ereignisbehandlung

Exkurs: Lambda-Ausdrücke

Um die Ereignisbehandlung genau zu verstehen, müssen wir wissen was Lambda Ausdrücke sind. Dazu musst Du wissen was ein Interface ist. Es ist hilfreich, wenn Du auch schon weißt, was eine innere Klasse ist. Ganz kurz erklärt ist eine innere Klasse eine Klasse, die innerhalb einer anderen Klasse definiert ist. Das kann Sinn machen, wenn Objekte einer Klasse nur innerhalb einer bestimmten Klasse benutzt werden müssen.

Du kannst diesen Abschnitt aber auch ganz überspringen und merkst Dir einfach, dass man z.B. mit button.setOnAction(event -> meineMethode()); die Ereignisbehandlung für einen Button definieren kann.

Login erforderlich

Du musst Dich einloggen, um alle Inhalte zu sehen.

Übung - Tippspiel

Gegeben ist die folgende Implementierung eines sehr einfachen Spiels, bei dem man so lange eine Zahl raten muss, bis man die richtige Zahl getippt hat. Es soll möglich sein die Zufallszahlen auf unterschiedliche Art zu erzeugen. Denkbar wären z.B. nur zufällige Primzahlen, zufällige Quadratzahlen etc. Im Beispiel sollen Zahlen von 0 bis 9 möglich sein. Zum Testen des Spiels soll auch eine Variante mit einer festen Zahl gespielt werden können.

Ergänze eine weitere Spielvariante, bei der z.B. nur zufällige Quadratzahlen möglich sind. Ergänze die Spielelogik etwas, so dass der Benutzer Hinweise bekommt wie z.B. "Du bist sehr nah dran" oder "Du hast zu hoch getippt".

Baue die Klasse Tippspiel so um, dass

  1. anonyme innere Klassen
  2. Lambda-Ausdrücke in vollständiger Form
  3. Lambda-Ausdrücke möglichst knapp

benutzt werden.

 

public interface Zufallszahlengenerator {
    int getZahl();
}


public class Tippspiel {

	Zufallszahlengenerator zg;

	Tippspiel() {
		zg = new SimpleZahlGenerator();
	}

	void eineRundeSpielen() {
		int zufallszahl = zg.getZahl();
		int tipp = new java.util.Scanner(System.in).nextInt();
		while (tipp != zufallszahl) {
			tipp = new java.util.Scanner(System.in).nextInt();
		}
		System.out.println("Richtig geraten!");
	}

	void testVorbereiten() {
		// Denkbar wäre hier auch völlig andere Verteilungen zu erstellen.
		zg = new KonstantZahlGenerator();
	}

	class SimpleZahlGenerator implements Zufallszahlengenerator {

		public int getZahl() {
			return new java.util.Random().nextInt(10);
		}
	}

	class KonstantZahlGenerator implements Zufallszahlengenerator {

		public int getZahl() {
			return 42;
		}
	}

	public static void start() {
		Tippspiel zahlenspiel = new Tippspiel();
		System.out.println("Jetzt eine richtige Runde spielen");
		zahlenspiel.eineRundeSpielen();

		System.out.println("Eine Runde mit der Testzahl spielen");
		zahlenspiel.testVorbereiten();
		zahlenspiel.eineRundeSpielen();
	}
}

BlueJ-Projekt des Tippspiels

Tippspiel.zip (4,6 KiB)