Correction exercice 3

Décompressez l’archive fournie ici

package rushhour.abstraction;

import java.util.ArrayList;
import java.util.List;

public class Vehicule implements IVehicule {
	// VARIABLES D'INSTANCES
	private int longueur; // le nombre de cases occupees par le vehicule
	private boolean orientation; // vaut IVehicule.HORIZONTALE ou IVehicule.VERTICALE
	private Case hautGauche; // la case la plus en haut a gauche occupee par le vehicule
	private int couleur;  //  la couleur exprimee au travers de la teinte.
	private String inscription; // l'inscription figurant sur le vehicule   

	/**
	 * Initialise this de sorte que :
	 * longueur soit le nombre de cases occupees par le vehicule designe par this, 
	 * orientation soit son orientation (Constante IVehicule.HORIZONTALE ou IVehicule.VERTICALE), 
	 * hautGauche soit la case la plus en haut a gauche qu'il occupe, 
	 * couleur soit l'entier designant sa teinte,
	 * et que inscription soit son inscription
	 * @param longueur
	 * @param orientation
	 * @param hautGauche
	 * @param couleur
	 * @param inscription
	 */
	public Vehicule(int longueur, boolean orientation, Case hautGauche, int couleur, String inscription) {
		this.longueur = longueur;
		this.orientation = orientation;
		this.hautGauche = hautGauche ; 
		this.couleur = couleur;
		this.inscription = inscription; 
	}
	/**
	 *  Retourne le nombre de cases occupees par le vehicule
	 * @return le nombre de cases occupees par le vehicule
	 */
	public int getLongueur() {
		return this.longueur;
	}
	/**
	 * Retourne l'orientation du vehicule (HORIZONTALE ou VERTICALE)
	 * @return l'orientation du vehicule (HORIZONTALE ou VERTICALE)
	 */
	public boolean getOrientation() {
		return this.orientation;
	}
	/**
	 * Retourne la liste des cases occupees par le vehicule en allant de la case la plus en haut a gauche occupee a la case la plus en bas a droite occupee. 
	 * @return la liste des cases occupees par le vehicule en allant de la case la plus en haut a gauche occupee a la case la plus en bas a droite occupee.
	 */
	@Override
	public List<Case> getCases() {
		List<Case> res = new ArrayList<Case>();
		if (this.orientation==IVehicule.HORIZONTALE){
			for(int i=0;i<this.longueur;i++){
				res.add(new Case(this.hautGauche.getCol()+i, this.hautGauche.getLig()));

			}
		} else {
			for(int i=0;i<this.longueur;i++){
				res.add(new Case(this.hautGauche.getCol(), this.hautGauche.getLig()+i));

			}

		}
		return res;
	}
	/**
	 * Retourne la teinte du vehicule
	 * @return la teinte du vehicule
	 */
	public int getCouleur() {
		return this.couleur;
	}
	/**
	 * Retourne l'inscription du vehicule
	 * @return l'inscription du vehicule
	 */
	public String getInscription() {
		return this.inscription;
	}


	/**
	 * Modifie le vehicule de sorte que la case la plus en haut a gauche qu'il occupe soit c
	 * Les autres caracteristiques (orientation, longueur, couleur et description) ne sont pas modifiees.
	 * @param c, une case de l'aire de jeu
	 */
	public void deplacerEn(Case c) {
		this.hautGauche = c;
	}

	/**
	 * Retourne true si le vehicule occupe (entre autres) la case c.
	 * @param c, une case de l'aire de jeu
	 * @return true si le vehicule occupe (entre autres) la case c.
	 */
	public boolean occupe(Case c) {
		return getCases().contains(c);
		// OU
		/*
		for(Case c1 : getCases())
		  if (c.equals(c1)) return true;
		return false
		*/
		// OU
		/*
		return ((this.orientation==IVehicule.HORIZONTALE)
				&& (this.hautGauche.getLig()==c.getLig()) 
				&& (this.hautGauche.getCol()<=c.getCol()) 
				&& (this.hautGauche.getCol()+this.longueur-1>=c.getCol())) 
		||((this.orientation()==IVehicule.VERTICALE)
				&& (this.hautGauche.getCol()==c.getCol()) 
				&& (this.hautGauche.getLig()<=c.getLig()) 
				&& (this.hautGauche.getLig()+this.longueur-1>=c.getLig())); 
		 */
	}
}
package rushhour.abstraction;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

