Bonsoir à tous, tout d'abord je tiens à m'excuser de ne pas pouvoir mettre la totalité du code ça serait trop volumineux et pas très productif je pense^^
Je vous explique mon problème
J'ai dans une classe intersection la méthode suivante permettant de déterminer si oui ou non on peut poser la pierre r sur l'intersection.
Le problème survient dans une méthode static d'une autre classe
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 public boolean isPlayable(Rock r,Goban g){ if(this.contenu!="."){ return false; } if(this.getNbLiberteIntersection(g)>0){ return true; }else{ ..... }
Ne cherchez pas spécialement de logique à cette méthode, c'était principalement pour faire des tests
A noter que p est une variable globale de ma classe.
Je surligné en bleu les lignes qui me font dire qu'il y a un problème.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 public static void playIntelligentIA(){ p=new Partie(9); Intersection[] i= p.g.getPlateau(); //Le joueur commence ==> Initialisation Rock rock1; int r1; int c1; do{ r1=p.j1.askRow(); c1=p.j1.askColumn(); rock1=new Rock(p.j1.getColor(), r1, c1, p.g); }while(!i[rock1.getNumIntersection(p.g)].isPlayable(rock1,p.g)); Position unePos=new Position(r1,c1); Coup unCoup=new Coup(unePos,rock1); Arbre myTree=new Arbre(unCoup); //A ce stade là le joueur a simplement joué un coup //On récupère toutes les intersection encore vide ArrayList<Intersection> liste=p.g.intersecEmpty(); for(int k=0;k<liste.size();k++){ //Pour chaque intersection vide Intersection i2=liste.get(k); Rock rock2=new Rock(p.j2.getColor(),i2.getRow(),i2.getColumn(), p.g); System.out.println("Inter "+i2.getRow()+"-"+i2.getColumn()+" "+i2.isPlayable(rock2, p.g) +" liberteIntersect "+i2.getNbLiberteIntersection(p.g)); //Ici j'affiche les informations sur l'intersection à savoir coordonnée + liberte Position po=new Position(i2.getRow(),i2.getColumn()); if(i2.isPlayable(rock2,p.g)){ Coup c2=new Coup(po,rock2); myTree.addNext(c2); int val=myTree.endPartieAleat(); for(int k2=0;k2<2;k2++){ p=myTree.resetPartie(); myTree=myTree.rezArbreAtlevel(2); val=myTree.endPartieAleat(); //On simule n fois la partie à partir du niveau deux pour remonter la value } p=myTree.resetPartie(); myTree=myTree.rezArbreAtlevel(1); //On remonte au niveau 1 et on refait 3 simulation à partir d'une //autre intersection libre: 1 pour second tour } } }
Tout d'abord sur l'affichage
Inter "+i2.getRow()+"-"+i2.getColumn()+" "+i2.isPlayable(rock2, p.g)+" liberteIntersect
"+i2.getNbLiberteIntersection(p.g))
Le boolean isPlayable va me renvoyer false avec une liberté intersection supérieure à 0.
Donc par une exécution donnerait
Je joue mon premier coup X en 1-1 en tant que joueur.
Ensuite, je passe ma première intersection à l'IA qui va jouer un 0
Inter 0-1 true liberteIntersect 2
1 2 3 4 5 6 7 8 9
1 X O . . . . . . .
2 . . . . . . . . .
3 . . . . . . . . .
4 . . . . . . . . .
5 . . . . . . . . .
6 . . . . . . . . .
7 . . . . . . . . .
8 . . . . . . . . .
9 . . . . . . . . .
Là encore tout se passe bien
Sauf que dès que l'on va passer aux intersections suivantes, les résultats ne sont plus du tout logique
Inter 0-2 false liberteIntersect 3
Inter 0-3 false liberteIntersect 3
Inter 0-4 false liberteIntersect 3
Inter 0-5 false liberteIntersect 3
Inter 0-6 false liberteIntersect 3
Inter 0-7 false liberteIntersect 3
Inter 0-8 false liberteIntersect 2
Inter 1-0 true liberteIntersect 2
1 2 3 4 5 6 7 8 9
1 X . . . . . . . .
2 O . . . . . . . .
3 . . . . . . . . .
4 . . . . . . . . .
5 . . . . . . . . .
6 . . . . . . . . .
7 . . . . . . . . .
8 . . . . . . . . .
9 . . . . . . . . .
Mais si je relance le programme..la série ne sera pas forcement la même.
Par exemple
NOIR Ligne:
1
NOIR Colonne:
1
Inter 0-1 true liberteIntersect 2
Nouvelle intersection
1 2 3 4 5 6 7 8 9
1 X O . . . . . . .
2 . . . . . . . . .
3 . . . . . . . . .
4 . . . . . . . . .
5 . . . . . . . . .
6 . . . . . . . . .
7 . . . . . . . . .
8 . . . . . . . . .
9 . . . . . . . . .
Inter 0-2 false liberteIntersect 3
Inter 0-3 true liberteIntersect 3
Nouvelle intersection
1 2 3 4 5 6 7 8 9
1 X . . O . . . . .
2 . . . . . . . . .
3 . . . . . . . . .
4 . . . . . . . . .
5 . . . . . . . . .
6 . . . . . . . . .
7 . . . . . . . . .
8 . . . . . . . . .
9 . . . . . . . . .
J'avoue ne vraiment pas comprendre la source du problème...au début je me disais que la variable de partie étant globale, je devais mal la réinitialiser..mais je ne vois pas pourquoi ce serait le cas...
Le reset de la partie réinstancie la partie donc ça ne devrait pas poser de problèmes..;
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 public Partie resetPartie(){ p=new Partie(9); return p; }
Quand à la méthode qui remonte l'arbre à un certain niveau elle fonctionne bien puisque vous voyez les les coups de 0 sont bien différent.
Le problème vient bien de l'intersection...il doit rester des résidus des parties simulés je ne vois que ça comme cause...mais même ça je ne comprends pas d'ou ça pourrait venir..
Merci pour votre aide, je ne vois vraiment plus ce qui peut causer ce problème..
EDIT: Problème résolu, en réalité, c'était toujours le même problème d'adressage d'objet..ma liste d'intersection était bien vide au début, mais comme elle pointait toujours sur le premier objet elle gardait les anciennes valeurs...il suffisait donc d'actualiser la liste à l'intérieur de la boucle pour prendre en compte les modifications et la remonté d'arbre...Une nuit blanche mais au moins lle bug est résolu :d
Partager