2016-06-17 5 views
-1

Ich versuche, eine KI für Tic Tac Toe zu bauen, das ist das erste Mal, dass ich irgendeine Art von KI mache, und ich habe Probleme herauszufinden, wie man die KI alle zu versuchen unterschiedliche Bewegung möglich für eine bestimmte Situation (Board). "E" sind leere Zellen und ich speichere ihre Indizes in einem Array namens "verfügbar". Die AI-Bewegung würde "O" in die nextBoard-Variable mit den Indizes einfügen, die von dem verfügbaren Array einmal zu jedem Zeitpunkt bereitgestellt werden. Diese Funktion ändert sowohl die nextBoard-Variable, mit der ich die nächste KI-Bewegung bewerten möchte, indem ich ihr eine Punktzahl gebe, als auch die reale Board-Variable, mit der ich den Status des Spiels auswerte. sie Modifizieren und keinen mit erwarteten Ausgangfür die Schleife, die das falsche Array ändert

function AiPossibleActions() { 
    available=[0,1,2,3,5,6,7,8]; 
    board=["E","E","E","E","X","E","E","E","E"]; 
    var nextBoard=board 
    for (var i=0; i<available.length; i++) { 
    nextBoard = board; 
    nextBoard[available[i]]="O"; 
    } 
    oMovesCount++ 
} 

Wenn ich die Funktion beider Variablen (nextBoard und board) ausgeführt werden.

//wrong output 
["O", "O", "O", "O", "X", "O", "O", "O", "O"] 

Der ideale Ausgangs dass für jede Iteration der Variablen nextBoard wäre gleich:

//1st iteration 
["O", "E", "E", "E", "X", "E", "E", "E", "E"] 
//2nd iteration 
["E", "O", "E", "E", "X", "E", "E", "E", "E"] 
//3rd iteration 
["E", "E", "O", "E", "X", "E", "E", "E", "E"] 
//4th iteration 
["E", "E", "E", "O", "X", "E", "E", "E", "E"] 
//5th iteration 
["E", "E", "E", "E", "X", "O", "E", "E", "E"] 
//6th iteration 
["E", "E", "E", "E", "X", "E", "O", "E", "E"] 
//7th iteration 
["E", "E", "E", "E", "X", "E", "E", "O", "E"] 
//8th iteration 
["E", "E", "E", "E", "X", "E", "E", "E", "O"] 
+2

Nun, das sollte Ihnen sagen, dass Sie tatsächlich das gleiche Array ändern, und dass Sie eine andere Möglichkeit finden müssen, eine Kopie zu erstellen, da klar eine bloße Zuweisung es nicht tut. –

+0

JavaScript speichert Objekt durch Referenz, nicht Wert, wenn Sie 'nextBoard = board' dann nextBard ist keine Kopie von board, es ** ist ** board. –

Antwort

1

Sie können das Problem des Objekts sind flache Kopien in Javascript haben, so

var nextBoard=board 

erstellt keine Kopie der Karte, sondern erstellt nur eine Kopie der Referenz auf das Array. Wenn Sie eine Kopie benötigen, können Sie möglicherweise slice verwenden, wie;

var nextBoard=board.slice() 

(und dann die gleiche innerhalb der Schleife), aber es wäre aufwendiger sein, wenn Ihr Array-Element selbst Objekte sind.

+0

Oder das Array ist ein 2D-Array. –

+0

Das funktioniert. Danke Soren. – vanpeta

Verwandte Themen