public class Plateau implements IPlateau{
	// VARIABLES D'INSTANCE
	private int largeur ; // le nombre de colonnes du plateau
	private int hauteur ; // le nombre de ligne du plateau
	private Case sortie ; // la case correspondant a la sortie
	private List<IVehicule> vehicules ; // Les vehicules figurant sur le plateau

	/**
	 * Initialise le plateau this de sorte qu'il comporte
	 * largeur colonnes, hauteur lignes, une sortie a l'intersection de la colonne d'index
	 * colSortie et de la ligne d'index ligSortie, et les vehicules de la liste vehicules.
	 * @param largeur
	 * @param hauteur
	 * @param colSortie
	 * @param ligSortie
	 * @param vehicules
	 */
	public Plateau(int largeur, int hauteur, Case sortie, List<IVehicule> vehicules) {
		this.largeur = largeur;
		this.hauteur = hauteur;
		this.sortie = sortie; 
		this.vehicules = vehicules;
		if (this.vehicules==null) {
			System.out.println("VOUS DEVEZ FOURNIR AU CONSTRUCTEUR DE PLATEAU UNE LIST DE VEHICULES CREE A PARTIR DES DONNEES DE LA CARTE");
			this.vehicules=new ArrayList<IVehicule>();
		}
	}
	/**
	 * Retourne le nombre de colonnes du plateau
	 * @return le nombre de colonnes du plateau
	 */
	public int getLargeur() {
		return this.largeur;
	}
	/**
	 *  Retourne le nombre de lignes du plateau
	 * @return le nombre de lignes du plateau
	 */
	public int getHauteur() {
		return this.hauteur;
	}
	/**
	 *  Retourne la case correspondant a la sortie
	 * @return Retourne la case correspondant a la sortie
	 */
	public Case getSortie() {
		return this.sortie;
	}
	/**
	 * Retourne une liste de IVehicule contenant l'ensemble des vehicules figurant sur le plateau
	 * @return une liste de IVehicule contenant l'ensemble des vehicules figurant sur le plateau
	 */
	public List<IVehicule> getVehicules() {
		return this.vehicules;
	}
	
	/**
	 * Retourne true si la case c est situee dans les limites du plateau
	 * @param c, une case quelconque
	 * @return true si la case c est situee dans les limites du plateau. Sinon, retourne false.
	 */
	public boolean contient(Case c) {
		return c.getCol()>=0 && c.getCol()<this.largeur && c.getLig()>=0 && c.getLig()<this.hauteur;
	}
	/**
	 * Retourne true si le vehicule rouge (le premier dans la liste de vehicule) occupe la case de la sortie.
	 * Sinon, retourne false.
	 * @return Retourne true si le vehicule rouge (le premier dans la liste de vehicule) occupe la case de la sortie. Sinon, retourne false.
	 */
	public boolean solutionTrouvee() {
		IVehicule v =this.vehicule.get(0); 
		return v.occupe(this.sortie);
	}
	/**
	 *  Retourne le IVehicule qui occupe la case c (retourne null si aucun vehicule n'occupe la case c).
	 * @param c, une case de l'aire de jeu
	 * @return  le IVehicule qui occupe la case c (retourne null si aucun vehicule n'occupe la case c).
	 */
	public IVehicule vehiculeEn(Case c) {
		for(IVehicule v : this.vehicules)
			if (v.getCases().contains(c)) return v;
		return null;
		// OU
		/*
		for(IVehicule v : this.vehicules)
		  for(Case c1:v.getCases())
			if (c.equals(c1)) return v;
		return null;
		 */
		// OU
		/*
		IVehicule res = null;
		int pos=0;
		while (res==null && pos<this.vehicules.size()) { 
			if ((this.vehicule.get(pos).occupe(c))){
				res = this.vehicules.get(pos);
			}
			pos++;
		}
		return res;
		*/
	    // OU --- mais c'est hors programme 
//       Optional<IVehicule> vehicule = this.vehicules.stream().filter(v -> v.occupe(c)).findFirst();
//       return vehicule.orElse(null);
	}
}