OOP Zugriff auf eine Klasse aus einem Interface-Objekt

der_roemer

Mitglied
Hallo!

Ich weiß nicht so recht, wonach ich das Internet fragen soll
bei meinem Problem...

Ich will TicTacToe programmieren,
mit einem Strategy Pattern für die Züge 1,2,3,n
weil sich das Vorgehen bei jedem Zug vom anderen unterscheidet
und ich IF-Bäume vermeiden will.

Ich hab eine SPIEL-Klasse und erzeuge daraus meinSpiel

Java:
class Spiel {

    private IZug welcherZug;
    private int[][] spielfeld;
    public static Spielfigur spielfigur;
    
    public Spiel(){
        spielfeld = new int[3][3];
        welcherZug = new Zug1();
        spielfigur = new Spielfigur(0, 0, 0);
    }

    public void setWelcherZug(IZug welcherZug) {
        this.welcherZug = welcherZug;
    }
    
    public void zugAusfuehren(){
        // ich übergebe eine Objekt vom Typ Spielfigur, da ich es mit mehreren Werten
        // zu tun habe, welche ich später schreiben muss
        welcherZug.ziehen(spielfigur);
    }

    void setzeFigur(int x, int y, int besitzer) {
        if (spielfeld[x][y] == 0) {
                spielfeld[x][y] = besitzer;
        } else {
            // Spielfeld ist nicht leer !!!
        }
        
    }

    Spielfigur sucheFreiesFeld() {
      // Hier Code
    }

}

Ich habe mein Interace IZug

Java:
public interface IZug {
    public void ziehen(Spielfigur spielfigur);
}

Und hier ist mal die Klasse Zug1

Java:
public class Zug1 implements IZug{

    @Override
    public void ziehen(Spielfigur spielfigur) {
        // und hier würde ich gerne auf meinSpielfeld zugreifen
       // spielfigur = meinspiel.sucheFreiesFeld();
        
        
        
    }
}

In der Main starte ich das Spiel und will Züge ausführen.


Java:
public class Main {
    final static int leer = 0;
    final static int Blech**** = 1;
    final static int ich = 2;
    
    public static void main(String args[]){
    Spiel meinSpiel = new Spiel();
    
    meinSpiel.setWelcherZug(new Zug1());
    //hier könnte ich auch eine neue Figur übergeben
    meinSpiel.setzeFigur(0,0,ich);
    meinSpiel.zugAusfuehren();
    
    }
}

Aber wenn jetzt zugausführen()
in der Klasse Spiel auf die Klasse Zug1
zugreift, ähh, dann komm ich von da nicht mehr
an mein Spielfeld ran....



Java:
public class Zug1 implements IZug{

    @Override
    public void ziehen(Spielfigur spielfigur) {
        // und hier würde ich gerne auf meinSpielfeld zugreifen
       // spielfigur = meinspiel.sucheFreiesFeld();
    }
}

Wie könnte ich das anstellen?
 
Zuletzt bearbeitet von einem Moderator:

Michael...

Top Contributor
So wie ich das verstehe ist die Frage hier: Wie greife ich in einer Klasse/einem Objekt auf ein anderes Objekt zu. Antwort: Ganz einfach, das eine Objekt muss das andere kennen, also muss es irgendwie übergeben werden. Sind eigentlich Grundlagen der OOP.
Wenn Du Dich aber schon mit Entwurfsmustern auseinandersetzt, möchte ich Dir das MVC Pattern ans Herz legen. Es ist besonders für die Spieleprogrammierung sehr sinnvoll.
 
S

SlaterB

Gast
wenn du nur die Spielfigur übergibst, eine Klasse die du nicht gepostet hast, dann müsste dort ein Link auf das Spielfeld sein,

oder das Spielfeld ist unsauber global über eine statische Variable erreichbar

oder du übergibst einen weiteren Parameter Spielfeld

oder mein Vorschlag:
erstelle eine Basisklasse von allen Zügen, Interface evtl. nicht mehr nötig, dort hinterlege allgemeine Funktionalität wie
die Initialisierung mit wichtigen Daten wie Spielfeld,
nicht unbedingt im Konstruktor, da müsste dann in allen Subklassen auch ein Konstruktor angegeben werden,
alternativ eine init()-Methode,

