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.

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{
                           .....
                    }
Le problème survient dans une méthode static d'une autre classe

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.


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
			}
		}
	}
Je surligné en bleu les lignes qui me font dire qu'il y a un problème.

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