möglichst objektorientiert

Status
Nicht offen für weitere Antworten.

Bit2_Gosu

Bekanntes Mitglied
Moin!

Ich möchte ein Schachspiel möglichst objektorientiert programmieren und habe nun folgende Frage:

ich habe u.a. eine Klasse "Schachuhr" und eine Klasse "Spieler". Nun gibt es im Spiel genau eine Schachuhr, auf die beide Spieler schauen können.
Wenn es in der Spieler-Klasse nun eine Funktion "schaueAufSchachuhr" gibt, muss in der Spieler Klasse natürlich auf eine Funktion der Schachuhr-Klasse zugegriffen werden können, die die Zeit ausgibt.
Dazu könnte ich natürlich jedem Spieler das selbe Schachuhr-Objekt übergeben. Das wäre aber dann nicht wirklich objektorientiert, denn warum hat JEDER Spieler das selbe Objekt EINER Schachuhr?

Was würdet ihr tun?
 

Painii

Bekanntes Mitglied
Dazu könnte ich natürlich jedem Spieler das selbe Schachuhr-Objekt übergeben. Das wäre aber dann nicht wirklich objektorientiert, denn warum hat JEDER Spieler das selbe Objekt EINER Schachuhr?

Was würdet ihr tun?

Warum wäre das nicht objekt-orientiert?

2 Spieler setzen sich an einen Tisch und "merken" sich die Schachuhr die da steht.
Wenn sie am nächsten Tag an einem anderen Tisch sitzen "merken" sie sich eine andere Schachuhr, aber trotzdem beide die gleiche. Ich sehe da kein Problem ???:L

Natürlich könntest du die Schachuhr mit dem Tisch verbinden an dem die Spieler spielen, und dann holen sich die beiden Spieler vom Objekt "Tisch" die entsprechende Uhr.
 

Bit2_Gosu

Bekanntes Mitglied
Achso, ist es so, dass, wenn ich beiden Spielern das selbe Objekt (der Klasse Uhr) übergebe, es dann auch beim zuweisen zu einer Variable der Klasse Uhr in der Spieler-Klasse nicht kopiert wird? Beide Spieler hätten sozusagen eine Referenz auf das SELBE Objekt?
 

faetzminator

Gesperrter Benutzer
Beide Spieler hätten sozusagen eine Referenz auf das SELBE Objekt?

Genau. Beispiel:

Java:
Clock clock = new Clock(60 * 60); // 60 min zeit setzen, uhr läuft noch nicht
Player p1 = new Player(clock);
Player p2 = new Player(clock);
p1.getClock().setTime(60 * 5); // 5min
System.out.println(p2.getClock().getTime()); // es wird... 300 ausgegeben
 

Bit2_Gosu

Bekanntes Mitglied
Hm. Mir ist da jetzt aber noch eine Sache unklar:

Die Schachuhr-Klasse bietet einen Funktion "draufdrücken" an. (ein spieler kann unmittelbar nach seinem zug auf eine schachuhr drücken, dann läuft die zeit des anderen ab).
Ich übergebe nun jedem Spieler eine Referenz auf das EINE Schachuhr-Objekt. Referenzen auf Objekte werden (wie alles in Java) ja per value übergeben. D.h. wenn jetzt ein Spieler die "draufdrück" Funktion aufruft, dann verändert dies nichts am Schachuhr-Objekt, dass der andere Spieler über seine Referenz sieht.

Sehe ich das falsch?
 

Painii

Bekanntes Mitglied
Ich übergebe nun jedem Spieler eine Referenz auf das EINE Schachuhr-Objekt. Referenzen auf Objekte werden (wie alles in Java) ja per value übergeben. D.h. wenn jetzt ein Spieler die "draufdrück" Funktion aufruft, dann verändert dies nichts am Schachuhr-Objekt, dass der andere Spieler über seine Referenz sieht.

Sehe ich das falsch?
Doch, natürlich ändert das die Schachuhr (da passt genau das Beispiel von faetzminator).
Spieler 1 macht was mit der Uhr, und Spieler 2 sieht das dann auch.

Und Objekte werden "by value" übergeben, du kannst die Referenz nicht so einfach ändern.
Das geht in Java nicht:
Java:
Clock clock = new Clock();
player1.setNewClock(clock);
player2.getClock(); //Hier wird bei der naiven Umsetzung immer noch clock ausgegeben, und nicht newClock

void setNewClock(Clock clock){
 clock=new Clock(); //player2 bekommt dieses neue Clock nicht implizit mit, er hat immer noch die alte Uhr (du kannst die Referenz so nicht ändern)
}
void setNewTime(Clock clock){
 clock.setTime(300); //Das Attribut time von clock kannst du verändern, dann sieht es auch jeder andere
}

edit: Hoffe ich hab mich verständlich genug ausgedrückt (find ich auch schwer korrekt zu erklären dass es wirklich jeder auf Anhieb versteht ;))
 
Zuletzt bearbeitet:

HannsW

Bekanntes Mitglied
D.h. wenn jetzt ein Spieler die "draufdrück" Funktion aufruft, dann verändert dies nichts am Schachuhr-Objekt, dass der andere Spieler über seine Referenz sieht.

Sehe ich das falsch?
bezgl des Objektes nicht, aber Dein Design scheint mir falsch!

Eine Schachuhr ist ja eigentlich keine Uhr im üblichen sinne, sondern eine Uhr mit ZWEI Anzeigen und ZWEI "draufDrück"-Button;

Spieler EINS stoppt die Uhr des Spielers ZWEI und startet seine durchs drücken ( seines Buttons).
und vice versa.
Beide Spieler sehen jedoch beide Anzeigen.
 

Marco13

Top Contributor
Und wie würde man diesen Aspekt ins Design einfließen lassen? ???:L Die Uhr könnte zwar zwei Zeitanzeigen haben ([c]getZeit(int spielerIndex)[/c] oder so), aber wenn man postuliert, dass bei jedem "draufdrücken" die Seite sich ändert, wäre das doch OK..!?
 

HannsW

Bekanntes Mitglied
Und wie würde man diesen Aspekt ins Design einfließen lassen? ???:L
Zwei Button, zwei "ZeitZähler" die beide bei GetZeit() angezeigt werden.
[QUOTE Die Uhr könnte zwar zwei Zeitanzeigen haben ([c]getZeit(int spielerIndex)[/c] oder so), aber wenn man postuliert, dass bei jedem "draufdrücken" die Seite sich ändert, wäre das doch OK..!?[/QUOTE]

Nein, die ANzeigeSeite ändert sich nicht. Beide Spieleruhren müssen angezeigt werden!, denn jeder Spieler will doch wissen, wieviel Zeit er, und wieviel der Partner bereits verbraucht hat.

Ich wurde einen Thread laufen lassen, der pro sekunde die beiden ANzeigen aktualisiert, und bei SpielerDrücktSeinenButton() wird die gegnerische Zeit inkrementiert
 

Bit2_Gosu

Bekanntes Mitglied
Ich habs jetzt mal fast 100% realistisch gemacht:

eine Klasse "Uhr" und eine Klasse "Schachuhr". In der Klasse Schachuhr wird die Uhr-Klasse 2 mal instantiiert. Jede Uhr-Instanz verfügt über einen eigenen Thread, der aber nur läuft (und die Restzeit dekrementiert), wenn der entsprechende Button unten ist. So läuft maximal ein Thread - das spart performance.

vielen dank bis aufs weitere für eure Hilfe!
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen


Oben