Attribut nur in Unterklasse ändern

Status
Nicht offen für weitere Antworten.

Hallo,
dies ist mein erster Eintrag hier, ich bin auf die Antworten gespannt.
Ich möchte einen Spielbau modellieren. Dazu übergebe ich von der Klasse Spielbaum einem Zugbewerter die momentane Spielsituation und einen Zug. Der Zugbewerter soll den Zug durchführen und am Ende eine Bewertung zurückgeben.
Dieser Vorgang soll für alle Züge wiederholt werden.
Mein Problem ist folgendes. Jeder neue Zug muss natürlich wieder von der ursprünglichen Spielsituation ausgehen.
Durch Durchführen eines Zuges wird diese ursprüngliche Spielsituation jedoch geändert und zwar leider nicht nur in der Klasse Zugbewerter, sondern eben auch in der Klasse Spielbaum. Das heißt ein neuer Zug geht dann von der geänderten Spielsituation aus, was er natürlich nicht sol.
Schuld darn ist natürlich, dass dem Zugbewerter nur die Referenz auf die Spielsituation übergeben wird.
Eine Lösung des Problems wäre, dass ich die Spielsituation vor jedem einzelnen Zug kopiere und den Zug auf dieser Kopie ausführen lasse. Bei einem zu erwartenden sehr großen Spielbaum erzeuge ich dabei aber eine enorme Menge an neuen Objekten, die schnell den Speicher auffressen. Gibt es eine Möglichkeit, die Variable spielsituation in der Klasse Spielbaum davor zu bewahren, verändert zu werden.
Im folgenden Code habe ich das Problem kurz dargestellt. Führt man ihn aus, sieht man, dass die Bewertung stets von einer neuen Spielsituation ausgeht.
Also, bin mal gespannt, was kommt
Viele Grüße Thomas

Code:
 import java.awt.Point;



    public class Spielbaum {
    
        Point spielsituation=new Point (5,3);
        int [] bewertung=new int[10];
        ZugBerechner zugBerechner;
    

        public static void main(String[] args) {
            Spielbaum sp = new Spielbaum();

         }

        public Spielbaum() {
            starteBerechnung();

        }

       public void starteBerechnung() {
           for (int i=0;i<=10;i++) {
               zugBerechner=new ZugBerechner(spielsituation,i);
               System.out.print("Bewertung von Zug" + i   );
               System.out.println(":  "+ zugBerechner.bewertung);
          }
       }


     public class ZugBerechner{
         Point spielsituation;
         int zug;
         int bewertung;

         public ZugBerechner(Point spielsituation, int zug) {
             this.spielsituation=spielsituation;
             this.zug=zug;
             bewerteZug(spielsituation,zug);
           }

         public void  bewerteZug(Point spielsituation, int zug) {
             spielsituation.x=spielsituation.x+zug;
             bewertung=spielsituation.x+10;
          }
       }
    }
 

Wildcard

Top Contributor
Mach einen Zug Undoable(Interface) und nimm ihn zurück sobald der Spielbewerter seine Arbeit erledigt hat.
 
Hallo,
danke für die Antwort. Was du nicht wissen konntest ist, dass ein 'Zug' bei diesem Spiel eine ganze Reihe von Aktionen auslösen kan und es ziemlicher Auwand ist, diese alle zurückzusetzen.
 

HLX

Top Contributor
winterwanderer hat gesagt.:
Code:
         public ZugBerechner(Point spielsituation, int zug) {
             this.spielsituation=spielsituation;
             this.zug=zug;
             bewerteZug(spielsituation,zug);
           }

Du solltest die Parameter nicht genauso nennen wie die Attribute der Klassen. Woher weisst du, dass bewerteZug die Attribute "this.spielsituation" und "this.zug" verwendet, statt der Übergabeparameter?

Besser:
Code:
public ZugBerechner(Point newSpielsituation, int newZug) {
...
}

In dem du die Attribute verwendest sollte sich dein Problem eigentlich schon lösen... :cool:

BTW: Der Konstruktor ist eigentlich zum Konstruieren da und nicht zum Bewerten... :wink:
 
S

SlaterB

Gast
> Dieser Vorgang soll für alle Züge wiederholt werden.
> Mein Problem ist folgendes. Jeder neue Zug muss natürlich wieder von der ursprünglichen Spielsituation ausgehen.

Was heißt das eigentlich?
Wozu einzen Zug mehrmals von der gleichen Spielsituation ausführen,
wird da nicht das gleiche nochmal berechnet?

Wie viele Züge meinst du, redest du von einen vollständigen Baum der Form:

Code:
Anfang,  Zug      1 (Tiefe 1), Zug   2 (Tiefe 2) ...
                               Zug 354 (Tiefe 2) (wieder bei Spielsituation von nach Zug 1) ...
                               ....
         Zug 45.066 (Tiefe 1)  (wieder bei Anfangsspielsituation)  .... 
         ...
oder auch
Code:
Anfang,  Zug 1 (Tiefe 1), Zug 12 (Tiefe 2) (Spielsituation von nach Zug 1)...
                          Zug 13 (Tiefe 2) (Spielsituation von nach Zug 1) ...
                         ...
         Zug 2 (Tiefe 1)  (Anfang)  Zug 26 (Tiefe 2, noch vor allen Zügen der Tiefe 3).... 
         ...

?

Ich denke mal, was Tiefensuche und Breitensuche ist, wirst du wissen wenn du sowas angehst.

Bei der Tiefensuche sehe ich kein Speicherproblem.
Selbst wenn du auf das einfache Undoable verzichtest, musst du pro Tiefe nur ein Objekt speichern?!
Ein Undo kommt an Stelle der Kopie genau dann in Frage, wenn es schneller als der Kopiervorgang ist.
Speicher spielt da eine untergeordnete Rolle.

Erzeugte Objeke werden, wenn nicht mehr benötigt, auch wieder gelöscht,
was natürlich durchaus auch wieder Zeit dauert.

-----------------
Bei der Breitensuche ist ein Undo unmöglich.
Es stellt sich die Frage: Wie soll ein Zug ausgeführt werden, wenn die Spielsituation unbekannt ist? Die MUSS doch irgendwo gespeichert sein.

Einzige Alternative: sie wird jedes mal neuberechnet.
Wenn du also in der Tiefe 4 bist und Zug 1,7,3,8 ausführen möchtest,
dann fange noch mal ganz am Anfang an und berecht Zug 1, dann Zug 7, dann 3 und 8.
Etwas Berechnung wird eingespart, wenn man den vorhanden Speicher nutzt, um zumindest die ersten paar Tiefen vollständig zu speichern.

Nicht zu vergessen ist die Speicherung von Informationen über den Spielbaum,
z.B. dass Zug 1,5, 2, 2 gar nicht möglich ist, ein weitere Untersuchung des Teilbaums also wegfällt.
Vielleicht willst du gar noch die Bewertung jeder dieser Zugkombinationen merken.
Das allein kostet schon Unmengen Speicher, aber der Aufwand pro Zugfolge verkleinert sich von einer vollständigen Spielsituation zu einer einzelnen Zahl oder einem kleinen Objekt.

---------

Da du das Undo für möglich hälst, bist du in der Tiefensuche?


-----------

> Du solltest die Parameter nicht genauso nennen wie die Attribute der Klassen. Woher weisst du, dass bewerteZug die
> Attribute "this.spielsituation" und "this.zug" verwendet, statt der Übergabeparameter?

wozu überhaupt Parameter übergeben wenn die gleichen Objekte als Attribute vorhanden sind?

> In dem du die Attribute verwendest sollte sich dein Problem eigentlich schon lösen...

da besteht kein Unterschied, wie du schon erkanntest ist das Attrbibut und der Parameter dasselbe Objekt,
was sollte sich ändern?

zumal ja die Kopie der Objekte anscheinend nicht in Frage kommt, das ist ja das Problem!
 
HLX hat geschrieben:
Du solltest die Parameter nicht genauso nennen wie die Attribute der Klassen. Woher weisst du, dass bewerteZug die Attribute "this.spielsituation" und "this.zug" verwendet, statt der Übergabeparameter?

Besser:
Code:
: 
public ZugBerechner(Point newSpielsituation, int newZug) { 
... 
} 
/[Code] 
In dem du die Attribute verwendest sollte sich dein Problem eigentlich schon lösen...  
 
