Eclispe m'a fait remplacer par cela...Code:
1
2
3 Couleur couleurAdverse=couleurControle.couleurAdverse(); Position positionRoiJoue = e.getPosition(Roi.class, couleurControle); ArrayList<Deplacement> menaceechec=new ArrayList<Deplacement>();
Merci
Version imprimable
Eclispe m'a fait remplacer par cela...Code:
1
2
3 Couleur couleurAdverse=couleurControle.couleurAdverse(); Position positionRoiJoue = e.getPosition(Roi.class, couleurControle); ArrayList<Deplacement> menaceechec=new ArrayList<Deplacement>();
Merci
c'est parce qu'il y avait un import java.awt.List qui ne servait à rien, alors qu'il faut un import java.util.List.
vire l'import java.awt.List et met java.util.List et tu pourra remettre List<Deplacement>
y'avait d'autres petites erreurs que j'ai corrigées depuis : reprend la dernière version dans le forum ce sera mieux
Merci,
C'est frustrant de ce dire que même la méthode facile , je n'y arrive guère!
regarde bien : on a fait ce genre de chose (plus ou moins) plusieurs fois déjà :
bon moi j'ai fait un raccourci pour aller plus vite (mais si tu avais repris un code qu'on a déjà fait plusieurs fois, par exemple pour marquer les coupPossible, tu aurais simplement balayer tout l'echiquier, et simuler le déplacement du roi vers chacune de ces cases, tester estValide, cheminPossible , etc... comme d'hab
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87 public boolean marqueRoiEchec() { boolean mat=false; Couleur couleurAdverse=couleurControle.couleurAdverse(); Position positionRoiJoue = e.getPosition(Roi.class, couleurControle); List<Deplacement> menaceechec=chercheEchec(positionRoiJoue, couleurAdverse); if ( !menaceechec.isEmpty() ) { // le roi est en echec // il est possiblement mat mat=true; Roi roi=(Roi) e.getCase(positionRoiJoue).getPiece(); // si le roi peut bouger vers une case non menacée, il n'est pas mat for(int dx=-1; dx<=1; dx++) { for(int dy=-1; dy<=1; dy++) { if ( dx==0 && dy==0 ) continue; // le roi ne bouge pas Position nouvellePositionRoi=positionRoiJoue.position(dx, dy); if (nouvellePositionRoi.getColonne()<0 || nouvellePositionRoi.getColonne()>7 || nouvellePositionRoi.getLigne()<0 || nouvellePositionRoi.getLigne()>7 ) { // on est en dehors de l'echiquier, on ignore continue; } Deplacement simuleDeplacementRoi=new Deplacement(positionRoiJoue, nouvellePositionRoi); if ( roi.estValide(simuleDeplacementRoi) && e.cheminPossible(simuleDeplacementRoi) && !e.captureParUnPionPossible(simuleDeplacementRoi)) { List<Deplacement> menaceechecnouvelleposition=chercheEchec(nouvellePositionRoi, couleurAdverse); if ( menaceechecnouvelleposition.isEmpty() ) { // il y a au moins une case vers laquelle le roi peut se déplacer // il n'y a pas mat mat=false; break; // c'est pas la peine de continuer à chercher } } } } if ( mat && menaceechec.size()==1 ) { // une seule pièce menace le roi // si cette pièce peut être mangé par une pièce du joueur courant, alors il n'y a pas echec et mat // on cherche si une pièce peut prendre la pièce if ( peutEtrePrise(menaceechec.get(0).getDepart())) { // la pièce qui menace le roi peut être prise mat=false; } else { // sinon si une pièce du joueur en echec peut bloquer la pièce qui menace le roi n'est pas amt // ... faire ce test (moins facile) } } else { // si une pièce du joueur en echec peut se placer (ou prendre une pièce adverse) de manière à ce que le roi // ne soit plus en echec, il n'a pas mat // ... faire ce test (le plus complexe des tests à faire) } } return mat; } private boolean peutEtrePrise(Position positionPiece) { Piece piece=e.getCase(positionPiece).getPiece(); if (piece==null) return false;// pas de pièce sur la position Couleur couleurAdverse=piece.getCouleur().couleurAdverse(); for(int colonne=0; colonne<8;colonne++) { for(int ligne=0; ligne<8;ligne++) { if (e.getCase(colonne,ligne).estOccupe(couleurAdverse)){ Deplacement simuleDeplacement=new Deplacement(new Position(colonne, ligne),positionPiece); if ((e.getCase(colonne,ligne).getPiece().estValide(simuleDeplacement) && e.cheminPossible(simuleDeplacement)) || e.captureParUnPionPossible(simuleDeplacement)){ return true; } } } } return false; } private List<Deplacement> chercheEchec(Position positionRoiJoue, Couleur couleurAdverse) { List<Deplacement> menaceechec=new ArrayList<Deplacement>(); for(int colonne=0; colonne<8;colonne++) { for(int ligne=0; ligne<8;ligne++) { if (e.getCase(colonne,ligne).estOccupe(couleurAdverse)){ Deplacement simuleDeplacementEchec=new Deplacement(new Position(colonne, ligne),positionRoiJoue); if ((e.getCase(colonne,ligne).getPiece().estValide(simuleDeplacementEchec) && e.cheminPossible(simuleDeplacementEchec)) || e.captureParUnPionPossible(simuleDeplacementEchec)){ tab[positionRoiJoue.getColonne()][positionRoiJoue.getLigne()].setCoupPossible(CoupPossible.echec); menaceechec.add(simuleDeplacementEchec); } } } } return menaceechec; }
La piece adverse est modélisé comment ?Code:
1
2
3
4 if(e.getPiece().getCouleur()!=(couleurControle)){ // sinon si une pièce du joueur en echec peut bloquer la pièce qui menace le roi n'est pas amt // ... faire ce test (moins facile) }
Merci
oui tu peux faire comme ça (sauf que Echiquier.getPiece() n'existe pas)
sinon j'ai fait une méthode couleurAdverse() : donc tu peux aussi faire
Code:piece.getCouleur().couleurAdverse()==couleurControle)
sinon j'ai encore un peu plus avancé :
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 Deplacement deplacementMenace=menaceechec.get(0); if ( peutEtrePrise(deplacementMenace.getDepart())) { // la pièce qui menace le roi peut être prise mat=false; } else { // sinon si une pièce du joueur en echec peut bloquer la pièce qui menace le roi n'est pas amt if ( !(e.getCase(deplacementMenace.getDepart()).getPiece() instanceof Cavalier) ) { // un cavalier ne peut etre bloqué if ( !(Math.abs(deplacementMenace.getDeplacementX())<=1 && Math.abs(deplacementMenace.getDeplacementY())<=1) ) { // un déplacement de une case ne peut etre bloquée // ... maintenant il faut simuler un déplacement de toutes les pièces autre que le roi vers toutes les cases du déplacement // et vérifier que ce déplacement est possible : s'il y en a un seul, alors mat=false // pour nous aider on va faire une méthode qui nous donne la liste de toutes les cases // ... } } }
on peut encore améliorer :
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
25for(int dx=-1; dx<=1; dx++) { for(int dy=-1; dy<=1; dy++) { if ( dx==0 && dy==0 ) continue; // pas de déplacement Position nouvellePositionRoi=positionRoiJoue.position(dx, dy); if (nouvellePositionRoi.getColonne()<0 || nouvellePositionRoi.getColonne()>7 || nouvellePositionRoi.getLigne()<0 || nouvellePositionRoi.getLigne()>7 ) { // on est en dehors de l'echiquier, on ignore continue; } if ( e.getCase(nouvellePositionRoi).estOccupe(roi.getCouleur()) ) { // on peut éliminer aussi : la case est occupée par une pièce de même couleur que le roi continue; } Deplacement simuleDeplacementRoi=new Deplacement(positionRoiJoue, nouvellePositionRoi); if ( roi.estValide(simuleDeplacementRoi) && e.cheminPossible(simuleDeplacementRoi) && !e.captureParUnPionPossible(simuleDeplacementRoi)) { List<Deplacement> menaceechecnouvelleposition=chercheEchec(nouvellePositionRoi, couleurAdverse); if ( menaceechecnouvelleposition.isEmpty() ) { // il y a au moins une case vers laquelle le roi peut se déplacer // il n'y a pas mat mat=false; break; // c'est pas la peine de continuer à chercher } } } }
Merci ,
if(Piece.getCouleur().couleurAdverse()==couleurControle))
GetCouleur pose problème... :cry:
oui Piece est nom de classe, donc Piece.getCouleur() serait une méthode statique de cette classe, qui n'existe pas
il faut faire :
il faut que tu acquières certains reflexes en javaCode:
1
2 Piece piece= ... quelque chose qui détermine une pièce qu'on veut traiter... je ne sais pas laquelle tu veux traiter... if ( piece.getCouleur().couleurAdverse()==couleurControl )...
quand je mets un extrait de code dans le post pour donner un exemple ce n'est pas à copier/coller et ça marche tout seul : il faut comprendre l'exemple, regarder quel contexte (la question à laquelle je réagis, mais aussi le code déjà écrit) :
déjà ici c'est piece et pas Piece ; en plus tu peux voir rapidement que getCouleur() n'est pas statique donc ce n'est pas un appel sur la classe : en plus ça n'aurait aucun sens : on veut la couleur d'une pièce en particulier pas de la classe Piece (ce serait quoi la couleur de la classe d'ailleurs ?)
voici la méthode qui va nous aider à savoir si on peut bloquer un déplacement de prise de roi,
attention : elle ne fonctionne pas pour le cavalier, mais de toute manière un cavalier ne peut être bloqué
cette méthode est à ajouter à la classe Deplacement :
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 public Position[] getPositions() { int dx = (int) Math.signum(deplacementX); int dy = (int) Math.signum(deplacementY); List<Position> positions = new ArrayList<Position>(); if ( dx==0 && dy==0 ) { positions.add(depart);//par précaution } else { Position position = depart; while (true) { positions.add(position); position = position.position(dx, dy); if (dx < 0 && position.getColonne() < arrivee.getColonne()) { break; } if (dx > 0 && position.getColonne() > arrivee.getColonne()) { break; } if (dy > 0 && position.getLigne() > arrivee.getLigne()) { break; } if (dy < 0 && position.getLigne() < arrivee.getLigne()) { break; } } } return positions.toArray(new Position[positions.size()]); }
on continue :
il reste la partie la plus complexe à faire, mais en fait il s'agit à priori d'une variante du cas qu'on a déjà fait pour le cas ou on avait qu'un seul déplacement: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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82 public boolean marqueRoiEchec() { boolean mat=false; Couleur couleurAdverse=couleurControle.couleurAdverse(); Position positionRoiJoue = e.getPosition(Roi.class, couleurControle); List<Deplacement> menaceechec=chercheEchec(positionRoiJoue, couleurAdverse); if ( !menaceechec.isEmpty() ) { // le roi est en echec // il est possiblement mat mat=true; Roi roi=(Roi) e.getCase(positionRoiJoue).getPiece(); // si le roi peut bouger vers une case non menacée, il n'est pas mat for(int dx=-1; dx<=1; dx++) { for(int dy=-1; dy<=1; dy++) { if ( dx==0 && dy==0 ) continue; // pas de déplacement Position nouvellePositionRoi=positionRoiJoue.position(dx, dy); if (nouvellePositionRoi.getColonne()<0 || nouvellePositionRoi.getColonne()>7 || nouvellePositionRoi.getLigne()<0 || nouvellePositionRoi.getLigne()>7 ) { // on est en dehors de l'echiquier, on ignore continue; } if ( e.getCase(nouvellePositionRoi).estOccupe(roi.getCouleur()) ) { // on peut éliminer aussi : la case est occupée par une pièce de même couleur que le roi continue; } Deplacement simuleDeplacementRoi=new Deplacement(positionRoiJoue, nouvellePositionRoi); if ( roi.estValide(simuleDeplacementRoi) && e.cheminPossible(simuleDeplacementRoi) && !e.captureParUnPionPossible(simuleDeplacementRoi)) { List<Deplacement> menaceechecnouvelleposition=chercheEchec(nouvellePositionRoi, couleurAdverse); if ( menaceechecnouvelleposition.isEmpty() ) { // il y a au moins une case vers laquelle le roi peut se déplacer // il n'y a pas mat mat=false; break; // c'est pas la peine de continuer à chercher } } } } if ( mat ) { if ( menaceechec.size()==1 ) { // une seule pièce menace le roi // si cette pièce peut être mangé par une pièce du joueur courant, alors il n'y a pas echec et mat // on cherche si une pièce peut prendre la pièce Deplacement deplacementMenace=menaceechec.get(0); if ( peutEtrePrise(deplacementMenace.getDepart())) { // la pièce qui menace le roi peut être prise mat=false; } else { // sinon si une pièce du joueur en echec peut bloquer la pièce qui menace le roi n'est pas amt if ( !(e.getCase(deplacementMenace.getDepart()).getPiece() instanceof Cavalier) ) { // un cavalier ne peut etre bloqué if ( !(Math.abs(deplacementMenace.getDeplacementX())<=1 && Math.abs(deplacementMenace.getDeplacementY())<=1) ) { // un déplacement de une case ne peut etre bloquée // et vérifier que ce déplacement est possible : s'il y en a un seul, alors mat=false parcourColonnes: for(int colonne=0; colonne<8;colonne++) { for(int ligne=0; ligne<8;ligne++) { if (e.getCase(colonne,ligne).estOccupe(couleurControle)){ // on parcourt toutes les cases du déplacement : for(Position pos : deplacementMenace.getPositions() ) { Deplacement simuleDeplacement=new Deplacement(new Position(colonne, ligne),pos); if ((e.getCase(colonne,ligne).getPiece().estValide(simuleDeplacement) && e.cheminPossible(simuleDeplacement)) ){ mat=false; break parcourColonnes; // pas la peine de continuer } } } } } } } } } else { // si une pièce du joueur en echec peut se placer (ou prendre une pièce adverse) de manière à ce que le roi // ne soit plus en echec, il n'a pas mat // ... faire ce test (le plus complexe des tests à faire) } } } return mat; }
à priori, je pense que si plusieurs pièces menacent le roi, si on prend une les autres continuent à menacer le roi : donc ce cas n'est pas à tester : le roi reste en echec donc le mat continue
le bloquage : existe t il un cas ou on peut bloquer toutes les pièces qui menacent le roi à la fois en un mouvement ?
en y réfléchissant vite fait, finalement, il n'y en a peut etre pas : du coup, le cas complexe n'existerait pas et on aurait terminé !
donc il faut réfléchir à cette question... la nuit étant là pour ça ;)
je viens de me rendre compte d'un cas que j'ai oublié dans le test qui cherche si on met le roi en echec : si le roi prend une pièce (on est en simulation, donc cette pièce reste dans l'echiquier, mais il ne faut pascontinuer àla tester)
on peut résoudre ce cas en ajoutant une condition sur un déplacement nul : si le roi prend une pièce : le déplacement de cette pièce vers le roi est nul,puisque le roi prend cette pièce (il se retrouve sur la case de cette pièce)
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15private List<Deplacement> chercheEchec(Position positionRoiJoue, Couleur couleurAdverse) { List<Deplacement> menaceechec=new ArrayList<Deplacement>(); for(int colonne=0; colonne<8;colonne++) { for(int ligne=0; ligne<8;ligne++) { if (e.getCase(colonne,ligne).estOccupe(couleurAdverse)){ Deplacement simuleDeplacementEchec=new Deplacement(new Position(colonne, ligne),positionRoiJoue); if ( !simuleDeplacementEchec.isNul() && (e.getCase(colonne,ligne).getPiece().estValide(simuleDeplacementEchec) && e.cheminPossible(simuleDeplacementEchec)) || e.captureParUnPionPossible(simuleDeplacementEchec)){ tab[positionRoiJoue.getColonne()][positionRoiJoue.getLigne()].setCoupPossible(CoupPossible.echec); menaceechec.add(simuleDeplacementEchec); } } } } return menaceechec; }
je crois qu'il est impossible que si le roi est en echec par plusieurs pièces adverses, on puisse en un mouvement supprimer la menace
déjà il y a peut être même pas de cas ou le roi peut etre en echec par plusieurs pièces : en y réfléchissant à part en déplaçant le roi vers une case menacée par plusieurs pièces adverses, je crois pas qu'il y ait de possibilités
donc à priori, on a tout nos cas
il suffit maintenant de faire :
(attention : ne pas le faire sur le cas du chargement, de toute manière on ne pourra jamais sauvegarder une partie après un echec et mat)Code:
1
2
3
4
5
6
7
8 if ( marqueRoiEchec() ) { if(JOptionPane.showConfirmDialog(null, "Felicitation vous avez gagne ! Desirez-vous jouer de nouveau ?\n", "Echec et mat!!!", JOptionPane.YES_NO_OPTION) == 0) { RAZ(); } else { System.exit(0); } }
j'ai fait quelques tests supplémentaires, et il y a un problème qui est du aux tests récursifs qui ne peuvent pas fonctionner car dans ce cas, on ne modifie pas l'echiquier
je travaille sur une solution et je t'envoie ça
bon ça été chaud là
pour pouvoir tester des mouvements simulés, on est obligé de faire le mouvement simulé, en gros, d'avoir un echiquier modifié
pour faire ça, sans modifier l'echiquier du jeu j'ai créé une méthode dans la classe Echiquier qui permet d'avoir une copie du jeu :
et donc il faut modifier nos méthodes de FenetreJeu en conséquenceCode:
1
2
3
4
5
6
7 public Echiquier copy() { Echiquier echiquier = new Echiquier(); for (int colonne = 0; colonne < 8; colonne++) for (int ligne = 0; ligne < 8; ligne++) echiquier.getCase(colonne, ligne).setPiece(getCase(colonne, ligne).getPiece()); return echiquier; }
plus simple de joindre le source complet plutôt que de copier plein de petits bouts
tiens je t'ai rajouté 2 petits trucs :
- un message de confirmation quand on recommence une partie déjà commencée
- l'annulation du dernier coup
reste plus que le pat ;)
Waww !
:applo:
Merci beaucoup !
Je vais passer ma journée a me le réexpliquer dans la tete
Encore merci pour tous.
Soucis :
- la reine a fait mat le roi mais il peut encore bougé ...
- on peut manger le roi
- J'ai des erreurs ici :
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at projet.Deplacement.<init>(Deplacement.java:30)
at projet.FenetreJeu.chercheEchec(FenetreJeu.java:639)
at projet.FenetreJeu.marqueRoiEchec(FenetreJeu.java:529)
at projet.FenetreJeu$GestionnaireEvenement.mouseClicked(FenetreJeu.java:383)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$200(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
Soit :
Code:
1
2
3
4
5
6
7public Deplacement(Position depart, Position arrivee) { this.arrivee = arrivee; this.depart = depart; this.deplacementX = arrivee.getColonne() - depart.getColonne(); this.deplacementY = arrivee.getLigne() - depart.getLigne(); }
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18private List<Deplacement> chercheEchec(Echiquier echiquier, Position positionRoiJoue, Couleur couleurAdverse) { List<Deplacement> menaceechec=new ArrayList<Deplacement>(); for(int colonne=0; colonne<8;colonne++) { for(int ligne=0; ligne<8;ligne++) { if (echiquier.getCase(colonne,ligne).estOccupe(couleurAdverse)){ Deplacement simuleDeplacementEchec=new Deplacement(new Position(colonne, ligne),positionRoiJoue); if ( !simuleDeplacementEchec.isNul() && (echiquier.getCase(colonne,ligne).getPiece().estValide(simuleDeplacementEchec) && echiquier.cheminPossible(simuleDeplacementEchec)) || echiquier.captureParUnPionPossible(simuleDeplacementEchec)){ if ( e==echiquier ) { // si c'est l'echiquier principal, on en profite pour marquer les cases tab[positionRoiJoue.getColonne()][positionRoiJoue.getLigne()].setCoupPossible(CoupPossible.echec); } menaceechec.add(simuleDeplacementEchec); } } } } return menaceechec; }
Code:
1
2
3
4
5
6
7
8
9
10public boolean marqueRoiEchec() { boolean mat=false; Couleur couleurAdverse=couleurControle.couleurAdverse(); Position positionRoiJoue = e.getPosition(Roi.class, couleurControle); List<Deplacement> menaceechec=chercheEchec(e,positionRoiJoue, couleurAdverse); if ( !menaceechec.isEmpty() ) { // le roi est en echec // il est possiblement mat mat=true; Roi roi=(Roi) e.getCase(positionRoiJoue).getPiece();
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22tab[colonne][ligne].setCoupPossible(CoupPossible.prise); }else if ( e.isRoquePossible(deplacement) ) { tab[colonne][ligne].setCoupPossible(CoupPossible.roque); } else { tab[colonne][ligne].setCoupPossible(null); } } } marqueRoiEchec(); } } else { //je cree un deplacement for (int ligne = 0; ligne < 8; ligne++) { for (int colonne = 0; colonne < 8; colonne++) { tab[colonne][ligne].setCoupPossible(null);
Merci
je le reproduis pas ce bug. Même si je sauvegarde cette partie et que je la recharge. Même en ayant recommencé plusieurs fois.
En plus j'ai pas les même numéro de ligne que toi, comme si tu avais modifié le code que je t'ai envoyé : tu as changé quelque chose ?
D'après ta trace, il y'aurait un cas de positionRoiJoue null.
Donc il y aurait un problème dans getPosition(Roi.class, couleurControle) : il chercherait le roi sans le trouver
ça le fait systématiquement à chaque fois que tu fais cette partie ?
essaye en déboguant ou en traçant de vérifier le contenu de ton echiquier ?
sinon tu fais peut etre une manip spéciale : tu a bien fait cette partie en F2F4, E7E6, G2G4, D8H4 ?
sinon tu fais peut etre une manip spéciale : tu a bien fait cette partie en F2F4, E7E6, G2G4, D8H4 ?
Oui
J'ai juste mis l'onglet Annuler coup avant terminé , rien de plus.
Si chez vous sa marche, pouvez vous me renvoyé le fichier s'il vous plais ?
Merci