ELI4 - 2011/2012 TP solitaire Programmation Orient´ee Objet - langage Java
TP solitaire Programmation Orient´ee Objet
Langage Java
Dur´ee 2h - Tous documents autoris´es
Remarques importantes
Ce TP s’effectue de mani`ere individuelle. Vous avez le droit d’utiliser l’ensemble des documents
que vous souhaitez, mais sachez que plus vous passez de temps `a chercher, moins de temps
vous aurez pour composez ! Pour ce TP, vous serez ´evalu´e non seulement sur le fonctionnement
de votre programme, mais aussi sur la fa¸con dont il est ´ecrit, en utilisant au maximum les
principes de la programmation objet. Les questions doivent ˆetre trait´ees dans l’ordre donc lisez
bien l’ensemble du sujet avant de commencer et n’h´esitez pas `a commenter votre code ! Testez
votre code au fur et `a mesure des questions.
Il n’est pas n´ecessaire, voire d´econseill´e, d’utiliser Netbeans. Utilisez plutˆot un ´editeur classique
de type gedit.
Mettez votre nom en commentaire en haut de chacun de vos fichiers.
A la fin de l’´epreuve, vous devez d´eposer vos sources dans votre boˆıte de d´epˆot sur Saka¨ı.
Pour commencer r´ecup´erez le fichier robots.java dans les ressources de Saka¨ı. Ce fichier permet
de tester votre programme.
Sujet
Le but de ce TP est de cr´eer une petite application permettant de simuler un monde dans lequel
vivent diff´erents types de robots. Ces robots ´evoluent sur un plateau de 10x10 cases et sont fixes
ou mobiles. Ils ont ´egalement la propri´et´e d’effectuer une action lorsqu’un autre robot entre en
collision avec eux. Chaque type de robot mobile est caract´eris´e par son d´eplacement (al´eatoire
pour les robots fous, suivant un autre robot pour les robots suiveurs...). Lorsqu’un autre robot
entre en collision avec eux, il s’arrˆete sur la case pr´ec´edente. Les robots fixes ne bougent pas,
mais ont une action plus importante sur les robots qui les cognent (les tuer pour les robots
tueurs, les expulser `a un coin du plateau pour les robots r´epulseurs...). Dans le cadre de ce TP,
on se contentera de mod´eliser les robots fous et les robots tueurs, mais la mod´elisation se fera
comme s’il y en avait d’autres.
Les robots sont caract´eris´es par leurs coordonn´ees sur le plateau, leur nom (”F” pour les robots
fous et ”T” pour les robots tueurs), s’ils sont vivants ou non et leur action en cas de collision.
Le robot mobile peut se d´eplacer d’une certaine distance selon une direction (nord, sud, est,
ouest).
Question 1
Ajouter `a l’interface graphique un bouton next qui permet de faire ´evoluer le plateau en appe-
lant les m´ethodes update() du monde et de l’interface.
Polytech’Paris-UPMC 1
ELI4 - 2011/2012 TP solitaire Programmation Orient´ee Objet - langage Java
Question 2
Etablir le diagramme de classes, avec leurs champs et m´ethodes permettant de d´ecrire les
diff´erents types de robots. Pour cette question il n’est pas demander de scema, le diagramme
sera visible `a la lecture du code. Votre mod´elisation devra tenir compte au maximum des
principes de programmation objet (h´eritage, surcharge...).
Question 3
Ecrire les constructeurs aux niveaux de hi´erarchie ad´equates. Pour obtenir un nombre al´eatoire
entre 0 et n-1, on utilise la m´ethode nextInt(n) qui s’applique sur un objet de type Random
d´efini dans le package java.util. Un objet de type Random utilise un constructeur sans pa-
ram`etre pour ˆetre cr´e.
Question 4
Ecrire le code permettant de d´eplacer un robot fou selon une direction al´eatoire.
Question 5
Ecrire le code correspondant `a l’action du robot tueur, qui est de tuer le robot qui entre en
collision avec lui.
Question 6
Ecrire le code correspondant `a l’action des robots mobiles, qui est de stopper le robot qui entre
en collision avec lui sur la case d’avant.
Question 7
Lorsque vous testez votre code, si un robot sort du plateau le programme s’arrˆete sur une
exception ArrayIndexOutOfBoundsException. Modifier le code de la m´ethode update() de la
classe Monde pour que cela ne se produise pas.
Polytech’Paris-UPMC 2
import java.util.ArrayList;
import java.util.Iterator;
import javax.swing.*;
import javax.swing.border.LineBorder;
import java.awt.*;
import java.awt.event.*;
// Les cases du plateau : les coordonnées et le robot présent
class Case{
static int xMax, yMax;
private int x, y;
private Robot r;
public Case(int x, int y){
this.x = x;
this.y = y;
r = null;
}
public Robot getRobot(){return r;}
public void setRobot(Robot r){this.r=r;}
public void removeRobot(){this.r=null;}
public boolean hasRobot(){return (r != null);}
}
// La classe Monde représente le monde cad les robots et le plateau
class Monde{
ArrayList<Robot> lesRobots = new ArrayList<Robot>();
Case [][] plateau;
public int xMax, yMax;
public Monde(int xMax, int yMax){
Case.xMax = this.xMax = xMax;
Case.yMax = this.yMax = yMax;
plateau = new Case[xMax][yMax];
// initialisation du plateau
for(int i=0;i < xMax;i++)
for(int j=0;j < yMax;j++)
plateau[i][j] = new Case(i,j);
// creation des robots
lesRobots.add(new RobotFou(2));
lesRobots.add(new RobotFou(2));
lesRobots.add(new RobotFou(2));
lesRobots.add(new RobotTueur());
lesRobots.add(new RobotTueur());
lesRobots.add(new RobotTueur());
lesRobots.add(new RobotTueur());
lesRobots.add(new RobotTueur());
lesRobots.add(new RobotTueur());
// mise à jour du plateau en fonction des positions des robots
for(Robot r : lesRobots){
int x = r.getX(), y = r.getY();
plateau[x][y].setRobot(r);
}
}
// update() permet de déplacer l’ensemble des robots et de mettre à jour le
plateau en conséquent
// elle est appelée à chaque nouvelle itération de la simulation
public void update(){
Robot r;
for(int i = 0; i < lesRobots.size(); i++){
r = lesRobots.get(i);
if(r instanceof RobotMobile){
mai 14, 13 13:42 Page 1/3robots.java int x = r.getX(), y = r.getY();
// déplacement du robot
((RobotMobile)r).deplace();
plateau[x][y].removeRobot();
// tant qu’il y a collision et que le robot n’est pas mort action du
robot déjà présent sur la case
while((plateau[r.getX()][r.getY()].hasRobot()) && (! r.isMort())){
plateau[r.getX()][r.getY()].getRobot().action(r);
}
// si le robot est mort on le supprime sinon on met à jour le plate
au
if(! r.isMort())
plateau[r.getX()][r.getY()].setRobot(r);
else
lesRobots.remove(r);
}
}
}
}
// L’interface graphique
class Interface extends JFrame{
private JLabel [][] grille = new JLabel[Case.xMax][Case.yMax];
private Monde monde;
public Interface(final Monde monde){
super("Le monde des robots");
this.monde = monde;
setBounds(100,100,400,300);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container pan = getContentPane();
pan.setLayout(new BorderLayout());
// le Jpanel p1 pour les boutons de commandes
// le Jpanel p2 pour l’affichage des robots
JPanel p1 = new JPanel(), p2 = new JPanel();
p1.setLayout(new FlowLayout());
p2.setLayout(new GridLayout(monde.xMax,monde.yMax));
pan.add(p1,BorderLayout.NORTH);
pan.add(p2,BorderLayout.CENTER);
// les robots sont une matrice de JLabel
for(int i=0;i < monde.xMax;i++)
for(int j=0;j < monde.yMax;j++){
grille[i][j] = new JLabel();
grille[i][j].setHorizontalAlignment(SwingConstants.CENTER);
grille[i][j].setBorder(LineBorder.createGrayLineBorder());
p2.add(grille[i][j]);
}
// update() permet d’afficher les robots dans les cases adéquates de la g
rille
update();
// Bouton next à ajouter pour faire évoluer le monde et l’interface
}
// Mise à jour de l’interface en fonction de la position des robots sur le p
lateau
private void update(){
for(int i=0;i < monde.xMax;i++)
for(int j=0;j < monde.yMax;j++)
if(monde.plateau[i][j].hasRobot())
grille[i][j].setText(monde.plateau[i][j].getRobot().getName());
else
grille[i][j].setText("");
}
}
mai 14, 13 13:42 Page 2/3robots.java
Printed by Roselyne Chotin Avot
Lundi mai 12, 2014 1/2robots.java
// Le main
public class robots{
public static void main(String [] args){
Monde monde = new Monde(10,10);
Interface fen = new Interface(monde);
fen.setVisible(true);
}
}
mai 14, 13 13:42 Page 3/3robots.java
Printed by Roselyne Chotin Avot
Lundi mai 12, 2014 2/2robots.java
1 / 4 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !