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 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
| public static PartieChargee load(File file) throws IOException {
// on crée un echiquier virtuel pour vérifier le fichier pendant le chargement et préparé le jeu
Case[][] plateau = new Case[8][8];
//pour préparer les panneaux des pièces prises
List<Piece> pieceprisesParLesBlancs = new ArrayList<Piece>();
List<Piece> pieceprisesParLesNoirs = new ArrayList<Piece>();
// on ne charge pas directement dans l'echiquier au cas ou on aurait une erreur en plein milieu,
//on aura pas des données pourries dans l'échiquier
// on initialise l'échiquier virtuel
// on reprend le code de FenetreJeu : on pourrait faire une méthode en commun
char[] ordrePiece = { 'T', 'C', 'F', 'D', 'R', 'F', 'C', 'T' };
int increment = 1;
int ligne = 0;
Piece tempo = null;
String couleur=FenetreJeu.COULEUR_JOUEUR_BLANC;
// Je place les icones des pieces sur leur cases respectives
while (increment >= -1) {
for (int ctr = 0; ctr <= 7; ctr++) {
switch(ordrePiece[ctr])
{
case 'T':
tempo = new Tour(couleur);
break;
case 'C':
tempo = new Cavalier(couleur);
break;
case 'F':
tempo = new Fou(couleur);
break;
case 'D':
tempo = new Reine(couleur);
break;
case 'R':
tempo = new Roi(couleur);
break;
}
plateau[ctr][ligne]=new Case(tempo);
plateau[ctr][ligne + increment]=new Case(new Pion(couleur));
}
increment -= 2;
ligne = 7;
couleur=FenetreJeu.COULEUR_JOUEUR_NOIR;
}
List<Coup> coupsjoues = new ArrayList<Coup>(); // pour lire les coups dans le fichier
byte[] data=new byte[7]; // pour lire un coup dans le fichier
InputStream input = null;
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
plateau[coup.depart.getColonne()][coup.depart.getLigne()].setPiece(null);
plateau[coup.arrivee.getColonne()][coup.arrivee.getLigne()].setPiece(coup.piecejouee);
coup.piecejouee.enregistreDeplacement(true);
if ( coup.pieceprise!=null ) {
if ( FenetreJeu.COULEUR_JOUEUR_BLANC.equals(coup.couleur)) {
pieceprisesParLesBlancs.add(coup.pieceprise);
}
else {
pieceprisesParLesNoirs.add(coup.pieceprise);
}
}
// il y a le cas particulier du roque : on a sauvé que le mouvement du roi
if( coup.getPieceJouee() instanceof Roi ) {
int deplacementX=coup.getArrivee().getColonne()-coup.getDepart().getColonne();
if ( Math.abs(deplacementX)==2 ) {
// 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;
}
}
}
}
}
finally {
if ( input!=null ) {
try {
input.close(); // on ferme le fichier
} catch (IOException e) {
}
}
}
// on a pas eu d'erreur jusque là
// on peut construire notre affichage à partir des données chargés
Partie.reset();
Partie.coupsjoues.addAll(coupsjoues);
// on créé l'objet partiechargee pour retourner l'état de la partie chargée
PartieChargee partiechargee=new PartieChargee();
partiechargee.plateau=plateau;
partiechargee.pieceprisesParLesBlancs=pieceprisesParLesBlancs;
partiechargee.pieceprisesParLesNoirs=pieceprisesParLesNoirs;
return partiechargee;
} |