Hallo HLX,
soweit ich das richtig verstehe (wobei ich mir aber nicht ganz sicher bin) führt eine Änderung einer übergebenen Variablen sowohl zu einer Änderung dieser Variablen in der Klasse, in der die Methode ausgeführt wird als auch in der Klasse, die die Variable übergeben hat und zwar unabhängig davon, wie ich die varable benenne. Ein anderes Benenen des Übergabeparameters führt demnach nur dazu, dass ich ALIASE bekomme, die mir verschleiern, dass auch in der Ursprungsklasse eine Änderung aufgetreten ist. Daher habe ich die Variablen stets gleich benannt. Zur Sicherheit habe ich deine Idee jedoch ma ausprobiert und es ändert sich wirklich nicht. D.h. meine Variable spielsituation in class Spielbaum wird trotdem verändert.  :cry:  

Dein Hinweis auf meinen Missbrauch des Konstruktors ist ok. Werd ich in der Zukunft zu beachten suchen.
 :)
 
S

SlaterB

Gast
so siehts besser aus:
Code:
 zugBerechner=new ZugBerechner(spielsituation,i); 
zugBerechner.bewerteZug();

public class ZugBerechner{
  Point spielsituation;
  int zug;
  int bewertung;

public ZugBerechner(Point spielsituation, int zug) {
  this.spielsituation=spielsituation;
  this.zug=zug;
}

public void bewerteZug() {
  spielsituation.x=spielsituation.x+zug;
  bewertung=spielsituation.x+10;
}
}
wobei das Problem natürlich bleibt, da hast du recht

ich schreibe auch nur um an meinen längeren Post zwischendurch zu erinnern, könnte ja übersehen worden sein ;)
 
Hallo SlaterB
erst mal danke für deine ausführliche Antwort. :)

SlaterB schrieb
<wozu einzen Zug mehrmals von der gleichen Spielsituation ausführen, wird da nicht das gleiche nochmal berechnet?>

Es soll natürlich nicht der gleiche Zug nochmal ausgeführt werden, sondern ein anderer, aber ausgehend von der gleichen Spielsituation.

SlaterB schrieb
<wie viele Züge meinst du eigentlich, redest du von einen vollständigen Baum >

Ich nehme eine Tiefensuche vor. Ist aber eigentlich für meine grundsätzliche Frage erst mal egal. Auch wenn ich nur einen Zug in der Tiefe eins berechne, stelt sich das grundsätzliche Problem, das mein Zug meine ursprüngliche Spielsituation verändert. Wenn ich den nächsten Zug auf Grundlage der alten Spielsituation ausführen möchte, muss ich also ein UNDO des Zuges vornehmen. (Das ist hier schwierig, da auch ein einziger Zug die Spielsituation über kettenartige Reaktionen stark verändern kann) oder zuvor die alte Spielsituation speichern. Da ich beides verhindern möchte, war meine Frage, ob es möglich ist die alte Spielsituation in der Ursprungsklasse unverändert zu lassen.

SlaterB schrieb
<Bei der Tiefensuche sehe ich eigentlich kein Speicherproblem.
Selbst wenn du auf das einfache Undoable verzichtest musst du pro Tiefe nur ein Objekt speichern?! >

Wenn das so wäre, dann hätte ich wirklich kein Problem. :wink:
Leider muss ich aber für jeden Pfad, den ich abschreite zuvor ein neues Objekt der alten Spielsituation anlegen, da ja bei jedem Einzelpfad die alte Spielsituation geändert wird und ich jeweils aber wieder die alte Spielsituation benötige. Zumindest ist das bei meiner rekursiven Vorgehensweise so, vielleicht könnte ich es bei einer iterativen Vorgehensweise umgehen ? :?: Das muss ich mir nochmal in Ruhe überlegen.
 
S

SlaterB

Gast
natürlich musst du für jeden Spielzug ein Objekt erzeugen, aber nicht (bis Programmende) speichern!

wenn du bei der Zugfolge 3,6,7,8,3,4 bist,
dann hast du 5 Objekte im Speicher
(Spielsituation nach Zugfolge 3, nach 3,6, nach 3,6,7, nach 3,6,8 usw.)
das aktuelle Objekt 3,6,7,8,3,4 musst du nun auch im Speicher halten,
solange bis alle Unterzüge 3,6,7,8,3,4 [1.., 2..., 3... usw] berechnet sind,
danach kann es wieder gelöscht werden

wie gesagt, wenn ein Undo eine aufwendigere Operation ist als etwa auf einen Schachfeld mit 20 Figuren eine zu verschieben,
dann ist es normalerweise kein Problem, ein bisschen Zeit in die Erzeugung und Löschung von Objekten zu investieren
(ich rede natürlich auch nur so daher, meine Erfahrungen sind da eher theoretisch als praktisch ;) )

ich verstehe also dein Problem im Moment nicht,
was stört dich?

es ist auf jeden Fall unmöglich im luftleeren Raum irgendwas zu errechnen und kurzfristig zu speichern, ohne Speicherplatz zu belegen ;)
selbst wenn du alles nur als primitive Datentypen rekursiv als Parameter übergibts sind sie eben irgendwo im Stack gespeichert
 

Wildcard

Top Contributor
Du hast eh nur 2 Möglichkeiten:
Undo, oder ständiges Klonen. Da beim Klonen jede Menge Objekte erzeugt werden lege ich dir Undo nahe.
Wenn die Schritte zu aufwendig zum Rückgängig machen sind, lege ich dir das Memento Pattern nahe.
Damit kannst du mit wenig Aufwand einen Zug zurücknehmen, und minimierst die Objekterzeugung wenn du dein Memento wiederverwendest.
 
Hallo SlaterB und Wildcard,
ich denke, es ist schon ein Problem ständig neue Objekte durch Klonen zu erzuegen und die müssen zwar nicht bis Programende erhalten bleiben, aber zumindest bis zum Rekursionsende und dabei entstehen eben eine ganze Unmenge an Klonen.
Aber ich beginne einzusehen, dass ich wirklich keine andere Möglichkeit habe als dies oder eben doch ein UNDO.
Das Memento Pattern kannte ich noch nicht, muss ich mir mal ansehen. Vielleicht ist das ja die Lösung.
Also danke ihr beiden. :)
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Java: Wie sortiere ich eine ArrayList benutzerdefinierter Objekte nach einem bestimmten Attribut? Java Basics - Anfänger-Themen 2
berserkerdq2 Wie lege ich ein Attribut comparator an? Java Basics - Anfänger-Themen 13
M Wie kann ich festlegen, dass ein Attribut maximal den Wert 0 erreicht, also nicht in den negativen Bereich fällt? Java Basics - Anfänger-Themen 4
U Wie ein Attribut von einer Klassenmethode in der Klasse speichern= Java Basics - Anfänger-Themen 2
B Bin komplett am verzweifeln :( Verkettete Liste die Objekte hat Attribut auslesen Java Basics - Anfänger-Themen 14
C Setter-Methode mit final-Attribut Java Basics - Anfänger-Themen 9
T Inhalt aus TextField in Attribut einer Instanz schreiben Java Basics - Anfänger-Themen 5
W Mehrfach das gleiche Attribut für ein Objekt erzeugen (mit verschiedenen Werten) Java Basics - Anfänger-Themen 2
C Zugriff auf Attribut von Oberklasse Java Basics - Anfänger-Themen 8
D Attribut Telefonnummer - eigene Klasse oder String Java Basics - Anfänger-Themen 13
itsmejo Erste Schritte Auf Attribut einer anderen Klasse zugreifen. Java Basics - Anfänger-Themen 14
N enum Attribut von Objekten einer Hashmap ausgeben Java Basics - Anfänger-Themen 6
X Attribut initialisieren Java Basics - Anfänger-Themen 1
Z Attribut ändern ohne Kontrollstruktur Java Basics - Anfänger-Themen 2
S NIO lesbares und beschreibbares Attribut setzen Java Basics - Anfänger-Themen 1
X Auf Attribut einer anderen Klasse zugreifen Java Basics - Anfänger-Themen 2
H Objekt als Attribut speichern Java Basics - Anfänger-Themen 11
N Fehler bei string Attribut! Java Basics - Anfänger-Themen 18
B Attribut vom Typ einer Klasse? Java Basics - Anfänger-Themen 3
D Klassen Warum wird das Attribut nicht ausgegeben? Java Basics - Anfänger-Themen 8
N Attribut einer anderen Klasse übertragen/verwenden Java Basics - Anfänger-Themen 5
Aprendiendo Zwei Fragen und ein geerbtes "protected"-Attribut Java Basics - Anfänger-Themen 2
S Zugriff auf Attribut einer unbekannten Klasse erhalten Java Basics - Anfänger-Themen 6
N Methoden Attribut Abfrage eines anderen Objektes Java Basics - Anfänger-Themen 36
A Kann man ein Attribut aus einer anderen Klasse nutzen? Java Basics - Anfänger-Themen 3
A Private Attribut aus fremder Klasse lesen ? Java Basics - Anfänger-Themen 19
J Objekt mit Attribut "ansprechen" Java Basics - Anfänger-Themen 7
J Innerhalb Interfacemethode: Interface als Attribut Java Basics - Anfänger-Themen 2
V Attribut aus aus jedem ArrayListen index auf Bildschirm ausgeben Java Basics - Anfänger-Themen 9
W Attribut Werte eines Objekts mit gettern ausgeben Java Basics - Anfänger-Themen 5
C Probleme bei einem Stringvergleich - Attribut "value" unterscheidet sich Java Basics - Anfänger-Themen 9
B Klassenübergreifendes Objekt Attribut Java Basics - Anfänger-Themen 7
P Ausnahme, wenn Attribut nicht definiert Java Basics - Anfänger-Themen 4
V Auf Objektreferenz über Attribut zugreifen Java Basics - Anfänger-Themen 10
M Objekt mit Liste als Attribut seralisieren? Java Basics - Anfänger-Themen 5
S Ein Attribut/Instanz eines bestehendes Objektes mit SETTER Methode ändern Java Basics - Anfänger-Themen 3
R Variablen final String Variable als Attribut veränderbar? Java Basics - Anfänger-Themen 21
V Methoden Zeilen nach bestimmtem Attribut sortieren Java Basics - Anfänger-Themen 4
Blindxantos Datentypen Uhrzeit in einem Attribut speichern Java Basics - Anfänger-Themen 3
H DOM Attribut als ID kennzeichnen Java Basics - Anfänger-Themen 12
L Methoden In einer Klasse ein Attribut aus einer anderen Klasse setzen Java Basics - Anfänger-Themen 8
M JLabel attribut wert zuweisen Java Basics - Anfänger-Themen 2
P Enum Attribut in Konstruktoren Java Basics - Anfänger-Themen 10
C Liste mit Attribut Abstract vererben Java Basics - Anfänger-Themen 11
I Von einer Methode eines Objektes auf Attribut eines Objektes anderer Klasse zugreifen Java Basics - Anfänger-Themen 4
Ollek Collections ArrayList Object - Attribut von dem Object vergleichen Java Basics - Anfänger-Themen 7
M .toString(); // Ausgabe: Attribut von Vaterklasse Java Basics - Anfänger-Themen 12
K OOP Datenkapselung mittels private - length Attribut bei Array Java Basics - Anfänger-Themen 3
K Attribut als Referenz auf Objekt Java Basics - Anfänger-Themen 8
J Variable vs Attribut Java Basics - Anfänger-Themen 4
S Klasse als Attribut implementieren Java Basics - Anfänger-Themen 2
W Maven2 <packaging>jar</packaging> über Attribut auf WAR ändern Java Basics - Anfänger-Themen 5
X Attribut in n Objekten suchen Java Basics - Anfänger-Themen 8
G Objekte mit dem Attribut title mit Comparator sortieren Java Basics - Anfänger-Themen 5
P Objekte als Attribut: Referenz oder Kopie? Java Basics - Anfänger-Themen 3
D Zugriff auf attribut anderer Klasse privat/public? Java Basics - Anfänger-Themen 9
R Suchen nach Attribut Java Basics - Anfänger-Themen 5
S Attribut beim erzuegen eines Objektes automatisch erhöhen Java Basics - Anfänger-Themen 6
? Zugriff auf Attribut einer anderen Klasse Java Basics - Anfänger-Themen 2
M probleme mit array (als attribut einer klasse) Java Basics - Anfänger-Themen 2
J Attribut casten Java Basics - Anfänger-Themen 3
I Mehrere Klasseninstanzen ueber Attribut sortieren? Java Basics - Anfänger-Themen 2
J Attribut vom Objekt einer eigenen Klasse setzen Java Basics - Anfänger-Themen 6
megachucky wie bekomm ich ein private attribut aus einer andren klasse? Java Basics - Anfänger-Themen 18
J Wie greife ich vonEvent-Handler auf Attribut einer Klasse zu Java Basics - Anfänger-Themen 5
T Aufruf der Methode einer Oberklasse, wenn sie in der Unterklasse überschrieben ist. Polymorphie. Java Basics - Anfänger-Themen 2
O Mit Instanz von Oberklasse auf Unterklasse zugreifen Java Basics - Anfänger-Themen 2
M Unterklasse soll nicht alle Methoden erben Java Basics - Anfänger-Themen 3
L Klassen Kann eine Unterklasse einer abstrakten Klasse ein Interface implementieren? Java Basics - Anfänger-Themen 2
J Ober und Unterklasse Java Basics - Anfänger-Themen 6
S Methoden Auf Methode der Unterklasse zugreifen? Java Basics - Anfänger-Themen 2
kilopack15 Beziehung Interface - (abstrakte) Klasse -Unterklasse Java Basics - Anfänger-Themen 3
W Objekt einer Unterklasse erstellen Java Basics - Anfänger-Themen 4
N Vererbung Best Practice: Verfeinerte Klassenvariablen in Unterklasse Java Basics - Anfänger-Themen 5
E Erste Schritte <? super Unterklasse> Return-Typ darf nicht vom Wildcard-Typ sein Java Basics - Anfänger-Themen 5
Y Java Methoden Unterklasse Java Basics - Anfänger-Themen 7
T unterklasse will eine methode von der oberklasse nutzen Java Basics - Anfänger-Themen 4
S Vererbung exaktes "Objekt" der Unterklasse bestimmen Java Basics - Anfänger-Themen 5
B Vererbung Probleme bei Zugriff auf protected-Methoden in einer Unterklasse Java Basics - Anfänger-Themen 27
D Vererbung Auf Methoden der Unterklasse zugreifen Java Basics - Anfänger-Themen 2
D Methode zur Konvertierung von Oberklasse in Unterklasse Java Basics - Anfänger-Themen 5
A Polymorphie Unterklasse Objekt in Oberklasse Variable? Java Basics - Anfänger-Themen 3
M Dienste einer Unterklasse Java Basics - Anfänger-Themen 9
J Unterklasse - oder so Java Basics - Anfänger-Themen 3
J Oberklasse Objekt = new Unterklasse() Java Basics - Anfänger-Themen 5
B krieg Zugriff auf Unterklasse nicht gebacken Java Basics - Anfänger-Themen 9
Q Zugriff auf Attribute einer Unterklasse Java Basics - Anfänger-Themen 7
D OOP paint() Methode aus Unterklasse anstoßen Java Basics - Anfänger-Themen 3
D Wie Objekte einer Unterklasse erstellen? Java Basics - Anfänger-Themen 14
D Zweiter Konstruktor der Unterklasse wird nicht angenommen Java Basics - Anfänger-Themen 10
H Unterklasse von TimerTask mit Instanzvariable der Periode Java Basics - Anfänger-Themen 2
C Ober-/Unterklasse: Speicehrung einiger 10 Objekte Java Basics - Anfänger-Themen 3
G Prob. mit KeyListener und Unterklasse Java Basics - Anfänger-Themen 5
G Methode um Objekte von Unterklasse abzufüllen Java Basics - Anfänger-Themen 8
D Mit Methode Objekte der Unterklasse erzeugen Java Basics - Anfänger-Themen 15
F jTextField lässt sich aus einer Unterklasse nicht ansprechen Java Basics - Anfänger-Themen 2
O Oberklasse übergeben, überprüfen nach unterklasse Java Basics - Anfänger-Themen 3
J Konstruktor der Unterklasse auf Objekt der Oberklasse Java Basics - Anfänger-Themen 3
G Konstruktor der Unterklasse auf Objekt der Oberklasse Java Basics - Anfänger-Themen 1
M Rückgabetype Unterklasse von einer abstrakten Klasse Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben