Java OOP Array Problem

Jimbo.b

Semiprofi
Thread Starter
Mitglied seit
22.12.2006
Beiträge
3.119
ich habe ein kleines Problem mit einer Aufgabe.
Ich soll TicTacToe in Java realisieren. Das ganze soll natürlich objekorientiert sein und mit Hilfe von MVC realisiert werden.
So jetzt zu meinem Problem.
Ich habe in meiner Model Klasse ein privates String Array, welches ich z.B. mit der View Klasse auslesen und ausgeben möchte. Da das Array privat ist, kann ich es nicht einfach von außerhalb der Klasse auslesen.
Dafür müsste ich ja einen Konstruktor erstellen. Nur leider bekomm ich es nicht hin.
Kann mir jdm. weiterhelfen?
 
Wenn Du diese Anzeige nicht sehen willst, registriere Dich und/oder logge Dich ein.
Keine Ahnung was du genau machen willst.
Vielleicht sowas in dieser Richtung
Code:
public class model {

    private String[] field;

    public model() {

    }

    public String[] getField() {
        return this.field;
    }
}
 
Ich habe mir jetzt ne set & get Methode geschrieben
Code:
private int[][] Spielfeld = new int[3][3];
	private int aktuellerSpieler = 1;

	public void setSpielstein(int x, int y, int wertX, int wertY) {
		int [][] uebergabe = {{wertX},{wertY}};
		this.Spielfeld[x][y] = uebergabe[0][0]; 
	}
	
	public int getSpielfeld(int x, int y) {
		return Spielfeld[x][y];
	}

Hoffe mal damit funktioniert es :mad:
 
Was willst du in dem String speichern?

Ich behaupte jetzt einfach mal, dass du da versuchst eine Globale Variable (String Array) über eine Klasse zu realisieren. Das ist nicht sinn von OOP.

Ich würde eine Klasse für das Spielfeld anlegen. Der Konstruktor dieser Klasse legt 9 Felder (Objekte einer 2. Klasse) an und speichert diese in einem 2 dimensionalen privaten Array. Getter und Setter sind nicht nötig. Nach außen gibt es nur eine SetzeStein Funktion oder wie auch immer du sie nennen möchtest. Die 2. Klasse hat einen privat char in dem ein X oder ein O gespeichert werden kann. Dafür brauchst du dann einen Getter und Setter, den die Spielfeldklasse aufrufen kann. Der Setter muss vorher prüfen, ob das Feld schon belegt ist und gegebenfalls eine ensprechende Exception werfen.

Alles andere überlasse ich jetzt deiner Fantasie. Wollte dir nur mal ein kleinen Denkanstoß geben. Ich weiß wie gesagt nicht was du genau mit dem String Array vorhast.

Bezüglich MVC. Du kannst dir auch den Spaß machen und ein paar Javaklassen überschreiben. Man nehme eine JTable und überschreibe dessen Model. Das ist aber nicht so trivial wie man vieleicht glauben mag. Eine gute Note wär dir damit aber sicher.
 
Was willst du in dem String speichern?

Ich behaupte jetzt einfach mal, dass du da versuchst eine Globale Variable (String Array) über eine Klasse zu realisieren. Das ist nicht sinn von OOP.

Ich würde eine Klasse für das Spielfeld anlegen. Der Konstruktor dieser Klasse legt 9 Felder (Objekte einer 2. Klasse) an und speichert diese in einem 2 dimensionalen privaten Array. Getter und Setter sind nicht nötig. Nach außen gibt es nur eine SetzeStein Funktion oder wie auch immer du sie nennen möchtest. Die 2. Klasse hat einen privat char in dem ein X oder ein O gespeichert werden kann. Dafür brauchst du dann einen Getter und Setter, den die Spielfeldklasse aufrufen kann. Der Setter muss vorher prüfen, ob das Feld schon belegt ist und gegebenfalls eine ensprechende Exception werfen.

Alles andere überlasse ich jetzt deiner Fantasie. Wollte dir nur mal ein kleinen Denkanstoß geben. Ich weiß wie gesagt nicht was du genau mit dem String Array vorhast.

Bezüglich MVC. Du kannst dir auch den Spaß machen und ein paar Javaklassen überschreiben. Man nehme eine JTable und überschreibe dessen Model. Das ist aber nicht so trivial wie man vieleicht glauben mag. Eine gute Note wär dir damit aber sicher.

deinem post kann ich irgendwie nicht ganz folgen ^^

eine gute note sollte man eigtl nicht bekommen wenn man was total kompliziertes macht, sondern wenn man zu nem problem eine möglichst kurze und einfache lösung liefert

Code:
private int[][] Spielfeld = new int[3][3];
	private int aktuellerSpieler = 1;

	public void setSpielstein(int x, int y, int wertX, int wertY) {
		int [][] uebergabe = {{wertX},{wertY}};
		this.Spielfeld[x][y] = uebergabe[0][0]; 
	}
	
	public int getSpielfeld(int x, int y) {
		return Spielfeld[x][y];
	}

bin ich dumm oder versuchst du mit uebergabe in ein int feld ein int array zu speichern ?

und wofür brauchst du wertX und wertY ?
 
Zuletzt bearbeitet:
Ne du bist nicht doof eher ich^^

Da hab ich voreilig mist gemacht.
Die get und set Merhoden für mein Array sehen jetzt so aus.
Code:
	public void setSpielstein(int x, int y) {
		int Stein = 0;
		this.xWert = x;
		this.yWert = y;
		if (this.aktuellerSpieler == 1){
			Stein = 1;
		}else if(this.aktuellerSpieler == 2){
			Stein = 2;
		}
		this.Spielfeld[x][y] = Stein;
	}

	public int getSpielfeld(int x, int y) {
		return Spielfeld[x][y];
	}

Es funktioniert jetzt auch wunderbar. Ich kann von außerhalb meiner Klasse Werte in mein Array reinschreiben und auslesen.
 
was ich noch nicht ganz verstehe ist warum du immer "this." verwendest, das brauchst eigtl nicht

und warum machst du
Code:
if (this.aktuellerSpieler == 1){
			Stein = 1;
		}else if(this.aktuellerSpieler == 2){
			Stein = 2;
		}
		this.Spielfeld[x][y] = Stein;

und nicht einfach gleich:
Code:
		this.Spielfeld[x][y] = aktuellerSpieler;
 
Das ich das this nicht brauche weiß ich.
Nur hat mein Prof. gemeint wir sollen es immer hinschreiben, damit man sieht,
das es sich um lokale Klassenvariablen handelt.
So ganz zufrieden bin ich damit auch nicht. Es bläht den Quelltext eigentlich nur auf. Aber naja wenn er es so will, mach ich es eben.

Jetzt zu dem Anderen Fall:
Ich habe ein Int Array in meiner Klasse. 0 => Feld Frei, 1 => belegt durch Spieler1 und 2 => belegt durch Spieler2.
Also sage ich wenn Spieler 1 aktiv ist, dass er eine 1 ins array schreiben soll.
Und wenn Spieler 2 aktiv ist soll er einfach eine 2 reinschreiben.
 
und wenn das feld schon belegt ist, trotzdem den neuen spieler reinschreiben...

@burni
Das mit dem kompliziert liegt im Auge des Betrachters. Wenn man weiß wie es geht, ist es schnell gemacht. Der große Vorteil ist aber, dass man damit garantiert das MVC Konzept befolgd. Es bleibt einem auch nichts anders übrig. Die JTable besteht aus einem grafischen Element und einem dahinterliegenden Model. Einfach das Model überschreiben und schon macht es das was man will. Das dürfte in seinem Fall sogar sehr unkompliziert sein. Hab nur leider keine Zeit es jetzt auszuprobieren :(
 
und wenn das feld schon belegt ist, trotzdem den neuen spieler reinschreiben...

da schreibe ich noch eine methode die überprüft ob das feld noch frei ist.
Wenn das Feld gesetzt werden soll und schon eine 1 oder 2 drin steht kommt eben ne Meldung .......
 
und wenn das feld schon belegt ist, trotzdem den neuen spieler reinschreiben...

@burni
Das mit dem kompliziert liegt im Auge des Betrachters. Wenn man weiß wie es geht, ist es schnell gemacht. Der große Vorteil ist aber, dass man damit garantiert das MVC Konzept befolgd. Es bleibt einem auch nichts anders übrig. Die JTable besteht aus einem grafischen Element und einem dahinterliegenden Model. Einfach das Model überschreiben und schon macht es das was man will. Das dürfte in seinem Fall sogar sehr unkompliziert sein. Hab nur leider keine Zeit es jetzt auszuprobieren :(

ich find das schon kompliziert was du vorhast, zumal garnicht gesagt ist das es in eine jtable muss, mann kann es auch einfach in der konsole zweilenweise ausgeben
X | | O
---------
X | O |
---------
O | X |

als beispiel ;)

was mvc angeht ist ja hier eigtl sowieso alles klar: es gibt einen klasse die das ganze speichert (haben wir ja hier schon, model), eine klasse die überprüft ob das spiel schon beendet ist, falls einer gewonnen hat oder alles belegt ist (control) und eine die das einfach nur noch ausgibt (view)
 
Hardwareluxx setzt keine externen Werbe- und Tracking-Cookies ein. Auf unserer Webseite finden Sie nur noch Cookies nach berechtigtem Interesse (Art. 6 Abs. 1 Satz 1 lit. f DSGVO) oder eigene funktionelle Cookies. Durch die Nutzung unserer Webseite erklären Sie sich damit einverstanden, dass wir diese Cookies setzen. Mehr Informationen und Möglichkeiten zur Einstellung unserer Cookies finden Sie in unserer Datenschutzerklärung.


Zurück
Oben Unten refresh