Schrittweise Verfeinerung
Schrittweise Verfeinerung
Schrittweise Verfeinerung
Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
Mag. iur. Dr. techn. Michael Sonntag<br />
Softwareentwicklung<br />
<strong>Schrittweise</strong> <strong>Verfeinerung</strong>, Programmieren üben:<br />
Tic-Tac-Toe in Raten<br />
E-Mail: sonntag@fim.uni-linz.ac.at<br />
http://www.fim.uni-linz.ac.at/staff/sonntag.htm<br />
Institut für Informationsverarbeitung und<br />
Mikroprozessortechnik (FIM)<br />
Johannes Kepler Universität Linz, Österreich<br />
© Michael Sonntag 2004
?<br />
? ?<br />
Fragen?<br />
Bitte gleich stellen!<br />
?<br />
?<br />
?<br />
© Michael Sonntag 2004
<strong>Schrittweise</strong> <strong>Verfeinerung</strong><br />
• Größere Programme sind nicht auf einmal lösbar<br />
Die Komplexität ist einfach zu hoch!<br />
• Daher: Zerlegen in Teilaufgaben, diese dann wieder zerlegen, ....<br />
• Bis die Teilaufgaben so klein sind, daß sie einfach<br />
ausprogrammiert werden können<br />
Typischerweise: Bis zu einzelnen Methoden herab (siehe später)<br />
• Warum: Siehe Diagramm!<br />
c<br />
Komplexität<br />
<strong>Schrittweise</strong> <strong>Verfeinerung</strong><br />
(Top-down)<br />
1. Zerlegen der Gesamtaufgabe in Teilaufgaben<br />
Diese müssen einfacher sein<br />
Jeder Teil muß in sich abgeschlossen sein<br />
» Mehr "Beziehungen" innerhalb als außerhalb<br />
2. Implementieren der Gesamtaufgabe mittels der Teile<br />
"Zusammensetzen der Puzzleteile"<br />
Kontrolle, ob auch alles mittels der geplanten Teile realisiert<br />
werden wird können<br />
Eingeschränkter Test ev. bereits möglich (Prototyp)<br />
3. Implementieren der Teilaufgaben<br />
Entweder wieder verfeinern oder tatsächlich programmieren<br />
4. Zusammenbau, Abschlußtest, Fehlerbehebung<br />
Michael Sonntag <strong>Schrittweise</strong> <strong>Verfeinerung</strong> 4
<strong>Schrittweise</strong> <strong>Verfeinerung</strong><br />
(Bottom-up)<br />
• Die Schritte zwei und drei werden vertauscht<br />
Also zuerst die Teilaufgaben implementieren<br />
Und anschließend mit den fertigen Teilen durch Zusammenbauen<br />
die Gesamtaufgabe lösen<br />
• Beides ist möglich, je nach Vorliebe bzw. Eignung oder<br />
Anforderungen auswählen!<br />
Innerhalb von kleineren Teilen: Eher Bottom-up<br />
Größere Gesamtprogramme und Aufteilung in Klassen oder<br />
Methoden: Eher Top-down<br />
• Bottom-up: Keine Vorkontrolle auf Vollständigkeit, daher muß die<br />
Zerlegung sehr sorgfältig erfolgen. Dafür kann das Grundgerüst<br />
einfacher erstellt werden, da z. B. die gesamten nötigen<br />
Variablen für Schleifen, etc. dann schon genau bekannt sind<br />
Michael Sonntag <strong>Schrittweise</strong> <strong>Verfeinerung</strong> 5
Tic Tac Toe (in Raten):<br />
Das Spiel<br />
O<br />
O<br />
X<br />
O<br />
X<br />
O<br />
X<br />
X<br />
X<br />
X<br />
X<br />
X<br />
O<br />
O<br />
X<br />
O<br />
X<br />
X ... Spieler 1<br />
O X<br />
⇒ Spieler 2 gewinnt<br />
O ... Spieler 2<br />
O<br />
X<br />
Gewinnpositionen (Beispiele)<br />
* * * *<br />
*<br />
*<br />
*<br />
*<br />
*<br />
Unentschieden<br />
X X O<br />
O X X<br />
X O O<br />
Michael Sonntag <strong>Schrittweise</strong> <strong>Verfeinerung</strong> 6
<strong>Schrittweise</strong> <strong>Verfeinerung</strong><br />
Beispiel Tic Tac Toe<br />
1) Tic Tac Toe 2) Start<br />
Spielen<br />
3)<br />
Begrüßung und<br />
Hinweise (z. B.<br />
Regeln) ausgeben<br />
3)<br />
Ende<br />
Eingabe des nächsten Zugs<br />
Prüfen der Eingabe<br />
Hauptspielschleife<br />
Zug bearbeiten<br />
Ausgabe des<br />
Gewinners und<br />
Verabschiedung<br />
Michael Sonntag <strong>Schrittweise</strong> <strong>Verfeinerung</strong> 7<br />
3)<br />
TicTacToeUI<br />
Weiter verfeinern<br />
Direkt implementieren
<strong>Schrittweise</strong> <strong>Verfeinerung</strong><br />
Beispiel Tic Tac Toe<br />
4)<br />
Solange kein Abbruch, kein<br />
Gewinn und ein Zug möglich ist<br />
N<br />
Prüfen ob Zug erlaubt<br />
Fehlermeldung<br />
OK?<br />
Zug durchführen<br />
Spielfeld ausgeben<br />
J<br />
Gewonnen?<br />
Eingabe nächster Zug<br />
Prüfen der Eingabe<br />
J<br />
N<br />
TicTacToePrint<br />
TicTacToeWin<br />
Michael Sonntag <strong>Schrittweise</strong> <strong>Verfeinerung</strong> 8
Tic Tac Toe in Raten: Teil 1<br />
Ausgabe des Spielfeldes<br />
• Schreiben Sie ein Programm, das das Spielfeld des Tic Tac Toe-<br />
Spiels (3x3 Felder) auf dem Bildschirm ausgibt. Hierbei sollen die<br />
"Spielsteine" als Konstanten definiert werden<br />
• In diesem Programm soll das Spielfeld statisch initialisiert werden<br />
• Achten Sie auf eine ansprechende Ausgabe!<br />
• Hinweis:<br />
final static byte PLAYER_1=1;<br />
final static byte PLAYER_2=PLAYER_1+1;<br />
static byte[][] field={ ? ? ? };<br />
final static ??? PLAYER_1_TOKEN= ???;<br />
final static ??? PLAYER_2_TOKEN= ???;<br />
TicTacToePrint.java<br />
Michael Sonntag <strong>Schrittweise</strong> <strong>Verfeinerung</strong> 9
Tic Tac Toe in Raten: Teil 2<br />
Gewinner-Feststellung<br />
• Schreiben Sie ein Programm, das für das Tic Tac Toe-Spiel<br />
feststellt, ob einer der Spieler gewonnen hat oder nicht<br />
• Ein Gewinn ist durch drei gleiche Steine in einer Reihe, einer<br />
Spalte oder einer Diagonale erkennbar<br />
• Auch hier soll das Spielfeld statisch initialisiert werden<br />
• Das Ergebnis soll in der Variable "win" vom Typ "byte"<br />
gespeichert werden<br />
• Ist keine Aussage möglich, soll die Antwort "Unentschieden" sein<br />
• Verwenden Sie dieselben Definition wie im vorigen Programm<br />
und überlegen Sie, ob Sie zusätzliche für den Inhalt der<br />
Gewinnvariable benötigen!<br />
TicTacToeWin.java<br />
Michael Sonntag <strong>Schrittweise</strong> <strong>Verfeinerung</strong> 10
Tic Tac Toe in Raten: Teil 3<br />
Benutzerschnittstelle<br />
• Schreiben Sie ein Programm, das die Benutzerführung für das<br />
Tic Tac Toe Spiel durchführt. Dies beinhaltet:<br />
Ausgabe einer Überschrift, welcher Spieler an der Reihe ist<br />
Einlesen des nächsten Zuges<br />
Mitzählen der Gesamtanzahl an Zügen<br />
Umrechnen des Zuges in Koordinaten des Spielfelds (0..2,0..2)<br />
Abbruch bei Eingabe einer falschen Koordinate oder von 0<br />
• Wenn die Gesamtanzahl der Züge 9 ist, soll das Programm<br />
beendet werden (Keine Ausgabe einer Meldung)<br />
In diesem Fall keine neuen Koordinaten mehr einlesen!<br />
• Verwenden Sie auch hier wieder dieselben Definitionen<br />
Michael Sonntag <strong>Schrittweise</strong> <strong>Verfeinerung</strong> 11
Tic Tac Toe in Raten: Teil 3<br />
Benutzerschnittstelle<br />
• Das Spielfeld wird hier nicht benötigt: Keine Züge durchführen,<br />
ausgeben, auf Gewinn prüfen, etc.<br />
• Die Koordinatieneingabe soll wie auf dem Ziffernblock eines<br />
Telefones oder einer Tastatur erfolgen:<br />
0<br />
1<br />
2<br />
7 8 9<br />
4 5 6<br />
1 2 3<br />
0 1 2<br />
TicTacToeUI.java<br />
Michael Sonntag <strong>Schrittweise</strong> <strong>Verfeinerung</strong> 12
Tic Tac Toe in Raten: Teil 4<br />
Zusammenbau<br />
• Bauen Sie ihre vorherigen Programme zusammen, sodaß man<br />
das Spiel Tic Tac Toe komplett spielen kann<br />
Ganz außen: Benutzerschnittstelle<br />
Innen einbauen:<br />
» Prüfen ob Feld leer (wenn nein: Fehlermeldung und Neueingabe der<br />
Koordinaten)<br />
» Spielstein setzen<br />
» Ausgeben des Spielfeldes (Programm!)<br />
» Prüfen ob jemand gewonnen hat (Programm!)<br />
Am Ende: Ergebnis ausgeben (Gewinn / Unentschieden)<br />
• Achtung: Jetzt 4 Zustände (Spieler 1 hat gewonnen, Spieler 2 hat<br />
gewonnen, unentschieden, Spiel läuft noch)!<br />
TicTacToe.java<br />
Michael Sonntag <strong>Schrittweise</strong> <strong>Verfeinerung</strong> 13