| 12
 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;
	} |