je nachdem wer wo wann Zug-Objekte erstellt ist die Initialisierung dort dann nicht ganz ohne, zusätzliche Aufrufe, können vergessen werden usw.,
falls es tatsächlich eine Baumstruktur gibt besteht hoffentlich eine zentrale Stelle dafür,
z.B. in setWelcherZug() oder zugAusfuehren() von Spielfeld

jedenfalls könnten die Subklassen dann auf Methoden der Oberklasse wie getSpielfeld() zugreifen,
vielleicht ist auch die Spielfigur schon gesetzt
 

DerFeivel

Bekanntes Mitglied
Das er die Grundzüge der OOP zumindest ansatzweise verstanden hat, dürfte die Gliederung seines Quelltextes zeigen.

Bis ich SlaterBs Kommentar gelesen hatte, hatte ich eigentlich eine abstrakte Klasse statt des Interfaces:
Java:
public abstract class AbstractZug{

     private Spielfeld feld;


     public AbstractZug(Spielfeld feld){
           this.feld=feld
     }

     public abstract void ziehen(Spielfigur spielfigur);

}

favorisiert.
Neue Zugimplementierungen müssen dann die Methode ziehen überschreiben und zumindest vom Konstruktor der Abstrakten Klasse erben.


Aber irgendwie...hmm....gefällt mir das noch nicht so wirklich.


Wieso ist die SPielfigur static?
 
Zuletzt bearbeitet:

der_roemer

Mitglied
@Michael
Ja, ich hab den Überblick verloren. vielleicht sollte ich erst einmal bei den Grundlagen bleiben und später die Patterns überfallen^^

@SlaterB
Die Klasse Spielfigur enthält nur die Eigenschaften der Figur, also Position und Besitzer. Ich will das Spielfeld nicht in der Figur haben, weil die Figur eigentlich nichts davon wissen sollte. Das mit der Basisklasse und den Zügen in Subklassen ist natürlich eine Lösung.

Die Erstellung der Zug-Objekte will ich in der Main lassen, denn da "befindet" sich ja auch der Spieler. Ich versuche die Realität so weit wie möglich abzubilden, damit ich nicht den Überblick verliere.

@derFeivel
Tja wieso ist die Spielfigur static...?
ich habs vergessen. Mit Sicherheit ein
AnfängerProbiertRumProblem
 

der_roemer

Mitglied
Ich habe das Ganze neu aufgelegt,
erst mal trocken im Editor und dann mit Netbeans,
und dann plötzlich hab ich mich gewundert, warum ich bei ZugNr1
mein Spielfeld nicht mehr sehe, aber dann hab ich es mit dem Konstruktor übergeben
und so funktioniert es jetzt. Wie ist eure Meinung dazu?
Kann man das anders/besser lösen?
Ich frag mal anders: Gibts grobe Fehler?

Hauptklasse
Java:
public class TicTacToeVererbung2 {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        TicTacToeVererbung2 TTT = new TicTacToeVererbung2();
        TTT.testen();
    }

    private void testen() {
        final int leer = 0;
        final int mensch = 1;
        final int blech**** = 2;

        Spiel meinSpiel = new Spiel();
        meinSpiel.setzeSpielsteinSpiel(new Spielstein(0, 0, mensch));
        Zug1 zugNr1 = new Zug1(meinSpiel);
        zugNr1.ziehen(blech****);
        meinSpiel.spielfeld.spielfeldAusgeben();
        Zug2 zugNr2 = new Zug2(meinSpiel);
        zugNr2.ziehen(blech****);
    }
}

Zug1-Klasse

Java:
public class Zug1 extends Spiel {
    
    private Spielstein spielstein;

    Spiel meinSpiel;
    
    Zug1(Spiel meinSpiel) {
        this.meinSpiel = meinSpiel;
    }
    
    void ziehen(int spieleramZug) {
        while (spielstein == null) {
            spielstein = meinSpiel.spielfeld.findeZufaelligfreiesFeld();
        }
        spielstein.setBesitzer(spieleramZug);
        meinSpiel.setzeSpielsteinSpiel(spielstein);
    }
}
]

Spielfeld-Klasse

Java:
public class Spielfeld {

    final int leer = 0;
    final int mensch = 1;
    final int blech**** = 2;
    private int[][] spielfeldXY;

//    0,0  1,0  2,0
//    0,1  1,1  2,1
//    0,2  1,2  2,2
    public Spielfeld(int[][] spielfeldXY) {
        this.spielfeldXY = spielfeldXY;
    }

    public Spielfeld() {
    }

    public Spielfeld(int x, int y) {
        this.spielfeldXY = new int[x][y];
    }

    public boolean spielfeldfrei(Spielstein spielstein) {
        int posX = spielstein.getPosX();
        int posY = spielstein.getPosY();
        if (spielfeldXY[posX][posY] == leer) {
            return true;
        } else {
            return false;
        }
    }

    Spielstein findeZufaelligfreiesFeld() {
        Spielstein spielstein = new Spielstein(0, 0, -1);
        while (true) {
            spielstein = new Spielstein(getZufallszahl(), getZufallszahl());
            if (spielfeldfrei(spielstein)) {
                return spielstein;
            }
        }
    }

// <editor-fold defaultstate="collapsed" desc="erzeuge Zufallszahl zwischen 0 und 2">
    public int getZufallszahl() {
        int zufallszahl;
        zufallszahl = (int) (Math.random() * 3);
        return zufallszahl;
    }

// </editor-fold>
    void setzeSpielsteinSpielfeld(Spielstein spielstein) {
        int posX = spielstein.getPosX();
        int posY = spielstein.getPosY();
        if (spielfeldfrei(spielstein)) {
            spielfeldXY[posX][posY] = spielstein.getBesitzer();
        }
    }

    void spielfeldAusgeben() {
        for (int y = 0; y < 3; y++) {
            for (int x = 0; x < 3; x++) {
                System.out.print(" " + spielfeldXY[x][y] + " ");
            }
            System.out.println("");
        }

    }
}

Spielstein-Klasse
Java:
public class Spielstein {

    private int posX;
    private int posY;
    private int besitzer;

    public Spielstein(int posX, int posY, int besitzer) {
        this.posX = posX;
        this.posY = posY;
        this.besitzer = besitzer;
    }
    
    public Spielstein(int posX, int posY) {
        this.posX = posX;
        this.posY = posY;
        this.besitzer = -1;
    }

    public Spielstein() {
        this.posX = 0;
        this.posY = 0;
        this.besitzer = -1;
    }

    public int getBesitzer() {
        return besitzer;
    }

    public void setBesitzer(int besitzer) {
        this.besitzer = besitzer;
    }

    public void setPos(int posX, int posY) {
        this.posX = posX;
        this.posY = posY;
    }

    public int getPosX() {
        return posX;
    }

    public int getPosY() {
        return posY;
    }

    // zur internen Verwendung, damit die Abfrageausdrücke nicht so lang werden
    // wenn zwei Spielfelder nach Koordinaten verglichen werden sollen
    public float getPosXY() {
        float posXY = (posX + (posY / 10f));
        return posXY;
    }

    void spielsteinAusgeben(String string) {
        System.out.println(string+"--> x:"+posX+" y:"+posY+ " besitzer "+besitzer);
    }
}
 
Zuletzt bearbeitet:

HimBromBeere

Top Contributor
Ich bin das Thema nur überflogen, aber einige Anmerkungen hab ich schonmal.

Dass deine Bezeichner nicht ganz astrein sind, dürftest du anhand der Sternchen bereits gesehen haben...
eine andere Sache ist für mich aber völlig gravierender: warum erbt Zug von Spiel? Das ergibt meiner Meinung nach (jedenfalls, ohne deine Logik zu kennen) keinen Sinn. Im Übrigen: Gibt´s auch eine Klasse Zug2 oder was soll die Numerierung?

EDIT: TicTacToeVererbung2 ist demnach ein sehr schlechter Name, nenn´s doch einfach TicTacToe... oder Katzenfutter, wäre mein Favorit

Noch ein EDIT:
// zur internen Verwendung, damit die Abfrageausdrücke nicht so lang werden
// wenn zwei Spielfelder nach Koordinaten verglichen werden sollen
public float getPosXY() {
float posXY = (posX + (posY / 10f));
return posXY;
}
Man sollte eher nicht aus Platzgründen eine so seltsame Schreibweise einführen, v.a. erstens nicht public (wenn´s nzr intern gebraucht wird) und zweitens nicht so, wenn es für int je eine einzelne Methode gibt. Das sollte schon alles konsequent sein...

Und noch was: warum gibt die Methode indezufaelligesFreiesFeld() einen Spielstein zurück? Das finde ich unnötig, gib doch einfach ein neues Punkt-Objekt aus mit den Koordinaten des Feldes...
 
Zuletzt bearbeitet:

der_roemer

Mitglied
Ja über die Sternchen hab ich auch gegrinst :D

Zug2 gibt es auch, und dann ZugN.
Zug1 erbt vom Spiel, weil jeder Zug ein anderes Vorgehen erfordert.

Der Name TicTacToeVererbung2 kommt aus dem package und ist nur für mich,
weil ich mehrere Ansätze ausprobiert habe (patterns, siehe oben).

Diese Wurst-Methode, die float zurück gibt werd ich wieder rausschmeißen,
ist wirklich nicht elegant, aber kam mir spontan.

