Frage

Hallo Leute, ich habe diese Struktur für den Suchbaum

class State
{
    //CLASS STATE
    int value;
    char[][] state; //the game Grid 
    State child[]; // children of current state, maximum is 8
    State(char[][] src)
    {
        state=src;
        child=new State[8];
    }

Dies ist die Wurzelknotendefinition

 State rootNode = new State(currentGrid);
 rootNode.value=-1;
 int v =maxValue(rootNode,depth);

Nach dem Ende der Rekursion in der Max-Wert-Funktion sollte das Array in rootNode nicht bearbeitet werden, da es der erste Zustand ist, aber wenn ich es anzeige, erhalte ich ein Array voller Dinge, was bedeutet, dass der rootNode.state als Verweis auf den Max-Wert übergeben wird Funktion :(

//Ich versuche, den MiniMax-Algorithmus zu implementieren.

War es hilfreich?

Lösung

Wenn Sie nicht möchten, dass Objekte, die als Parameter übergeben werden, geändert werden, übergeben Sie eine Kopie (oder erstellen Sie eine Kopie des Parameters innerhalb der Methode).

Beachten Sie, dass char[][] bedeutet, dass Sie ein Array von char-Arrays haben, d. h.Sie arbeiten mit Objekten und wenn Sie die erste Ebene kopieren, haben Sie möglicherweise immer noch einen Verweis auf die zweite.

Daher müssen Sie möglicherweise die erste Ebene/Dimension durchlaufen und alle Arrays dort kopieren, etwa so:

char target[][] = new char[state.length][0];

for( int i = 0; i < state.length; ++i ) { 
  target[i] = Arrays.copyOf(state[i], state[i].length);
}

Andere Tipps

Bei Bedarf können Sie ganz einfach eine Kopie des Arrays erstellen Arrays.copyOf

Sie können auch eine tiefe Kopie erstellen.Wie das geht, wurde hier beantwortet: So kopieren Sie ein unregelmäßiges 2D-Array tief

Ja, Java übergibt Verweise auf Arrays und nicht auf das Array als Wert.Wenn Sie also einen Verweis auf Ihren internen Status weggeben, kann der Empfänger ihn ändern und die Änderung ist in der Quelle "sichtbar" (tatsächlich: Es wurde nur ein Array geändert und alle Referenzinhaberwird die Änderung sehen).

Schnellkorrektur / Lösung: Klonen Sie Ihr Statusarray und übergeben Sie anstelle des Originals einen Verweis auf diesen Klon.Dadurch bleibt Ihr interner Stammstatus unverändert.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top