Ik heb een probleem met de objecten in java. Ik ben een AI proberen te maken voor reversi. Ik zit met het probleem dat een deel van mijn object steeds ongevraagd gewijzigd wordt. Mijn code:
De klasse Move is niet meer dan drie variabelen die de x- en y-waarde van de zet opslaat en de totale waarde van de bordpositie. Ik heb deze klasse nodig, omdat ik een comparable implementatie nodig had die de Move-objecten ordent zodat ik een treeset kan gebruiken.
Als ik in een andere klasse de bestNextMove() functie wil aanroepen veranderd deze ook de velden-array in mijn oorspronkelijke klasse:
Dan wordt de velden array aangepast terwijl dit niet mag gebeuren. Ik heb twee keer een nieuw lokaal Spel-object gemaakt, stelling en evaluatie. Dus zou hij de velden array van het lokale object moeten wijzigen en niet ook nog eens van het spel-object in de andere klasse. Ik heb verder gecontroleerd in de console. Alle spel-objecten hebben een apart id, dus het zijn ook werkelijk verschillende objecten. Verder heb ik geprobeerd om de functie bestNextMove() in een andere klasse te zetten, ik heb hem static gemaakt en ik heb geprobeerd de velden-array private te maken. Het maakt niks uit. De functie rommelt altijd aan mijn velden-array en ik wil dat deze hetzelfde blijft en ik wil alleen de beste zet uitrekenen met hulp van mijn bordevaluatie functie.
Hier is de console wat hij met de beginstelling doet als ik de functie aanroep:
Je ziet de id's van de objecten en de posities geprint met tekenBord() functie. Voor de duidelijkheid zou ik dus willen dat er de volgende borden uitkwamen:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
| import java.util.*; public class Spel { byte[][] velden; //Hier worden de schijfjes opgeslagen int width_x, width_y; byte aanzet; boolean help; //Ik heb ook nog een constructor die alleen de breedte als argument nodig heeft. public Spel(int width, byte[][] i_velden, byte i_aanzet) { this.width_x = width; this.width_y = width; this.velden = i_velden; this.aanzet = i_aanzet; this.help = false; } //Heel veel functies en hulpfuncties die het prima doen, zoals eindeSpel(), doeZet(), aantalStukken(), tegenstanderAanzet(), zetMogelijk() enz. //... //... //... //Verder nog een tekenBord() functie die een reversi bord kan tekenen in de console //En als laatste heb ik een simpele bordEvaluatie() functie toegevoegd die een waarde toekent aan een bordpositie //Bij deze functie gaat het fout public Move bestNextMove(byte[][] startPositie, byte aanzet) { Spel stelling = new Spel(8, startPositie, aanzet); TreeSet<Move> moves = new TreeSet<Move>(); for(byte i=0; i<width_x; i++) for(byte j=0; j<width_y; j++) if(stelling.velden[i][j] == 0 || stelling.velden[i][j] == 3) if(stelling.isLegaleZet(i, j)) { Spel evaluatie = new Spel(8, stelling.velden, aanzet); //Hier verandert hij dus ook alle andere objecten ?? evaluatie.doeZet(i, j); byte value = evaluatie.bordEvaluatie(); moves.add(new Move(i, j, value)); } return moves.first(); } } |
De klasse Move is niet meer dan drie variabelen die de x- en y-waarde van de zet opslaat en de totale waarde van de bordpositie. Ik heb deze klasse nodig, omdat ik een comparable implementatie nodig had die de Move-objecten ordent zodat ik een treeset kan gebruiken.
Als ik in een andere klasse de bestNextMove() functie wil aanroepen veranderd deze ook de velden-array in mijn oorspronkelijke klasse:
Java:
1
2
3
4
5
6
7
8
| public class ShowGame extends Frame { Spel s; void paint(Graphics g){ s = new Spel(6); s.bestNextMove(s.showVelden(), s.aanzet()); } } |
Dan wordt de velden array aangepast terwijl dit niet mag gebeuren. Ik heb twee keer een nieuw lokaal Spel-object gemaakt, stelling en evaluatie. Dus zou hij de velden array van het lokale object moeten wijzigen en niet ook nog eens van het spel-object in de andere klasse. Ik heb verder gecontroleerd in de console. Alle spel-objecten hebben een apart id, dus het zijn ook werkelijk verschillende objecten. Verder heb ik geprobeerd om de functie bestNextMove() in een andere klasse te zetten, ik heb hem static gemaakt en ik heb geprobeerd de velden-array private te maken. Het maakt niks uit. De functie rommelt altijd aan mijn velden-array en ik wil dat deze hetzelfde blijft en ik wil alleen de beste zet uitrekenen met hulp van mijn bordevaluatie functie.
Hier is de console wat hij met de beginstelling doet als ik de functie aanroep:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
| Lokaal Spel-object stelling: Spel@1d85f79 1 . . . . . . 2 . . . . . . 3 . . 0 x . . 4 . . x 0 . . 5 . . . . . . 6 . . . . . . a b c d e f g h Lokaal Spel-object evaluatie: Spel@641e9a 1 . . . . . . 2 . . x . . . 3 . . x x . . 4 . . x 0 . . 5 . . . . . . 6 . . . . . . a b c d e f g h Ander lokaal Spel-object evaluatie: Spel@1c282a1 1 . . . . . . 2 . . x . . . 3 . . x x . . 4 . . x x x . 5 . . . . . . 6 . . . . . . a b c d e f g h Spel-object in de hoofdapplicatie s: Spel@157aa53 1 . . . . . . 2 . . x . . . 3 . . x x . . 4 . . x x x . 5 . . . . . . 6 . . . . . . a b c d e f g h |
Je ziet de id's van de objecten en de posities geprint met tekenBord() functie. Voor de duidelijkheid zou ik dus willen dat er de volgende borden uitkwamen:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
| Lokaal Spel-object stelling: Spel@1d85f79 1 . . . . . . 2 . . . . . . 3 . . 0 x . . 4 . . x 0 . . 5 . . . . . . 6 . . . . . . a b c d e f g h Lokaal Spel-object evaluatie: Spel@641e9a 1 . . . . . . 2 . . x . . . 3 . . x x . . 4 . . x 0 . . 5 . . . . . . 6 . . . . . . a b c d e f g h Ander lokaal Spel-object evaluatie: Spel@1c282a1 1 . . . . . . 2 . . . . . . 3 . . 0 x . . 4 . . x x x . 5 . . . . . . 6 . . . . . . a b c d e f g h //En er moet dus niets veranderen aan het oorspronkelijke object: Spel-object in de hoofdapplicatie s: Spel@157aa53 1 . . . . . . 2 . . . . . . 3 . . 0 x . . 4 . . x 0 . . 5 . . . . . . 6 . . . . . . a b c d e f g h |