FB18 - Das Forum für Informatik

fb18.de / Bachelorstudieng / PM Praktische Informatik

SE1 Aufgabe 5.2.6

SE1 Aufgabe 5.2.6 2007-11-25 16:02
Anonymer User
Ich stehe bei obiger Aufgabe völlig auf dem Schlauch! Hat jemand einen dezenten Tipp für mich?

Danke vorab!

RE: SE1 Aufgabe 5.2.6 2007-11-25 18:28
Anonymer User
wäre gut wenn die die aufgabe auch posten könntest oder sagen worum es geht. dann könnten dir leute die nicht se1 belegen auch helfen.

RE: SE1 Aufgabe 5.2.6 2007-11-25 18:45
Anonymer User
5.2.6 In besetzePosition muss jetzt nur noch darauf reagiert werden, wenn ein Spieler gewonnen hat. Fügt hier eine ähnliche Anweisung hinzu, die den aktuellen Spieler zum Gewinner erklärt.
Das eigentliche Erkennen der Gewinnsituation ist noch nicht implementiert. Für das Erkennen von drei Positionen in einer Reihe, die der aktuelle Spieler besetzt hat, ist aber bereits eine leere Methode aktuellerSpielerBesitzt vorgegeben, die ihr sinnvoll implementieren sollt.
Nun müsst ihr in der Methode hatAktuellerSpielerGewonnen nur noch alle möglichen Reihen durchgehen, die zu einem Sieg führen. Fangt zunächst mit nur einer einzigen Reihe an, z.B. mit der obersten Zeile. Testet wieder mit der GUI und erweitert die Methode sukzessive, bis ihr alle acht Reihen (drei horizontale, drei vertikale und zwei diagonale) berücksichtigt.

// Diese Methode soll true zurueckliefern, falls der aktuelle Spieler // an den drei uebergebenen Positionen das Spielfeld besetzt hat. // Logisch werden drei Positionen als Parameter uebergeben: // (zeile1,spalte1) fuer die erste Position, usw. private boolean aktuellerSpielerBesitzt(int zeile1, int spalte1, int zeile2, int spalte2, int zeile3, int spalte3) { // HIER FEHLT NOCH WAS: Dreier-Kombination überprüfen return false; } private boolean hatAktuellerSpielerGewonnen() { // HIER FEHLT NOCH WAS: Gewinnsituation erkennen return false; }
Anhänge TicTacToe.zip , Aufgabenblatt05.pdf

RE: SE1 Aufgabe 5.2.6 2007-11-25 20:09
T
// Diese Methode soll true zurueckliefern, falls der aktuelle Spieler // an den drei uebergebenen Positionen das Spielfeld besetzt hat. // Logisch werden drei Positionen als Parameter uebergeben: // (zeile1,spalte1) fuer die erste Position, usw. private boolean aktuellerSpielerBesitzt(int zeile1, int spalte1, int zeile2, int spalte2, int zeile3, int spalte3) { // HIER FEHLT NOCH WAS: Dreier-Kombination überprüfen return false; }
ui, das ist aber umständlich.
also wenn ein spielfeld folgendermassen aussieht:
X | O | X X | O | O O | X | O und zeilen und spalten von 0 bis 2 nummeriert werden, dann sollte
aktuellerSpielerBesitzt(0,0, 1,0, 0,3) // (0,0 ... nullte zeile, nullte spalte // ..1,0... erste zeile, nullte spalte // ...0,3) nullte zeile, dritte spalte true zurückgeben, wenn X der aktuelle spieler ist.
denn X besitzt all diese felder. damit hat er natülich noch nicht gewonnen.
gewonnen hat er erst, wenn er z.B. die oberste Zeile komplett besitzt.
eine dementsprechende anfrage solltest du in
hatAktuellerSpielerGewonnen() aufnehmen.
dann testen.
dann z.B. die zweite zeile aufnehmen.
dann testen.
dann z.B. die dritee zeile aufnehmen.
dann testen.
und so fort, für alle zeilen, alle spalten und alle diagonalen.

RE: SE1 Aufgabe 5.2.6 2007-11-25 20:20
Fred
In aktuellerSpielerBesitzt musst Du einfach 3x die Methode gibBesitzer aufrufen und so schauen, ob der aktuelle Spieler der Besitzer dieser Positionen ist. Diese drei Ergebnisse musst Du logisch-und-verknüpfen, da alle drei Positionen besetzt sein müssen.

In hatAktuellerSpielerGewonnen musst Du 8x die Methode aktuellerSpielerBesitzt aufrufen (drei Zeilen, drei Spalten, zwei Diagonalen) und die Ergebnisse logisch-oder-verknüpfen, weil es reicht, wenn der aktuelle Spieler in einer dieser Reihen drei Stein hat.

Ich empfehle Dir das SE1-Tutorium, dort haben wir letzte Woche z.B. an beiden Terminen Tic Tac Toe besprochen. </Eigenwerbung>

RE: SE1 Aufgabe 5.2.6 2007-11-25 20:55
Anonymer User
Warum dort nur dreimal? Das ist doch dann nur ein Spezialfall…[3]

RE: SE1 Aufgabe 5.2.6 2007-11-25 21:11
Anonymer User
Weil der Methode aktuellerSpielerBesitzt ja die Koordinaten der zu ueberpruefenden Felder als Parameter uebergeben werden - es wird in der Tat nur ein Spezialfall ueberprueft. Die Gesamtheit der Spezialfaelle deckst du dann dadurch ab, dass du aktuellerSpielerBesitzt in hatAktuellerSpielerGewonnen 8x aufrufst.

RE: SE1 Aufgabe 5.2.6 2007-11-25 21:17
Anonymer User
warum hatten wir in se1 2006 kein tic tac toe! ;)

RE: SE1 Aufgabe 5.2.6 2007-11-25 21:17
Fred
Warum dort nur dreimal?
Weil man DREI Positionen (in einer Reihe) besetzen muss, um zu gewinnen.

Das ist doch dann nur ein Spezialfall…[3]
Nein, denn die konkreten Positionen werden ja erst über die aktuellen Parameter festgelegt.

Um festzustellen, ob der aktuelle Spieler z.B. die obere Zeile besitzt, rufst Du in der Methode hatAktuellerSpielerGewonnen die Methode aktuellerSpielerBesitzt dann wie folgt auf:

aktuellerSpielerBesitzt(0,0 , 0,1 , 0,2)

Ohne die Hilfsmethode aktuellerSpielerBesitzt würde hatAktuellerSpielerGewonnen sehr viel redundanten Code beinhalten.

Nochmal zusammengefasst

gibBesitzer(zeile, spalte) liefert den Besitzer FÜR EINE POSITION

aktuellerSpielerBesitzt(zeile1, spalte1, zeile2, spalte2, zeile3, spalte3) prüft, ob der aktuelle Spieler das Spielfeld AN DREI POSITIONEN besetzt hat. Dafür wird die Methode gibBesitzer 3x benutzt.

hatAktuellerSpielerGewonnen() prüft ALLE ACHT REIHEN daraufhin ab, ob der aktuelle Spieler sie besitzt. Dafür wird die Methode aktuellerSpielerBesitzt 8x benutzt.

warum hatten wir in se1 2006 kein tic tac toe! ;)
Dafür hattet ihr das Mail-System, das hat doch auch Spaß gemacht, oder? [25]