Informatik II Übung 7 Florian Scheidegger florsche@student.ethz.ch Folien mit freundlicher Genehmigung adaptiert von Gábor Sörös und Simon Mayer gabor.soros@inf.ethz.ch, simon.mayer@inf.ethz.ch 18.04.2013 Informatik II 1
Ist Schlüsselwort this nötig? public class Triangle extends GeometricObject { private int base; private int height; public int area() { return (this.base*this.height)/2; } public Triangle(int base, int height) { this.base = base; this.height = height; }
4
Tipps zu U7.A1 Generics Object U6 Generics Alle Klassen erben von Object (abstract base class) MyType cast beim Ausnehmen aus der Kontainer (hier List) MyType Elem = (MyType) Kollektion.getNext(); sowas kann in Laufzeit zur ClassCastException führen. Besser so: Object obj = Kollektion.getNext(); if( obj instanceof MyType ) dosomething( (MyType)obj ); mylist MyType next MyType next MyType next 5
Tipps zu U7.A1 Generics U7 Generics Kollektion mit Java Generics (generic class) class MyPair<T> { } public T first, second; Ein Objekt pair vom Typ MyPair<Float> enthält zwei Float-Referenzen: pair.first und pair.second Ein Objekt pair vom Typ MyPair<Int> enthält zwei Int-Referenzen: pair.first und pair.second Vorteil von generics: Typenprüfung durch Compiler auch bei der Aufnahme in den Kontainer d.h. kein dynamic cast nötig bei Ausnahme 6
Tipps zu U7.A1 Generics ArrayList Container Zweifach geschachtelt: ArrayList enthält Gruppen ArrayList<ArrayList<Student>> groups; Gruppen enthalten Studenten ArrayList<Student> group; Filter: Testat erhalten kann 7
Tipps zu U7.A1 Generics a. FilterFactory und (leere) IFilter-Implementierung b. Input: ArrayList von Gruppen, die eigentlich ArrayLists von Studenten sind c. Output: ArrayList von Studenten, die das Testat erhalten. d. Implementieren von filterraw e. Keine Generics: ArrayList als Raw Type (Compilerwarnungen) f. Alle Studenten rausfiltern, die nicht genug Punkte fuer das Testat haben... g. Beim Ausnehmen zuerst auf ArrayList, dann auf Student casten h. Implementieren von filtergeneric i. ArrayList<T> zeigt an, was darin gespeichert ist j. Type checking beim Hinzufuegen zur Liste k. ArrayList<T> liefert direkt Objekte des korrekten Typs (kein casting mehr nötig) 8
Tipps zu U7.A2 Binäre Bäume Jeder Knoten enthält Zeiger auf: W Linker Nachfolger Rechter Nachfolger (Vater) Rekursive Traversierung: L Pre-order: W-L-R In-order: L-W-R R Post-order: L-R-W 9
Tipps zu U7.A2 Warum nur Binäre Bäume? Allgemeine Bäume können auch als Binärbaume representiert werden: The binary tree can be thought of as the original tree tilted sideways, with the black left edges representing first child and the blue right edges representing next sibling.... This is called left-child-right-sibling binary tree (LCRS tree) http://en.wikipedia.org/wiki/binary_tree 10
8 Tipps zu U7.A2 Binäre Suchbäume 3 10 Struktur: Die Knoten enthalten Datenelemente, oder Zeigers auf Datenelemente (record) Jeder Knoten hat auch ein Schlüsselattribut (key) Die Menge der Schlüsselattribute ist total geordnet (a b) Suchen erfolgt durch Schlüsselvergleich 1 6 14 4 7 13 Für jeden Knoten mit Schlüsselattribut s gilt: Alle Schlüssel im linken Unterbaum sind kleiner als s Alle Schlüssel im rechten Unterbaum sind grösser als s Die Unterbäume sind auch binäre Suchbäume Siehe Elementare Methoden in Folien von Vorlesung 7! Was passiert wenn mehrere Objekte mit dem selben Schlüssel existieren? 11
Tipps zu U7.A2 Binäre Suchbäume Teilaufgabe a (von Hand) Löschen, ersetzen durch kleinstes Element des rechten Teilbaums Teilaufgabe b Implementation eines binären Suchbaums IBinarySearchTreeUtils<T> UtilsFactory.create() soll ein Utils für den Typ String erzeugen new MyTreeUtils<String>() UnlinkSmallestResult<T> enthält das Resultat aus unlinksmallest(): das kleinste Element und den Restbaum (also ein Paar) 12
Tipps zu U7.A2 Binäre Suchbäume Methoden zu implementieren: height, isleaf, hasonechild preorder, inorder, postorder insert find unlinksmallest & remove 13
Tipps zu U7.A3 Reversi Mit dieser Aufgabe startet eine Serie, die zum Ziel hat, ein Reversispieler zu implementieren. Spielregeln und weitere Infos: http://www.vs.inf.ethz.ch/edu/fs2012/i2/reversi Login für reversi-papers: username: i2bib password: reversi 14
Tipps zu U7.A3 Reversi Reversi-Turnier am Ende des Semesters Super Preise! Im Falle von Probleme mit dem Framework: 1. Dokumentation 2. Ich 3. Simon Mayer (simon.mayer@inf.ethz.ch) 15
Tipps zu U7.A3 Reversi Zuerst sollen die Grundprinzipien des Spiels implementiert werden Später werden Strategien entwickelt, die das Spiel des Computer-Players verbessern sollen Optimale Suche (MinMax, Alpha-Beta, ) Spieltheorie 16
Tipps zu U7.A3 Reversi Sourcen zu finden auf der Reversi-Webseite Beachtet die Installationsanleitung (Eclipse >3.2) HumanPlayer in u7a3 Trick: Macht euch erst eine Abstrakte Klasse (PlayerBase o.ä.) Implementiert darin eure allgemein nützliche Helferfunktionen für eure verschiedenen Players 17
Tipps zu U7.A3a Spielt! Framework aufsetzen Spielt eine Partie gegen euren Teammate (oder euch selbst) Snapshot schicken 18
Tipps zu U7.A3b ReversiPlayer package reversi; public interface ReversiPlayer { void initialize(int mycolor, long timelimit); Coordinates nextmove(gameboard gb); } package randoomteam; public abstract class PlayerBase implements ReversiPlayer { private int m_color = 0; private long m_timeout = 0; protected final int getcolor() { return m_color; } protected final long gettimout() { return m_timeout; } protected abstract void foo(); } package randoomteam; public class RandomPlayer extends PlayerBase { protected void foo() { } } 19
Tipps zu U7.A3b RandomPlayer Programmiert einen Computerspieler, der zufällig einen gültigen Zug auswählt Mögliche Strategie (naiv) Zug wird erst zufällig gewählt Dann wird überprüft, ob er gültig ist oder nicht wenn ja --> return wenn nein -->? Mögliche Strategie In einem Array alle möglichen Züge markieren Zufällig einen Zug aus diesem Array wählen extrem viel effizienter GameBoard.checkMove() Standardansatz für später Züge bewerten 20
viel Spass! 21