Frage dazu Variablen klassenübergreifend zu verändern

Diskutiere Frage dazu Variablen klassenübergreifend zu verändern im Java Basics - Anfänger-Themen Bereich.
J

Josaria

Hallo,
ich arbeite momentan an einem Projekt, bei welchem ich einen char in unterschiedlichen Klassen verwende und sobald er sich in einer Klasse ändert, sollte er sich auch in allen anderen Klassen ändern, jedoch tut er das nicht, obwohl ich mit static arbeite.

Könnte mir da vielleicht jemand mit helfen?
 
T

temi

Meinst du unterschiedliche Klassen oder unterschiedliche Instanzen einer Klasse?

Ein wenig Code (minimaler Auszug der relevanten Teile) wäre nicht schlecht.
 
J

Josaria

Ein wenig Code (minimaler Auszug der relevanten Teile) wäre nicht schlecht.
[/QUOTE]

public static char aktiverspieler = 'x';

public void spielzug4 (int nr) {
if (aktiverspieler == 'x' && felder4[nr].isempty() && active) {
felder4[nr].setX();
System.out.println(aktiverspieler);
if (GewinnerX4()) {
aktiverspieler = 'o';
}
else {
aktiverspieler = 'o';
}

}
else if (aktiverspieler == 'o' && felder4[nr].isempty() && active) {
felder4[nr].setO();
System.out.println(aktiverspieler);
if (GewinnerO4() ) {
aktiverspieler = 'x';
}
else {
aktiverspieler = 'x';
}
}
}

andere Klasse:

static char seSpieler = Spiel4.aktiverspieler;

public void spielzug (int nr) {
if (seSpieler == 'x' && felder[nr].isempty() && active) {
felder[nr].setX();

if (GewinnerX() ) {
seSpieler = 'o';
}
else {
seSpieler = 'o';
if (computer) {
computerzug();
}
}
}
else if (seSpieler == 'o' && felder[nr].isempty() && active) {
felder[nr].setO();
System.out.println(derSpieler.getaktiverspieler());
if (GewinnerO() ) {
seSpieler = 'x';
}
else {
seSpieler = 'x';
}
}
}

(sorry, bin neu hier und weiß nicht, wie ich den Code richtig anzeigen lasse)
 
T

temi

Code bitte immer in Code-Tags setzen, damit das lesbar wird: Die drei Punkte neben dem Smiley - Code - Java

Du kannst deinen Beitrag auch bearbeiten.

Beschreibe mal was du erreichen möchtest.

static bei einem Attribut bewirkt, dass sich alle Instanzen dieser Klasse das Attribut sozusagen teilen:
Java:
class Foo {
    static int value;
}


Foo f1 = new Foo();

f1.value = 11; // value von f1.value ist jetzt 11

Foo f2 = new Foo();

f2.value = 42; // value von f1.value UND f2.value ist jetzt 42
Ich nehme allerdings an, dass das nicht ist, was du willst.
 
H

httpdigest

public static char aktiverspieler = 'x';
andere Klasse:
static char seSpieler = Spiel4.aktiverspieler;
Wenn du eine Variable `a` auf den Wert einer anderen Variablen `b` setzt, dann propagiert sich eine Änderungen der anderen Variable `b` nicht automatisch zu `a`.
Eine Möglichkeit wäre (wie oben schon gesagt), Observer. Oder du referenzierst eben überall nur die eine (und nur die eine) Variable.
 
J

Josaria

danke, erst mal

der aktive Spieler soll nach jedem Spielzug von X auf O oder von O auf X wecheln, auch, wenn der Spielzug in einer anderen Klasse erfolgt ist
 
T

temi

wiue würde ich ebendiesen genau programmieren?
Eventuell solltest du das Programmdesign noch einmal überdenken, so dass das gar nicht notwendig ist. Aber dazu wissen wir zuwenig, um hier eine gute Lösung anbieten zu können.

Evtl. kannst du ja grob beschreiben, welche Klassen wie miteinander interagieren?
 
J

Josaria

habe kein allzu großes Wissen über das, was ich hier mache, deswegen, tut mir leid, wenn das ein wenig... unprofessionell wird. Ich gebe mein Bestes.

Ich habe 9 Klassen, die jeweils ein Feld dessen steuern, was ich programmieren möchte. Diese sind sehr identisch aufgebaut, und nun muss ich sie für die nächsten Schritte mehr miteinander interagieren lassen.
Dazu habe ich eine Klasse, die das Grafische Interface steuert und eine, die Methoden für die 9 bereits erwähnten Klassen beinhaltet.
Und zuguterletzt nur noch eine Start Klasse (main), die... das Programm startet
 
T

temi

habe kein allzu großes Wissen über das, was ich hier mache
Das ist nicht gut...
Ich gebe mein Bestes.
Das ist gut!
Ich habe 9 Klassen, die jeweils ein Feld dessen steuern, was ich programmieren möchte.
Das solltest du etwas näher beschreiben. Ich tappe immer noch im Dunkeln darüber, was du eigentlich vor hast. Geraten: TicTacToe?
eine, die Methoden für die 9 bereits erwähnten Klassen beinhaltet.
Das klingt seltsam, weil die Klassen ja die Methoden haben sollten. Dafür sind es ja Klassen.
Dazu habe ich eine Klasse, die das Grafische Interface steuert
Das wiederum klingt gut.
 
Blender3D

Blender3D

Hallo,
ich arbeite momentan an einem Projekt, bei welchem ich einen char in unterschiedlichen Klassen verwende und sobald er sich in einer Klasse ändert, sollte er sich auch in allen anderen Klassen ändern, jedoch tut er das nicht, obwohl ich mit static arbeite.

Könnte mir da vielleicht jemand mit helfen?
Du meinst eine globale klassenübergreifende Variable? Im Allgemeinen sollte man so einen Programm Stil vermeiden (Kapselung Daten, Objekt orientiert .. ) . Wenn man das aber so haben möchte empfiehlt es sich ein Klasse für diese globalen Variablen zu benutzten. Die Klasse sollte mit ihrem Namen darauf hinweisen und die jeweilige globale Variable sollte mit einer Bemerkung zu Ihrem Zweck versehen sein und einen sprechenden Namen besitzen.
Java:
public class GLOBAL{
    public static char namederZweckBeschreibt = ' '; //  Bemerkung der den Grund der Varibale beschreibt
    ..
}
 
J

Josaria

Das solltest du etwas näher beschreiben. Ich tappe immer noch im Dunkeln darüber, was du eigentlich vor hast.
Ok, etwas allgeimeiner:
als ein schulisches Projekt arbeite ich an einem großen Tic Tac Toe (nicht das klassische, ich weiß nicht, ob ihr das kennt).
Anhand von Anleitungen habe ich das Grunggerüst für ein normales Tic Tac Toe Spiel programmiert und möchte dieses nun zu der großen Version ausbauen.
Dazu habe ich 9 klassische Tic Tac Toe Felder, die alle wunderbar funktionieren (die 9 Klassen), jedoch muss ich diese jetzt miteinander verlinken.

hilft das? Soll ich das System des Spieles beschreiben?
 
J

Josaria

Das sagt mir leider nichts.
9 3x3 Felder, man beginnt in der Mitte.
Wenn sein Symbol in das Feld links oben gemacht worden ist, so setzt der andere Spieler sein Symbol in das 3x3 Feld links oben. Je nachdem, wo dieser sein Symbol setzt, wandert man zum nächsten 3x3 Feld und so weiter.
Ziel ist es, drei Feld, in denen man gewonnen hat, senkrecht, waagerecht oder diagonal zu haben.
Verständlich?

Ein Feld ist ein einzelnes Feld des "3x3 Felds" oder handelt es sich um neun komplette 3x3 Felder?
ja, ein einzelnen 3x3 Feld
 
T

temi

Je nachdem, wo dieser sein Symbol setzt, wandert man zum nächsten 3x3 Feld und so weiter.
D.h. der Zug des zweiten Spielers bestimmt durch diese Zug in welchem Spielfeld der erste Spieler als nächstes setzen darf?

Setzt er in das Feld rechts unten (des ersten Spielfeldes), dann ist der nächste Zug im Spielfeld ganz rechts unten. Richtig?
 
J

Josaria

D.h. der Zug des zweiten Spielers bestimmt durch diese Zug in welchem Spielfeld der erste Spieler als nächstes setzen darf?

Setzt er in das Feld rechts unten (des ersten Spielfeldes), dann ist der nächste Zug im Spielfeld ganz rechts unten. Richtig?

genau, so springt man die ganze Zeit in den Feldern hin und her.
Das Spiel benötigt viel denken/ Planung, macht aber viel Spaß
 
T

temi

Warum müssen deshalb Spielfelder direkt miteinander interagieren?

Es geht doch im Prinzip nur darum, welches Spielfeld als nächstes aktiv ist und das erfährst du vom letzen aktiven Spielfeld, nachdem der Zug passiert ist. Mit der Info kannst du dann das nächste erlaubte Spielfeld aktivieren.

Den aktiven Spieler kennst du auch, dazu ist keine Aktion mit dem Spielfeld notwendig.
 
J

Josaria

Den aktiven Spieler kennst du auch, dazu ist keine Aktion mit dem Spielfeld notwendig.
bisher wurde der aktive Spieler automatisch nach einem Spielzug gewechselt, das Problem ist, dass jedes Feld seinen eigenen aktiven Spieler hat.
Das heißt, wenn ich in ein Feld X setzte, wird in das nächste Feld beim nächsten Zug auch ein X gesetzt, da der aktive Spieler nicht bei allen Felder geändert wird, sondern nur im aktuellen 3x3 Feld
 
T

temi

Noch einmal langsam:
  1. Spiel beginnt im mittleren Spielfeld
  2. Spieler 1 setzt dort in das rechte untere Feld.
  3. Spieler 2 ist am Zug, aktives Spielfeld ist rechts unten.
  4. Spieler 2 setzt dort in das untere mittlere Feld.
  5. Spieler 1 ist am Zug, aktives Spielfeld ist mittig unten.
  6. usw.
Die Spieler wechseln also unabhängig vom Feld immer ab, es wird nur immer ein anderes Spielfeld aktiv.

das Problem ist, dass jedes Feld seinen eigenen aktiven Spieler hat.
Das Problem ist, dass es genau so nicht ist, denn es gibt nur einen Spieler der gerade aktiv ist.

Das Spielfeld enthält normalerweise nur die 3x3 Matrix mit dem Inhalten: frei, X oder O. Genau diese Informationen braucht auch die GUI, um das Spielfeld zu zeichnen. Außerdem etwas Logik, damit auf ein Feld nur einmal gesetzt werden kann, usw.

Entweder sollte das Spielfeld den Spieler gar nicht kennen sondern nur Methoden haben wie setX(position), setO(position) oder set(position, X).

Oder du übergibst den aktiven Spieler für den Zug an das Spielfeld set(position, player).

Der Spielerwechsel erfolgt außerhalb des Spielfelds.
 
Thema: 

Frage dazu Variablen klassenübergreifend zu verändern

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben