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