Android will doch nur spielen Ein Spieleframework stellt sich vor 1
Agenda Motivation Eine allgemeine Spieleschnittstelle Reguläre Brettspiele TicTacToe Visualisierung und Steuerung Spieleagenten Weitere Spielideen 2
Motivation Definition eines Frameworks: Programmgerüst Wiederverwendbare Komponenten i.d.r. objektorientiert Möglichst generisch Gründe für ein Framework: Häufig auftretenden Code nur einmal implementieren Verwendung von Standards Reduzierung von Fehlern Optimierung der Qualität Wissenstranfer 3
Eine allgemeine Spieleschnittstelle (I) Beschränkung auf Taktikspiel Beispiel: Mühle Dame TicTacToe VierGewinnt Generische Algorithmen langsam verfeinern 4
Eine allgemeine Spieleschnittstelle (II) Gemeinsamkeiten: Endlich viele Zugmöglichkeiten Zu einer Zeit ein Spieler an der Reihe Spielsituation nach jedem Zug vorberechenbar Spielende: Sieg oder keine weiteren Züge mehr möglich Spielsituation bewertbar Dennoch viele Unterschiede: Art der Züge Art des Spielfeldes 5
Eine allgemeine Spieleschnittstelle (III) Höchste Abstraktionstufe: Schnittstelle Game mit generischem Type für Züge Angebotene Methoden: Ermittlung der augenblicklich erlaubten Spielzüge Ausführung eines Spielzugs Ermittlung des Spielers, der an der Reihe ist Ermittlung des wartenden Spielers Überprüfung auf eine das Spiel beendende Situation Überprüfung ob ein Spieler gewonnen hat Auswertung der augenblicklichen Spielsituation 6
Reguläre Brettspiele (I) Schnittstelle bislang für alle Spiele gültig Jetzt Einschränkung: Rechteckiges Spielfeld Eindeutig identifizierbare Felder Spielzug besteht aus dem Setzen einer Marke auf ein Feld Beschränkung auf 2 Spieler Jetzt ausgeschlossene Spiele: Mühle Dame 7
Reguläre Brettspiele (II) Neue Methoden: Ermittlung der Anzahl der Reihen und Spalten Ermittlung einer ID für Spieler 1, 2 und für leere Felder Ermittlung der Situation an einem bestimmten Punkt Veränderung der Situation an einem bestimmten Punkt 8
Abstrakte Implementierung eines regulären Spiels (I) Erste generische Implementierung einiger Methoden Vorgehen ohne konkretes Spiel Weiterhin abstrakt, um Allgemeingültigkeit zu bewahren Implementiert außerdem Cloneable Zeigt an, dass Objekt kopiert werden kann Methode clone() steht zur Verfügung 9
Abstrakte Implementierung eines regulären Spiels (II) Implementierte Methoden: Klassenkonstruktor Ermittlung der Spieler / leeren IDs Ermittlung des augenblicklich aktiven Spielers Ermittlung des nächsten Spieler Ermittlung des vorigen Spielers Ermittlung der Anzahl der Reihen des Spielfeld Ermittlung der Anzahl der Spalten des Spielfeld Ermittlung der Situation an einem bestimmten Punkt Überprüfung ob ein Spieler gewonnen hat Überprüfung ob ein Spieler vorbei ist 10
Warum Cloneable? Spielzug erzeugt neuen Spielzustand Daher eine Kopie des aktuellen Spielzustandes anlegen clone aus Object erzeugt komplette Kopie eines Objektes TODO: implements Cloneable Achtung: Nur flache Kopien werden erzeugt! Keine Kopie von Referenzen! In diesem Fall: Keine Kopie des Spielfeldes Daher: @Override public AbstractRegularGame clone() 11
Eigene clone() Methode 1. super.clone() 2. clone() auf Spielfeld 3. Da Spielfeld zweidimensional: Anwendung von clone() auf innere Komponente 4. CloneNotSupportedException abfangen 12
Abstrakte Implementierung eines regulären Spiels (III) Weiterhin abstract: setatposition evalstate wins nomoremove domove moves 13
Einschub: Klasse für Spielzüge Idee: Ein Zug besteht aus einem x und y Wert Type der Werte allgemein halten Unsere Klasse beinhaltet: Zwei Werte vom Type A und B Konstruktor zum Erzeugen eines Paars Getter und Setter für die beiden Werte 14
TicTacToe Spielfeld der Dimension 3 x 3 Bedingung für Sieg: 3 Steine vertikal, horizontal oder diagonal anordnen Zug ist ein Paar mit Type byte extends AbstractRegularGame<Pair<Byte, Byte>> Standardkonstruktor mit 3 x 3 Spielfeld 15
TicTacToe Implementierung der Methoden (I) Methode zum Setzen eines Steins delegiert an domove Methode zur Ermittlung der erlaubten Spielzüge erzeugt LinkedList besucht alle Zeilen und Spalten liefert Felder mit Besitzer NONE Methode zum Ausführen eines Zugs kopiert das Spielfeld wechselt aktiven Spieler belegt Feld erhöht die Anzahl der getätigten Züge 16
TicTacToe Implementierung der Methoden (II) Auswertung des Spielzustandes: Spiel beendet, wenn Movescounter = Zeilen * Spalten Spiel gewonnen, wenn eine Horizontale, Vertikale oder Diagonale besetzt Je eine Methode für Horizontale und Vertikale Zwei Methoden für Diagonalen Spielzustand evaluieren: Naive Implementierung Sieg wird hoch bewertet Niederlage tief Alles andere neutral 17
Visualisierung und Steuerung Implementierung mit Swing Ableitung eines JPanel-Objekts Steuerung mit der Maus Neuen Listener für Mausklicks definieren AWT und Swing würden den Rahmen des Workshop sprengen Aber: Komponenten wurden im Framework umgesetzt 18
Spieleagenten Implementierung einer KI Computer bewertet alle Züge und wählt besten aus Aufbau von Spielbäumen Min-Max Suche: Werte alle Züge bis Spielende aus Wähle Pfad mit größter Erfolgsaussicht Besser: Alpha-Beta Suche: Bestimme für Teilbäume maximalen Wert, der mindestens erzielt wird Untersuche nur besseren Teilbaum 19
Weitere Spielideen Im Framework enthalten: TicTacToe Vier gewinnt Des weiteren vorstellbar: Othello (Reversi) 8-Damen 20
Vier Gewinnt Benötigte Anpassungen: Größeres Spielfeld Spieler kann bei Zügen nur noch x-wert angeben Prüfung auf Sieg deutlich komplexer Bewertung der Spielzüge komplexer KI muss erheblich verbessert oder unterstützt werden 21