19. oktober 2009 - 12:05Der er
8 kommentarer og 1 løsning
Værdier i obj ændres sig? Hvorfor!?
Hej Eksperter. Jeg har brug for hjælp til et mærkeligt problem, jeg ikke helt kan løse/forstå..?!
Jeg er i gang med en lille "kryds-og-bolle(TicTacToe)" app i Java, hvor man kan spille mod PC'en(AI). Her har jeg en CurrentPosition, som er et nutid billede af positionen, denne må ikke ændres, før jeg selv vælge det.
Jeg køre en recursive alphaBeta methode, når AI skal regne det bedste træk ud, her opretter den en 'new' position for hver træk mulighed... I det jeg ændre denne position, ændres også CuurenPosition(Den MÅ den IKKE) Men nu ændre de også CurrentPosition samtidigt(Det store spørgsmål???) Position indeholder en int[][] som er 3x3
Fra main køre jeg en test på alphaBeta metoden, hvor jeg checker træk muligheder(bestMoves) samt udskriver positionen.
Når jeg starter alphBeta metoden, bliver jeg nød til at hente position fra currentPosition, for at have et sted at starte fra.
Her main: ------------------------------ public static void main(String[] args) {
TicToe game = new TicToe(true);
game.currentPosition.print();
//udskriver alphaBeta sidste return value System.out.println("Last output: "+game.alphaBeta(new Position(game.currentPosition)));
// uskriver træk som AI har gemt(som der skal vælges fra, senere...) for (BestMove move : game.moves){
------------------------------ her alphaBeta metoden: ------------------------------ public int alphaBeta(Position gameposition){
int depth = 0; System.out.println(alpha); System.out.println(beta);
if(gameposition.isEndOfPosition()){
return gameposition.calcEndOfPosition();
}
// if Leaf node if(false){
int staticValue = gameposition.calcStaticValue();
return staticValue; }
// hvis det er AI i trækket if(gameposition.isMax()){
while(alpha < beta){
// for every child note possibel eller træk mulighed ud fra positionen for (int y = 0; y < 3; y++) for (int x = 0; x < 3; x++) { // Is there a free spot to set a piece if(gameposition.checkFreePlace(y, x)){
// ved træk, opret en ny position hvor trækket er med Position p = new Position(gameposition); //opdatere positionen me depth samt set til min(modstander træk) p.addDepth(); p.setPiece(1, y, x); p.setToMin(); // kalder sig selv med den NYE position int V = alphaBeta(p); //System.out.println(V); Når vi modtager en return value, set træk hvis vi er i depth 0 if(depth == 0) moves.addFirst(new BestMove(V, y, x));
hvis value er større end alph, udskift alpha(public int alpha) if(V > alpha) alpha = V;
}
} return alpha; } return alpha; }
if(gameposition.isMin()){
while(alpha < beta){
// for every child note possibel for (int y = 0; y < 3; y++) for (int x = 0; x < 3; x++) {
if(gameposition.checkFreePlace(y, x)){
Position p = new Position(gameposition); p.addDepth(); p.setPiece(-1, y, x); p.setToMax();
int V = alphaBeta(p);
if(V < beta) beta = V;
}
} return beta; } return beta;
}
System.out.println("ERROR in alphaBeta method"); return 0;
} ---------------------------------
Her en udskrift fra consolen: Her ses hvordan position har ændret sig! --------------------------------- ---------- |0|0|0| |0|0|0| |0|0|0| ----------
Okay, det er et reference problem jeg har med at gøre... måske har jeg sovet i timen, men hvordan undgår jeg så dette problem? Jeg vil ike hente en reference men skabe et 'nyt' object med samme datastruktur...
Når man har med værdier at gøre er der 2 type, man skal være opmærksom på.
Value types: Såsom int, char og andre. Struct er en value type. reference types: en reference til et obj. Class er en reference type.
I mit tilfælde var der tale om en reference type, derfor ændrede værdierne sig i min klasser.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.