Hmm, das Punkt-Objekt ist ein super Vorschlag, werd ich umsetzen,
danke!!
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Zugriff auf eine 2. Klasse die per UI-Designer erstellt wurde Java Basics - Anfänger-Themen 1
M Zugriff auf eine ArrayList in einer anderen Klasse Java Basics - Anfänger-Themen 4
K Zugriff einer Klasse auf eine andere Andere -> bad operand for binary operator Java Basics - Anfänger-Themen 5
N OOP Zugriff auf eine Objekt innerhalb einer Klasse aus statischen Methoden Java Basics - Anfänger-Themen 9
J OOP Zugriff einer Klasse auf eine Andere Java Basics - Anfänger-Themen 8
J Zugriff auf ein Array über eine andere Klasse Java Basics - Anfänger-Themen 7
G kein Zugriff auf eine Klasse in einem Unterordner Java Basics - Anfänger-Themen 11
G Zugriff auf eine Klasse beschränken. Java Basics - Anfänger-Themen 6
I In unterschiedlichen Applikation Zugriff auf eine gemeinsame Anwendung? Java Basics - Anfänger-Themen 8
M Variablen Zugriff von außerhalb eines Blockes auf eine Variable innerhalb eines Blockes Java Basics - Anfänger-Themen 2
O zugriff auf eine Instanz Java Basics - Anfänger-Themen 8
1 OOP Zugriff auf eine Methode nur einmal die Sekunde Java Basics - Anfänger-Themen 8
P Zugriff auf eine Textdatei sperren Java Basics - Anfänger-Themen 4
J Zugriff auf eine Mysql-DB unter Linux Java Basics - Anfänger-Themen 6
C Zugriff auf Methode Java Basics - Anfänger-Themen 2
I Applikationsserver (WildFly) - Zugriff auf Ressourcen.. Problem mit Pfade Java Basics - Anfänger-Themen 10
Encera Zugriff auf Map-Objekte Java Basics - Anfänger-Themen 3
T Zugriff auf Control anderer Klasse Java Basics - Anfänger-Themen 5
W Unterschiede bei Zugriff auf Objekt und Klassenvariablen über einen Getter? Java Basics - Anfänger-Themen 2
EchtKeineAhnungManchmal hallo habe ein Problem mit einer Datei -> (Zugriff verweigert) Java Basics - Anfänger-Themen 4
R TreeSet Zugriff aus anderer Klasse Java Basics - Anfänger-Themen 8
C Kein Zugriff auf Klassenmethoden in Main Methode Java Basics - Anfänger-Themen 23
H Zugriff verweigert Java Basics - Anfänger-Themen 5
moiss002 Umgebungsvariable Kein Zugriff auf ein Array Java Basics - Anfänger-Themen 7
B Probleme mit Zugriff auf Dateisystem Windows 10 ( jFileChooser) Java Basics - Anfänger-Themen 17
B Zugriffsmodifier, Zugriff außerhalb Package Java Basics - Anfänger-Themen 5
C Zugriff auf Attribut von Oberklasse Java Basics - Anfänger-Themen 8
P Klasse hat keinen Zugriff auf getter/setter-Methoden eines Objektes Java Basics - Anfänger-Themen 9
B Methoden Methoden haben kein Zugriff auf variablen Java Basics - Anfänger-Themen 4
M Gettter/Setter Methoden Klassenfelder kapselung und zugriff? Java Basics - Anfänger-Themen 1
S Zugriff auf protected Fields = guter Programmierstil? Java Basics - Anfänger-Themen 11
M Pfadprobleme - Zugriff auf einen Ordner im Workspace Java Basics - Anfänger-Themen 17
ruutaiokwu Bluetooth-Zugriff, braucht es dazu plattformabhängige Libraries oder kann das Java mittlerweile selbst? Java Basics - Anfänger-Themen 10
R Zugriff auf den Index eines Arrays, welches ein Objekt ist. Java Basics - Anfänger-Themen 4
P Zugriff auf Variablen anderer Klassen in Greenfoot Java Basics - Anfänger-Themen 1
L Methoden Zugriff <identifier> expected Java Basics - Anfänger-Themen 13
T Java - Zugriff nur mit CLASSPATH ? Java Basics - Anfänger-Themen 7
B Klassen Zugriff auf ein Objekt einer Klasse aus einer Methode heraus Java Basics - Anfänger-Themen 4
L Zugriff auf Attribute eins Objekts über ActionListener Java Basics - Anfänger-Themen 4
D Zugriff auf Methode einer anderen Klasse Java Basics - Anfänger-Themen 5
S Zugriff auf Objekt Java Basics - Anfänger-Themen 5
A Klassen Zugriff auf Instanzen Java Basics - Anfänger-Themen 2
N ArrayList in eigener Klasse erzeugen mit Zugriff Java Basics - Anfänger-Themen 7
J Zugriff auf Variable in anderem Programm Java Basics - Anfänger-Themen 5
Q Zugriff auf Attribute Java Basics - Anfänger-Themen 3
J Klassen Zugriff auf ein "String Array" Java Basics - Anfänger-Themen 6
H Datentypen ArrayList in ArrayList: Zugriff Java Basics - Anfänger-Themen 6
J get methoden zugriff und objekt erzeugung Java Basics - Anfänger-Themen 30
J Datenbank Zugriff Java Basics - Anfänger-Themen 24
T Zugriff auf JCheckBox Java Basics - Anfänger-Themen 8
E Netzlaufwerk Zugriff schlägt fehl Java Basics - Anfänger-Themen 11
C Group, Actor und Instanz-Zugriff, LibGDX Java Basics - Anfänger-Themen 4
S Zugriff auf Attribut einer unbekannten Klasse erhalten Java Basics - Anfänger-Themen 6
R Methoden Methode der GUI-Klasse Zugriff auf Methoden der Hauptklasse Java Basics - Anfänger-Themen 9
S Vererbung Zugriff auf die Basisklasse einer "zweiten" Erweiterungsklasse Java Basics - Anfänger-Themen 2
Z Threads Threads - Zugriff auf Ressourcen ohne(Lock, Synchronized) Java Basics - Anfänger-Themen 2
S Vererbung Zugriff auf Methode funktioniert nicht (static/non-static) Java Basics - Anfänger-Themen 3
F Klassen Zugriff auf verschachtelte Objekte Java Basics - Anfänger-Themen 11
J Sichtbarkeit und Zugriff Java Basics - Anfänger-Themen 9
G Wieviel kostet der Zugriff auf Objektattribute im Vergleich zur Erstellung von vars in Methode? Java Basics - Anfänger-Themen 11
L Zugriff auf zwei Java-Quellcodes Java Basics - Anfänger-Themen 3
A OOP Zugriff auf Objekte von außen Java Basics - Anfänger-Themen 8
M Kapselung Datenkapselung Sinn direkter Zugriff? Java Basics - Anfänger-Themen 1
G Methoden Zugriff auf Methode.. aus einer anderen Klasse Java Basics - Anfänger-Themen 6
J JDialog Zugriff auf parent JDialog Java Basics - Anfänger-Themen 5
K Collections Zugriff auf ein bestimmtes Element in der Collection Java Basics - Anfänger-Themen 1
K ArrayList in Konstruktor - wie späterer Zugriff Java Basics - Anfänger-Themen 2
F Zugriff auf Objekt einer anderen Klasse Java Basics - Anfänger-Themen 7
P Zugriff auf Felder in ArrayList Objekten Java Basics - Anfänger-Themen 2
J Erste Schritte Zugriff auf Eigenschaft Java Basics - Anfänger-Themen 2
M MVC - Problem mit Zugriff auf Objekt Java Basics - Anfänger-Themen 4
D Zugriff auf von einer anderen Klasse erstellten Objekten Java Basics - Anfänger-Themen 5
C 5 - Zugriff verweigert Java Basics - Anfänger-Themen 1
K Zugriff auf Variabeln Wert einer Instanz Java Basics - Anfänger-Themen 4
A Methoden Zugriff auf eingelesene Variablen in der main Methode (ohne Änderung der Parameterliste) Java Basics - Anfänger-Themen 4
Z Methoden Zugriff mit Klasse 3 auf Methode von Klasse 2 welche in Klasse 1 erzeugt wird Java Basics - Anfänger-Themen 6
Z Zugriff auf andere Methoden Java Basics - Anfänger-Themen 12
Z Zugriff auf Pakete Java Basics - Anfänger-Themen 5
G Zugriff zwischen Klassen Java Basics - Anfänger-Themen 15
N Problem mit Swing Textfeld und Zugriff aus anderer Klasse Java Basics - Anfänger-Themen 6
H Kein Zugriff auf das Element einer JList möglich: Fehlermeldung Java Basics - Anfänger-Themen 2
W OOP Zugriff auf mit Objekt erstellte Struktur Java Basics - Anfänger-Themen 7
F Klassen Zugriff auf Fenster aus versch. Klassen Java Basics - Anfänger-Themen 5
U Methoden Zugriff auf Array von weiterer Methode einer Klasse, Rückgabewert Problem Java Basics - Anfänger-Themen 5
B Klassen Zugriff auf Daten der Child-Klasse Java Basics - Anfänger-Themen 9
W Typisierte ArrayList und der Zugriff auf den Typ Java Basics - Anfänger-Themen 5
M Zugriff auf Klasse Java Basics - Anfänger-Themen 2
K Zugriff auf C: Java Basics - Anfänger-Themen 5
S Das richtige Format für den SOAP Zugriff Java Basics - Anfänger-Themen 0
S Klassen Zugriff auf Attribute einer zweiten Klasse, welche durch dritte gesettet wurden? Java Basics - Anfänger-Themen 2
N Zugriff bei Package Struktur Java Basics - Anfänger-Themen 6
M Enum: Zugriff auf Konstanten Java Basics - Anfänger-Themen 7
V Zugriff auf jProgressbar Java Basics - Anfänger-Themen 10
B Zugriff auf csv-Datei per hashmap Java Basics - Anfänger-Themen 5
G Spalte in JTable unsichtbar machen, Zugriff auf Daten ermöglichen Java Basics - Anfänger-Themen 2
T ZUgriff auf 'Werte' Java Basics - Anfänger-Themen 3
J Vererbung Zugriff auf private Variable Java Basics - Anfänger-Themen 10
C Klassen Zugriff auf Objekt anderer Klasse Java Basics - Anfänger-Themen 8
B Methoden Zugriff auf Variable ermöglichen Java Basics - Anfänger-Themen 3
M Zugriff auf Arraylist Java Basics - Anfänger-Themen 7

Ähnliche Java Themen

Neue Themen


Oben