La même erreur...
Version imprimable
La même erreur...
Je n'ai que :
"Impossible de charger la partie"
je t'ai dit que j'aurais dû déclarer plateau de type Piece[][] au lieu de Case[][]
j'ai du avoir ça à l'esprit quand j'ai écrit ça cette nuit (petite fatigue passagère ;))
en fait il faut manipuler les pièces dans les cases iciCode:
1
2
3
4
5
6
7
8
9
10
11
12
13 // c'est un roque,il faut aussi bouger la tour if ( deplacementX<0 ) { // deplacement vers la gauche plateau[coup.arrivee.getColonne()+1][coup.arrivee.getLigne()]= plateau[0][coup.arrivee.getLigne()]; plateau[0][coup.arrivee.getLigne()]=null; } else { // deplacement vers la droite plateau[coup.arrivee.getColonne()-1][coup.arrivee.getLigne()]= plateau[7][coup.arrivee.getLigne()]; plateau[7][coup.arrivee.getLigne()]=null; }
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13 // c'est un roque,il faut aussi bouger la tour if ( deplacementX<0 ) { // deplacement vers la gauche plateau[coup.arrivee.getColonne()+1][coup.arrivee.getLigne()].setPiece( plateau[0][coup.arrivee.getLigne()].getPiece()); plateau[0][coup.arrivee.getLigne()].setPiece(null); } else { // deplacement vers la droite plateau[coup.arrivee.getColonne()-1][coup.arrivee.getLigne()].setPiece( plateau[7][coup.arrivee.getLigne()].getPiece()); plateau[7][coup.arrivee.getLigne()].setPiece(null); }
Ah oui j'ai pas regardé la console d'eclispe :
en rouge les erreurs :
Code:
1
2
3
4
5
6 private Piece decodePiece(byte code, Position position, int couleur, Case[][] plateau) throws IOException { Piece piece = plateau[position.getColonne()][position.getLigne()].getPiece(); byte codepiece = getCodePiece(piece); byte codecouleur = getCodeCouleur(couleur==1); if (codepiece==code && codecouleur==getCodeCouleur(FenetreJeu.COULEUR_JOUEUR_BLANC.equals(piece.getCouleur()))) return piece; throw new IOException();
Code:
1
2
3
4
5
6
7
8
9
10 public void decode(byte[] data, Case[][] plateau) throws IOException { // on vérifie le tableau data if ( data!=null && data.length>0 && data.length<8 ) { couleur=decodeToCouleur(data[0]); depart=new Position(decode(data[2]),decode(data[3])); arrivee=new Position(decode(data[4]),decode(data[5])); piecejouee=decodePiece(data[1],depart,data[0],plateau); pieceprise=decodePiece(data[6],arrivee,1-data[0],plateau); } else {
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 try { input=new BufferedInputStream(new FileInputStream(file));//on utilise un stream bufferisé pour ne pas a se soucier des octes // on parcourt le fichier, int read; while ( (read=input.read(data))!=-1 ) { if ( read<7 ) { // pas assez de données lu throw new IOException(); } Coup coup = new Coup(); coup.decode(data, plateau); coupsjoues.add(coup); // on joue virtuellement le coup
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 public void load() { JFileChooser filechooser = new JFileChooser(); filechooser.setFileSelectionMode(JFileChooser.FILES_ONLY); filechooser.setFileFilter( new FileNameExtensionFilter( "Partie de Jeu d'echec", "rcl", "rcl")); int returnVal = filechooser.showOpenDialog(this); if (returnVal == JFileChooser.APPROVE_OPTION) { File file=filechooser.getSelectedFile(); try { PartieChargee partieChargee = Partie.load(file); // on met à jour l'interface graphique a partir de partieChargée Coup dernierCoupJoue=Partie.getDernierCoupJoue();
Code:
1
2
3
4 public void actionPerformed(ActionEvent paramActionEvent) { load(); } });
Merci
java.io.IOException
at projet.Partie$Coup.decodePiece(Partie.java:144)
at projet.Partie$Coup.decode(Partie.java:131)
at projet.Partie.load(Partie.java:254)
at projet.FenetreJeu.load(FenetreJeu.java:512)
at projet.FenetreJeu$4.actionPerformed(FenetreJeu.java:219)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.AbstractButton.doClick(Unknown Source)
at javax.swing.plaf.basic.BasicMenuItemUI.doClick(Unknown Source)
at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(Unknown Source)
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)
ah non excuses moi j'avais pas vu que tu m'avais mis ça :
donc l'erreur c'est que soit la pièce est mal décodée, soit la couleur est mal décodée (ou mal encodée d'ailleurs)Code:
1
2
3
4
5
6 private Piece decodePiece(byte code, Position position, int couleur, Case[][] plateau) throws IOException { Piece piece = plateau[position.getColonne()][position.getLigne()].getPiece(); byte codepiece = getCodePiece(piece); byte codecouleur = getCodeCouleur(couleur==1); if (codepiece==code && codecouleur==getCodeCouleur(FenetreJeu.COULEUR_JOUEUR_BLANC.equals(piece.getCouleur()))) return piece; throw new IOException();
il y'a déjà un petit problème dans cette ligne : si la piece est null :
donc il faut faire :
Code:if (codepiece==code && (codepiece==0 || codecouleur==getCodeCouleur(FenetreJeu.COULEUR_JOUEUR_BLANC.equals(piece.getCouleur())))) return piece;
Pourtant j'ai tout :
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
88
89
90
91
92
93
94
95
96
97
98 public static class Coup { private String couleur; private Piece piecejouee; private Position depart, arrivee; private Piece pieceprise; public String getCouleur() { return couleur; } public Piece getPieceJouee() { return piecejouee; } public Position getDepart() { return depart; } public Position getArrivee() { return arrivee; } public Piece getPiecePrise() { return pieceprise; } public byte[] encode(){ byte[] data=new byte[7];// on créé un tableau de 7 octets data[0]=getCodeCouleur(FenetreJeu.COULEUR_JOUEUR_BLANC.equals(couleur));//couleur data[1]=getCodePiece(piecejouee); // code piece data[2]=getCode(depart.getColonne()); // colonne départ data[3]=getCode(depart.getLigne()); // ligne départ data[4]=getCode(arrivee.getColonne()); // colonne arrivée data[5]=getCode(arrivee.getLigne()); // ligne arrivée data[6]=getCodePiece(pieceprise); // code piece return data; } private byte getCodeCouleur(boolean blanc) { return (byte) (blanc?1:0); // 1 = blanc, 0 = noir } private byte getCode(int value) { return (byte) value; } private byte getCodePiece(Piece piecejouee) { if ( piecejouee instanceof Roi ) { return 'R'; } else if ( piecejouee instanceof Reine ) { return 'D'; } else if ( piecejouee instanceof Tour ) { return 'T'; } else if ( piecejouee instanceof Fou ) { return 'F'; } else if ( piecejouee instanceof Cavalier ) { return 'C'; } else if ( piecejouee instanceof Pion ) { return 'P'; } return 0; // pas de pièce } public void decode(byte[] data, Case[][] plateau) throws IOException { // on vérifie le tableau data if ( data!=null && data.length>0 && data.length<8 ) { couleur=decodeToCouleur(data[0]); depart=new Position(decode(data[2]),decode(data[3])); arrivee=new Position(decode(data[4]),decode(data[5])); piecejouee=decodePiece(data[1],depart,data[0],plateau); pieceprise=decodePiece(data[6],arrivee,1-data[0],plateau); } else { throw new IOException(); } } private Piece decodePiece(byte code, Position position, int couleur, Case[][] plateau) throws IOException { Piece piece = plateau[position.getColonne()][position.getLigne()].getPiece(); byte codepiece = getCodePiece(piece); byte codecouleur = getCodeCouleur(couleur==1); if (codepiece==code && (codepiece==0 || codecouleur==getCodeCouleur(FenetreJeu.COULEUR_JOUEUR_BLANC.equals(piece.getCouleur())))) return piece; throw new IOException(); } private int decode(byte value) throws IOException { if ( value>=0 && value<8 ) { return value; } throw new IOException(); } private String decodeToCouleur(byte code) throws IOException { if ( code==1 ) return FenetreJeu.COULEUR_JOUEUR_BLANC; else if ( code==0 ) return FenetreJeu.COULEUR_JOUEUR_NOIR; else throw new IOException(); } }
Si vous ne trouvez pas , ce n'est pas grave..
Si on termine l'échec et mat on y reviendra sinon tempis..
C'est déjà énorme où on en es arrivé en moins d'une semaine..
j'ai testé unitairement le codage et le décodage c'est bon
le problème doit être dans la simulation de jeu,
faut que je sorte là je me repencherai la dessus plus tard : renvoit moi éventuellement tout le code que tu as, que je reparte sur une base solide, et le fichier de sauvegarde que tu as fait et que tu n'arrives pas à recharger
pour l'echec et mat je t'ai donné déjà toute les règles, tu dois pouvoir commencer
ah oui j'oubliais j'ai oublié l'initialisation du plateau dans load(File) de Partie :
Code:
1
2
3
4
5
6
7 Case[][] plateau = new Case[8][8]; //initialisation des case for(int colonne=0;colonne<8;colonne++) { for(int ligne=0;ligne<8;ligne++) { plateau[colonne][ligne]=new Case(); } }
Je viens de modifier et j'ai toujours les mêmes erreurs.
Je vous ai joint les fichiers.
Merci
bon j'ai corrigé le problème : c'était le jeu virtuel qui était mal initialisé
j'ai un peu nettoyer le code pour que ça soit plus simple parce qu'il y avait plein de petit bug, lorsqu'on recommençait une partie, ou qu'on chargeait plusieurs parties,
j'ai fait différent test de partie, je dis pas qu'il y a plus de bugs (c'est impossible à le savoir), j'ai pas tout retester, il faudrait tester une sauvegarde et un chargement de partie avec roque par exemple, avec echec au roi.
pour ce soir j'en ai un peu marre, je m'arrête là. je verrai plus tard pour la suite. je ferai plus de tests de sauvegarde/chargement, et je verrai pour le mat
Du grand art...
Merci beaucoup !
Je vais continuer l'échec et mat .
Bonne soiréee
Merci
Il faudrait repérer la place du roi et regarder autour de lui s'il peux encore bougé non ?Code:
1
2
3
4
5
6
7
8
9
10
11
12
13 public void marqueRoiEchec() { Couleur couleurAdverse=couleurControle.couleurAdverse(); Position positionRoiJoue = e.getPosition(Roi.class, couleurControle); 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); } } } }
J'ai peu être pas compris alors...
J'ai oublié de précisé , j'ai du apprendre a jouer pour faire ce projet 8O
oui, mais ce n'est pas tout
je t'ai déjà expliqué :
1) le roi est en echec et mat, si il est en echec, et que si il bouge il reste en echec
2) mais si on peut bouger une pièce de manière à ce que le roi ne soit plus en echec, il n'y a pas mat
c'est sur que ça aide de connaitre les règles de gestion qu'on doit implémenter
voilà un canevas pour t'aider :
commence par les faciles evidemmentCode:
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 public boolean marqueRoiEchec() { boolean mat=false; Couleur couleurAdverse=couleurControle.couleurAdverse(); Position positionRoiJoue = e.getPosition(Roi.class, couleurControle); 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); } } } } if ( !menaceechec.isEmpty() ) { // le roi est en echec // si le roi peut bouger vers une case non menacée, il n'est pas mat // ... faire ce test ici (facile) 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 // ... faire ce test (facile) // 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; }
voici de quoi t'avancer un petit peu :
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 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++) { 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 ) { // on n'est pas encore sur que le roi n'est pas 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 // ... faire ce test (facile) // 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 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; }