Mein Tic Tac Toe läuft unendlich weiter, selbst wenn einer gewonnen hat?
Kann mir jemand erklären, wo mein Fehler ist?
Ich hab den Quelltext an den Post angehängt.
Danke schonmal,
Gruß bernhard
ich hab angefangen mir den code anzuschauen und die set methode scheint mir etwas komisch. wieso versuchts du nicht eine instanz von Status[][] innerhalb der klasse Spielfeld zu erstellen, auf die du dann zugreifen kannst. dann könnte es vielleicht sogar schon klappen, wenn du den restlichen code auch danach anpasst.
Zuerst ein paar Hinweise:
* Zeile 11: Das ist nicht die toString-Methode, die gemeint ist. Du sollst die Methode überschreiben, nicht überladen.
* Die Klasse Spielfeld scheint mir eher eine Ansammlung von Funktionen als eine Klasse zu sein, die ein Spielfeld von der Außenwelt kapselt.
Bei deiner GameOver-Funktion stimmt auch etwas nicht.
Die Anordnung der if-else-if's ist logisch falsch.
Du hast durch die beiden for-Schleifen die if's in den for-Schleifen unbrauchbar gemacht, da in der unteren if-else-Kette immer der wert überschrieben wird.
Dadurch, dass du die Spielzüge mit 0, 1, ... 8 durchnummerierst, sollte auch klar sein, dass
Spielzüge<9 immer wahr ist.
* Zeile 11: Das ist nicht die toString-Methode, die gemeint ist. Du sollst die Methode überschreiben, nicht überladen.
* Die Klasse Spielfeld scheint mir eher eine Ansammlung von Funktionen als eine Klasse zu sein, die ein Spielfeld von der Außenwelt kapselt.
Bei deiner GameOver-Funktion stimmt auch etwas nicht.
Die Anordnung der if-else-if's ist logisch falsch.
Du hast durch die beiden for-Schleifen die if's in den for-Schleifen unbrauchbar gemacht, da in der unteren if-else-Kette immer der wert überschrieben wird.
Dadurch, dass du die Spielzüge mit 0, 1, ... 8 durchnummerierst, sollte auch klar sein, dass
Spielzüge<9 immer wahr ist.
Hey, vielen Dank für euere Hinweise.
Ich hab jetzt die GameOver Funktion komplett ohne Schleifen geschrieben, ist zwar umständlich aber mit Schleifen bekomm ichs net hin..
Außerdem hab ich meine Enum Status in meine Spielfeldklasse implementiert.
Der Code läuft jetzt problemlos.
Allerdings hab ich die toString methode nach wie vor überladen.
Dazu eine kleine Verständnisfrage:
Wenn ich eine Funktion überlade, dann benutze ich einen identischen Namen ändere aber zb rückgabewert oder übergebene Parameter.
Wenn ich etwas überschreibe, dann darf ich ja nichts ändern und muss die funktion vererben.
Darf ich in der Klasse, die erbt dann die Funktion überladen?
In meinem Fall muss ich das ja iwann tun, um mein Statusarray zu übergeben, da die toString Methode meines Wissens ja keine Parameter bekommt.
Oder steh ich grad total aufm Schlauch und hab was falsch verstanden??!
*ich bin verwirrt ;) *
Gruß bernhard
Ich hab jetzt die GameOver Funktion komplett ohne Schleifen geschrieben, ist zwar umständlich aber mit Schleifen bekomm ichs net hin..
Außerdem hab ich meine Enum Status in meine Spielfeldklasse implementiert.
Der Code läuft jetzt problemlos.
Allerdings hab ich die toString methode nach wie vor überladen.
Dazu eine kleine Verständnisfrage:
Wenn ich eine Funktion überlade, dann benutze ich einen identischen Namen ändere aber zb rückgabewert oder übergebene Parameter.
Wenn ich etwas überschreibe, dann darf ich ja nichts ändern und muss die funktion vererben.
Darf ich in der Klasse, die erbt dann die Funktion überladen?
In meinem Fall muss ich das ja iwann tun, um mein Statusarray zu übergeben, da die toString Methode meines Wissens ja keine Parameter bekommt.
Oder steh ich grad total aufm Schlauch und hab was falsch verstanden??!
*ich bin verwirrt ;) *
Gruß bernhard
Was Überladen und Überschreiben ist, hast du verstanden.
Du kannst natürlich in einer abgeleiteten Klasse die Methode überladen, was dir aber bei der Polymorphie nichts bringt.
Die toString Methode von der Klasse Object sieht so aus: public String toString();
Wenn du nun in einer Klasse 'Foo' diese Methode überschreibst, kannst du mit System.out.println(foo); ein Objekt 'Foo foo;' direkt ausgeben und brauchst nicht System.out.println(foo.toString()); schreiben.
Deswegen überlädst du die Methode, und überschreibst du sie nicht.
In deinen Fall musst du nicht das Statusarray übergeben. Du überschreibst sowohl bei deinem Status als auch dem Spielfeld die toString Methode und rufst diese verschachtelt auf.
Du kannst natürlich in einer abgeleiteten Klasse die Methode überladen, was dir aber bei der Polymorphie nichts bringt.
Die toString Methode von der Klasse Object sieht so aus: public String toString();
Wenn du nun in einer Klasse 'Foo' diese Methode überschreibst, kannst du mit System.out.println(foo); ein Objekt 'Foo foo;' direkt ausgeben und brauchst nicht System.out.println(foo.toString()); schreiben.
Deswegen überlädst du die Methode, und überschreibst du sie nicht.
In deinen Fall musst du nicht das Statusarray übergeben. Du überschreibst sowohl bei deinem Status als auch dem Spielfeld die toString Methode und rufst diese verschachtelt auf.