Ich stehe bei obiger Aufgabe völlig auf dem Schlauch! Hat jemand einen dezenten Tipp für mich?
Danke vorab!
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.
// 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.
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>
Warum dort nur dreimal? Das ist doch dann nur ein Spezialfall…[3]
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.
warum hatten wir in se1 2006 kein tic tac toe! ;)
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 zusammengefasstgibBesitzer(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]