From 371c3aea80aa909c1ea7ef218757caf6f8c463dc Mon Sep 17 00:00:00 2001 From: Simon Saye Babu Date: Wed, 26 Apr 2023 11:00:04 +0200 Subject: [PATCH] =?UTF-8?q?maj=20avant=20tp=20not=C3=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DEV2.1/TP4/Moyenne.java | 8 +- DEV2.1/TP5/Attente.java | 25 ++++++ DEV2.1/TP5/Fond.class | Bin 0 -> 953 bytes DEV2.1/TP5/Fond.java | 32 +++++++ DEV2.1/TP5/Maintamere.class | Bin 0 -> 611 bytes DEV2.1/TP5/Maintamere.java | 19 ++++ DEV2.1/TP5/main666.java | 19 ++++ DEV2.1/TP6/MonInt.class | Bin 0 -> 2172 bytes DEV2.1/TP6/MonInt.java | 113 ++++++++++++++++++++++++ DEV2.1/TP6/v0/Carte.java | 145 +++++++++++++++++++++++++++++++ DEV2.1/TP6/v0/EnsembleCarte.java | 142 ++++++++++++++++++++++++++++++ DEV2.1/TP6/v0/Joueur.java | 95 ++++++++++++++++++++ DEV2.1/TP6/v0/Table.java | 123 ++++++++++++++++++++++++++ DEV2.1/TP6/v0/TestCarte.java | 85 ++++++++++++++++++ DEV2.1/TP6/v0Memory.zip | Bin 0 -> 9692 bytes WEBBE/TP1/bonjour.php | 6 ++ WEBBE/TP2/exo1.php | 50 +++++++++++ 17 files changed, 861 insertions(+), 1 deletion(-) create mode 100644 DEV2.1/TP5/Attente.java create mode 100644 DEV2.1/TP5/Fond.class create mode 100644 DEV2.1/TP5/Fond.java create mode 100644 DEV2.1/TP5/Maintamere.class create mode 100644 DEV2.1/TP5/Maintamere.java create mode 100644 DEV2.1/TP5/main666.java create mode 100644 DEV2.1/TP6/MonInt.class create mode 100644 DEV2.1/TP6/MonInt.java create mode 100644 DEV2.1/TP6/v0/Carte.java create mode 100644 DEV2.1/TP6/v0/EnsembleCarte.java create mode 100644 DEV2.1/TP6/v0/Joueur.java create mode 100644 DEV2.1/TP6/v0/Table.java create mode 100644 DEV2.1/TP6/v0/TestCarte.java create mode 100644 DEV2.1/TP6/v0Memory.zip create mode 100644 WEBBE/TP1/bonjour.php create mode 100644 WEBBE/TP2/exo1.php diff --git a/DEV2.1/TP4/Moyenne.java b/DEV2.1/TP4/Moyenne.java index 692d2d6..699f6b4 100644 --- a/DEV2.1/TP4/Moyenne.java +++ b/DEV2.1/TP4/Moyenne.java @@ -44,6 +44,12 @@ public class Moyenne { public static void main(String[] args) { - + Moyenne test = new Moyenne(); + test.add(10); + test.add(20.0); + test.add(); + + + } } \ No newline at end of file diff --git a/DEV2.1/TP5/Attente.java b/DEV2.1/TP5/Attente.java new file mode 100644 index 0000000..850bce4 --- /dev/null +++ b/DEV2.1/TP5/Attente.java @@ -0,0 +1,25 @@ +import javax.swing.*; +import java.awt.*; +import java.awt.event.*; + +public class Attente extends JComponent implements WindowListener { + @Override + protected void paintComponent(Graphics pinceau) { + Graphics secondPinceau = pinceau.create(); + if (this.isOpaque()) { + secondPinceau.setColor(Color.GREEN); + secondPinceau.fillRect(0, 0, this.getWidth(), this.getHeight()); + } + } + + void windowActivated(WindowEvent evenement) // premier plan + { + + } + void windowClosed(WindowEvent evenement); // après fermeture + void windowClosing(WindowEvent evenement); // avant fermeture + void windowDeactivated(WindowEvent evenement); // arrière-plan + void windowDeiconified(WindowEvent evenement); // restauration + void windowIconified(WindowEvent evenement); // minimisation + void windowOpened(WindowEvent evenement); +} \ No newline at end of file diff --git a/DEV2.1/TP5/Fond.class b/DEV2.1/TP5/Fond.class new file mode 100644 index 0000000000000000000000000000000000000000..94aa4663d74855112df9991f686ff0eafd0fb5dd GIT binary patch literal 953 zcmZuw+int36kUhgz%bmkS}f4k8w|HrYrSBa2&GL7B@K9qk5f33(P5?;hSm@8TYT3C znrPw&_)*4vW@y2rA=$InxvaJJ-iJSbfBpurgNBR*vJ&ouu_nWZoQyc~VHCnx7kER) zChkUX5BJ5+1Cc!xp(vpwL6uNu2))!z-PvRC7fbIL0xfIE84?}c@goQ6pEcs+L>0@&Ye0x)| z3&O~OWe#hCK|u;>hK$I+)FYwwFm z^xEw%Ht2;VKy36hee|V~Qp^zg3O@q$-B&Nbe!=%4?Y}^vqn2j~zISnm@R3@%!V=-G zS{1mg&JeDMP!-`j@lb&jYlu<|6LW-=Wm=0O4~1TLjP~O6_ejzcNMVnBw8#gI5-W2@ z208T6?QOCUN&CM+R)0XAA?o6ghm}h#c{oN`$opLRJS56jNc54-ZxF#rGn literal 0 HcmV?d00001 diff --git a/DEV2.1/TP5/Fond.java b/DEV2.1/TP5/Fond.java new file mode 100644 index 0000000..3da6931 --- /dev/null +++ b/DEV2.1/TP5/Fond.java @@ -0,0 +1,32 @@ +import javax.swing.*; +import java.awt.*; +import java.awt.event.*; + +public class Fond extends JPanel implements ActionListener { + + public Fond(){ + super(); + JButton bouton = new JButton("Blue"); + this.add(bouton); + JButton bouton2 = new JButton("Red"); + this.add(bouton2); + JButton bouton3 = new JButton("Green"); + this.add(bouton3); + + bouton.addActionListener(this); + bouton2.addActionListener(this); + bouton3.addActionListener(this); + } + public void actionPerformed(ActionEvent e) + { + if (e.getActionCommand()=="Blue") { + this.setBackground(Color.BLUE); + } + if (e.getActionCommand()=="Red") { + this.setBackground(Color.RED); + } + if (e.getActionCommand()=="Green") { + this.setBackground(Color.GREEN); + } + } +} \ No newline at end of file diff --git a/DEV2.1/TP5/Maintamere.class b/DEV2.1/TP5/Maintamere.class new file mode 100644 index 0000000000000000000000000000000000000000..de2eb37f2ca1d924a7336af4b995cdff7a73ad51 GIT binary patch literal 611 zcmYjO+iuf96r7EnxN!_g3$)=BmNJTDvNEHcq+9ca*tHfJ54h8;- z7gwSZAHbLJ6^PjcDcIKRdUnp4bI$(y^W!IgmuUOAi46};A0=#9xNG5_hx_kx9%@=Gw3&M~>*)3KxA@-;SAFn3Qe@|Mj{^H}AE{__yj* z&c=CXY^Lh?LS_Gwx#8Twr=qW?dNI22W2=vC+~76Yrvy$24dN>QHn|F}<^3y&@7!=s z#L9w16}NDkdn-MK!xwmQjnaoJI7zhX{N`7{jU1;y`5G1S-ci(Es}}I1N`YGB76_Jk fcd)_?RiaOy8k#I>i{C**%0wW@nbUq(C2i zvC8t%Dl1hMzM+;6g0itpl|1m~Z?e?y>@L{^sG2&b&*|>(bbsAFfB*aEUjU9^Ig1{Q zX3&W&g1h;qVegCvN$yAseNGjfMkaiOVPvPh z$S=zCwhFbS9^XMljgEed=y(qYbi9w8z@TH9MMn{2mLxf}T`MH1rYp^gj6$xGcD7C#hj^U_| zUi1lcHBrvID%7~|dxY87ROKBXAK`c%L)<0v zD&HU1&^enjx>nIWsYK1#NpVVv?HOYie%$?PSg#bp!H;un(ky3`)gjCZv-7T-8>~@OIXGuR_055g|E4Pixqs&ymoS9_uHp)AakX%bXg7&BN5tFs0(XcyPuzP%F5w$U zqT9qT^MxfmhJz=l)GBuXssHGd)Nn$>$@LFH!*FI|eL)(hFw&^lky^dj??z`8@2)^g eJV7G<8`_%fS1)w7_CyjfeN?r>X=W6|$NvL9GvGY{ literal 0 HcmV?d00001 diff --git a/DEV2.1/TP6/MonInt.java b/DEV2.1/TP6/MonInt.java new file mode 100644 index 0000000..323aa39 --- /dev/null +++ b/DEV2.1/TP6/MonInt.java @@ -0,0 +1,113 @@ +// notez le s après Object. Permet entre autre de stipuler qu'un objet o n'est pas null avec la méthode Objects.requireNonNull(o, "message d'erreur détaillé"); +import java.util.Objects; + +/* + * Sorte de Int du pauvre à laquelle on ajoute un nom sous forme textuelle. + * + * Classe donnée à titre d'exemple pour illustrer les ingrédients techniques de la prog défensive. + * et les assertions java + */ +public class MonInt { + + // un entier + private int valeur ; + // son nom sous forme textuelle + private String nom ; + + public MonInt(int n, String s){ + this.valeur = n; + this.nom = s; + } + + /** + * division du pauvre. + * + * + * @param c le diviseur par lequel on souhaite diviser this + */ + public void divise (MonInt c){ + Objects.requireNonNull(c, "la classe denominateur ne peut pas être null"); + + int avant = this.valeur; + + this.valeur = this.valeur / c.getValeur(); + this.nom = "(" + this.nom + " divisé par " + c.getNom() +")"; + + assert(this.valeur*c.getValeur() == avant); // NB. un assert qui ne marche pas tout le temps. + } + + /** + * Un getter superstitieux. + * retourne une exception si la valeur vaut 13. + */ + public int getValeur(){ + if (valeur == 13) throw new IllegalStateException("Comme disait Sacha Guitry, je ne suis pas superstitieux mais on ne sait jamais."); + return valeur; + } + + public String getNom(){ + return nom; + } + + /** + * @return String representant l'entier. + */ + public String toString(){ + return this.getValeur() + " " + this.getNom(); + } + + /** + * C'est un peu moche mais on peut pour simplifier mettre des tests manuels dans un main dans chaque classe. + * C'est plutôt mieux que de mettre des print dans chaque méthode car vous êtes plus sûr de la stabilité de vos tests + * (vous pouvez rejouer les tests plus tard). + * + * Idéalement on utilise un outil dédié comme JUnit qui favorise au maximum cette automatisation. + * + * @param args pas de paramètre en ligne de commande prévu. + */ + public static void main(String[] args) { + MonInt c3 = new MonInt(3,"trois"); + MonInt c4 = new MonInt(4,"quatre"); + MonInt c9 = new MonInt(9,"neuf"); + MonInt c13 = new MonInt(13,"treize"); + System.out.println(c3.toString()); + System.out.println(c4.toString()); + System.out.println(c9.toString()); + + + c9.divise(c3); + // 3 + System.out.println(c9.toString()); + + c3.divise(c4); + // 0 + System.out.println(c3.toString()); + + // tester des exceptions pas pratique + // Si on veut tester plusieurs exceptions + // il faut attraper et vérifier que c'est le bon type d'exception. + // ici manuellement en regardant le message. + try { + System.out.println(c13.toString()); // toucher au nbre 13 avec getValeur() + } + catch(Exception e){ + System.out.println(e); + } + + try{ + c9.divise(c3); //division par 0 + } + catch(Exception e){ + System.out.println(e); + } + + try{ + c9.divise(null); //division par null + } + catch(Exception e){ + System.out.println(e); + } + + + } +} diff --git a/DEV2.1/TP6/v0/Carte.java b/DEV2.1/TP6/v0/Carte.java new file mode 100644 index 0000000..90a08bd --- /dev/null +++ b/DEV2.1/TP6/v0/Carte.java @@ -0,0 +1,145 @@ +import java.util.Objects; + +// Copyright Florent Madelaine, (3 juin 2020) + +// florent.madelaine@u-pec.fr + +// Ce logiciel est un programme informatique simulant une petite partie du jeu de Memory + +// Ce logiciel est régi par la licence CeCILL soumise au droit français et +// respectant les principes de diffusion des logiciels libres. Vous pouvez +// utiliser, modifier et/ou redistribuer ce programme sous les conditions +// de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA +// sur le site "http://www.cecill.info". + +// En contrepartie de l'accessibilité au code source et des droits de copie, +// de modification et de redistribution accordés par cette licence, il n'est +// offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons, +// seule une responsabilité restreinte pèse sur l'auteur du programme, le +// titulaire des droits patrimoniaux et les concédants successifs. + +// A cet égard l'attention de l'utilisateur est attirée sur les risques +// associés au chargement, à l'utilisation, à la modification et/ou au +// développement et à la reproduction du logiciel par l'utilisateur étant +// donné sa spécificité de logiciel libre, qui peut le rendre complexe à +// manipuler et qui le réserve donc à des développeurs et des professionnels +// avertis possédant des connaissances informatiques approfondies. Les +// utilisateurs sont donc invités à charger et tester l'adéquation du +// logiciel à leurs besoins dans des conditions permettant d'assurer la +// sécurité de leurs systèmes et ou de leurs données et, plus généralement, +// à l'utiliser et l'exploiter dans les mêmes conditions de sécurité. + +// Le fait que vous puissiez accéder à cet en-tête signifie que vous avez +// pris connaissance de la licence CeCILL, et que vous en avez accepté les +// termes. + +/** + * Classe représentant une carte de Memory + */ +public class Carte { + + /** + * Permet de savoir combien on a de cartes en tout. + * Pas vraiment clair qu'on veuille s'en servir ici. + * C'est purement pour des raisons pédagogiques de rappel de ce que veut dire un attribut de classe. + * + * Je ne rentre pas dans les détails de la destruction d'objets. + * Il faut lire la doc à propos de Objects.finalize() + */ + static int nbreCarte; + + /** + * False ssi caché + */ + private boolean visible; + + /** + * pour pouvoir apparier des cartes. + */ + private int valeur; + + /** Constructeur de carte. + */ + public Carte(int valeur){ + this.nbreCarte ++; + this.visible=false; // caché par défaut + this.valeur=valeur; + } + + // NB. Moralement, les cartes ne devraient pas être cachées. + // dans cette version on ne fait rien mais on voudrait idéalement que ce ne soit pas possible + /** + * Prédicat permettant de tester le fait que deux cartes ont la même valeur + * @param Carte la carte à comparer à this. + * @return true si elles ont la même valeur. + * @throws NullPointerException si la carte passée en paramètre ou this est null. + * @throws IllegalArgumentException si l'argument n'est pas visible + * @throws IllegalStateExeption si this n'est pas visible + */ + public boolean egale(Carte c){ + Objects.requireNonNull(c, "la carte à tester passée en paramètre ne peut pas être null"); + Objects.requireNonNull(this, "la carte qu'on veut comparer (this) ne peut pas être null"); + return c.valeur == this.valeur; + } + + public boolean getVisible(){ + return visible; + } + + /** + * Méthode inversant la visibilité d'une carte. + */ + public void toggleVisible(){ + this.visible = ! this.visible; + } + + /** + * @return String representant la carte (version longue) + * @see toString + */ + public String toStringLong(){ + return this.toString() + " parmi " + this.nbreCarte; + } + + /** + * @return String representant la carte. + */ + public String toString(){ + return "une carte " + (this.visible ? "visible" + " de valeur " + this.valeur: "cachée"); + } + + /** + * C'est un peu moche mais on peut pour simplifier mettre des tests manuels dans un main dans chaque classe. + * C'est plutôt mieux que de mettre des print dans chaque méthode car vous êtes plus sûr de la stabilité de vos tests + * (vous pouvez rejouer les tests plus tard). + * + * Idéalement on utilise un outil dédié comme JUnit qui favorise au maximum cette automatisation. + * @param args pas de paramètre en ligne de commande prévu. + */ + public static void main(String[] args) { + Carte un = new Carte(1); + System.out.println(un.toString()); + Carte deux = new Carte (2); + System.out.println(deux.toString()); + Carte unBis = new Carte(1); + System.out.println(unBis.toString()); + + un.toggleVisible(); + System.out.println(un.toString()); + unBis.toggleVisible(); + System.out.println(unBis.toString()); + System.out.println(un.egale(unBis)); + unBis.toggleVisible();//true + System.out.println(unBis.toString()); + + System.out.println(un.toString()); + deux.toggleVisible(); + System.out.println(deux.toString()); + System.out.println(!un.egale(deux));//not false + + Carte bad = null; + un.egale(bad); + } +} + + diff --git a/DEV2.1/TP6/v0/EnsembleCarte.java b/DEV2.1/TP6/v0/EnsembleCarte.java new file mode 100644 index 0000000..7761cb9 --- /dev/null +++ b/DEV2.1/TP6/v0/EnsembleCarte.java @@ -0,0 +1,142 @@ +import java.util.LinkedHashSet; + +// Copyright Florent Madelaine, (3 juin 2020) + +// florent.madelaine@u-pec.fr + +// Ce logiciel est un programme informatique simulant une petite partie du jeu de Memory + +// Ce logiciel est régi par la licence CeCILL soumise au droit français et +// respectant les principes de diffusion des logiciels libres. Vous pouvez +// utiliser, modifier et/ou redistribuer ce programme sous les conditions +// de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA +// sur le site "http://www.cecill.info". + +// En contrepartie de l'accessibilité au code source et des droits de copie, +// de modification et de redistribution accordés par cette licence, il n'est +// offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons, +// seule une responsabilité restreinte pèse sur l'auteur du programme, le +// titulaire des droits patrimoniaux et les concédants successifs. + +// A cet égard l'attention de l'utilisateur est attirée sur les risques +// associés au chargement, à l'utilisation, à la modification et/ou au +// développement et à la reproduction du logiciel par l'utilisateur étant +// donné sa spécificité de logiciel libre, qui peut le rendre complexe à +// manipuler et qui le réserve donc à des développeurs et des professionnels +// avertis possédant des connaissances informatiques approfondies. Les +// utilisateurs sont donc invités à charger et tester l'adéquation du +// logiciel à leurs besoins dans des conditions permettant d'assurer la +// sécurité de leurs systèmes et ou de leurs données et, plus généralement, +// à l'utiliser et l'exploiter dans les mêmes conditions de sécurité. + +// Le fait que vous puissiez accéder à cet en-tête signifie que vous avez +// pris connaissance de la licence CeCILL, et que vous en avez accepté les +// termes. + + + +/** + * classe abstraite pour gérer les opérations sur les ensembles de carte qu'on trouve au memory + * + */ +public abstract class EnsembleCarte { + /** + * La structure de donnée utilisée pour stocker les cartes dans la partie Collection de java.util. + * En gros, c'est un ensemble (répétition interdite) qui liste les éléments dans un ordre stable. + * La doc de java.util a propos de AbstractSet (ancêtre de LinkedHashSet) + * (...) all of the methods and constructors in subclasses of this class must obey the additional + * constraints imposed by the Set interface (for instance, the add method must not permit addition + * of multiple instances of an object to a set). + */ + private LinkedHashSet contenu = new LinkedHashSet(); + + /** + * nbre de Cartes de l'ensemble. + * + */ + private int nbreCarte; + + /** + * Constructeur d'Ensemble vide. + */ + public EnsembleCarte(){ + this.nbreCarte=0; + } + + /** + * Ajoute une carte à l'ensemble. + * @param c une carte + * @return true si la carte est ajoutée à l'ensemble + * @throws NullPointerException si la carte est null + * @throws IllegalStateException si la carte ne peut pas être ajoutée car elle est déjà présente dans l'ensemble + */ + protected boolean add(Carte c){ + this.nbreCarte++; + return contenu.add(c); + } + + /** + * Enlève une carte à l'ensemble. + * @param c une carte + * @return true si la carte est retirée à l'ensemble + * @throws NullPointerException si la carte est null + * @throws IllegalStateException si la carte ne peut pas être enlevéé car elle n'est pas présente dans l'ensemble + */ + private boolean remove(Carte c){ + this.nbreCarte++; + return contenu.remove(c); + } + + /** + * Permet de transférer une paire de carte (par exemple depuis la table vers un joueur) + * Si ces cartes sont toutes les deux visibles + * @param target destination du transfert + * @param c1 première carte + * @param c2 seconde carte + * @return true en cas de succès, false sinon + * @throws NullPointerException si un élément passé en paramètre est null. + * @throws IllegalArgumentException si les cartes ne sont pas toutes les deux visibles + * @throws IllegalStateException si this ne contient pas les deux cartes. + */ + public boolean transfer(EnsembleCarte target, Carte c1, Carte c2){ + return this.contenu.contains(c1) && this.contenu.remove(c1) && target.add(c1) && this.contenu.contains(c2) && this.contenu.remove(c2) && target.add(c2); + } + + + public String toString(){ + // Stringbuilder is the most efficient method of building a String like datastructure incrementally. + StringBuilder sb = new StringBuilder(" de taille " + this.contenu.size() + ", contenant : \n"); + for (Carte c : this.contenu){ + sb.append(" _ " + c.toString() +"\n"); + } + return sb.toString(); + } + + + // tests obsolètes [serait OK si classe n'était pas abstraite] + + // public static void main(String[] args) { + + // Carte un = new Carte(1); + // Carte deux = new Carte (2); + // deux.toggleVisible(); + // Carte unBis = new Carte(1); + + // Carte deuxBis = new Carte(2); + + // EnsembleCarte e1 = new EnsembleCarte(); + // System.out.println(e1.add(un) && e1.add(deux)); + // System.out.println(e1.toString()); + + // EnsembleCarte e2 = new EnsembleCarte(); + // System.out.println(e2.add(un) && e2.add(unBis)); + // System.out.println(e2.toString()); + + // e1.transfer(e2,un,deuxBis); + // System.out.println(e1.toString()); + // System.out.println(e2.toString()); + + // } +} + + diff --git a/DEV2.1/TP6/v0/Joueur.java b/DEV2.1/TP6/v0/Joueur.java new file mode 100644 index 0000000..3a4a69a --- /dev/null +++ b/DEV2.1/TP6/v0/Joueur.java @@ -0,0 +1,95 @@ +import java.util.LinkedHashSet; + +// Copyright Florent Madelaine, (3 juin 2020) + +// florent.madelaine@u-pec.fr + +// Ce logiciel est un programme informatique simulant une petite partie du jeu de Memory + +// Ce logiciel est régi par la licence CeCILL soumise au droit français et +// respectant les principes de diffusion des logiciels libres. Vous pouvez +// utiliser, modifier et/ou redistribuer ce programme sous les conditions +// de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA +// sur le site "http://www.cecill.info". + +// En contrepartie de l'accessibilité au code source et des droits de copie, +// de modification et de redistribution accordés par cette licence, il n'est +// offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons, +// seule une responsabilité restreinte pèse sur l'auteur du programme, le +// titulaire des droits patrimoniaux et les concédants successifs. + +// A cet égard l'attention de l'utilisateur est attirée sur les risques +// associés au chargement, à l'utilisation, à la modification et/ou au +// développement et à la reproduction du logiciel par l'utilisateur étant +// donné sa spécificité de logiciel libre, qui peut le rendre complexe à +// manipuler et qui le réserve donc à des développeurs et des professionnels +// avertis possédant des connaissances informatiques approfondies. Les +// utilisateurs sont donc invités à charger et tester l'adéquation du +// logiciel à leurs besoins dans des conditions permettant d'assurer la +// sécurité de leurs systèmes et ou de leurs données et, plus généralement, +// à l'utiliser et l'exploiter dans les mêmes conditions de sécurité. + +// Le fait que vous puissiez accéder à cet en-tête signifie que vous avez +// pris connaissance de la licence CeCILL, et que vous en avez accepté les +// termes. + +/** + * Classe servant à représenter le joueur dans le modèle. + * Pour l'instant juste un nom et un ensemble de cartes + */ +public class Joueur extends EnsembleCarte { + /** + * Nom du joueur + */ + private String nom; + + /** + * Constructeur + * @param nom Futur nom du joueur, ne doit pas être null + * @throws nullPointerException si nom est null. + */ + public Joueur(String nom){ + this.nom=nom; + } + + public String toString(){ + return "Joueur " + this.nom + " " + super.toString(); + } + + + public static void main(String[] args) { + // c'est un peu moche mais on peut pour simplifier mettre des tests manuels dans un main dans chaque classe. + // C'est plutôt mieux que de mettre des print dans chaque méthode car vous êtes plus sûr de la stabilité de vos tests (vous pouvez rejouer les tests plus tard). + + // Les Joueurs + Joueur toto = new Joueur("Toto"); + Joueur titi = new Joueur("Titi"); + Joueur tata = new Joueur("Tata"); + + // Les cartes + Carte un = new Carte(1); + Carte deux = new Carte (2); + Carte unBis = new Carte(1); + Carte deuxBis = new Carte(2); + + // la Table + Table t = new Table(); + t.add(un); + t.add(deux); + t.add(unBis); + t.add(deuxBis); + + System.out.println(t); + System.out.println(toto); + + t.reveler(un); + t.reveler(unBis); + + t.transfer(toto,un,unBis); + + System.out.println(t); + System.out.println(toto); + } +} + + diff --git a/DEV2.1/TP6/v0/Table.java b/DEV2.1/TP6/v0/Table.java new file mode 100644 index 0000000..1c1cc57 --- /dev/null +++ b/DEV2.1/TP6/v0/Table.java @@ -0,0 +1,123 @@ +import java.util.LinkedHashSet; + +// Copyright Florent Madelaine, (3 juin 2020) + +// florent.madelaine@u-pec.fr + +// Ce logiciel est un programme informatique simulant une petite partie du jeu de Memory + +// Ce logiciel est régi par la licence CeCILL soumise au droit français et +// respectant les principes de diffusion des logiciels libres. Vous pouvez +// utiliser, modifier et/ou redistribuer ce programme sous les conditions +// de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA +// sur le site "http://www.cecill.info". + +// En contrepartie de l'accessibilité au code source et des droits de copie, +// de modification et de redistribution accordés par cette licence, il n'est +// offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons, +// seule une responsabilité restreinte pèse sur l'auteur du programme, le +// titulaire des droits patrimoniaux et les concédants successifs. + +// A cet égard l'attention de l'utilisateur est attirée sur les risques +// associés au chargement, à l'utilisation, à la modification et/ou au +// développement et à la reproduction du logiciel par l'utilisateur étant +// donné sa spécificité de logiciel libre, qui peut le rendre complexe à +// manipuler et qui le réserve donc à des développeurs et des professionnels +// avertis possédant des connaissances informatiques approfondies. Les +// utilisateurs sont donc invités à charger et tester l'adéquation du +// logiciel à leurs besoins dans des conditions permettant d'assurer la +// sécurité de leurs systèmes et ou de leurs données et, plus généralement, +// à l'utiliser et l'exploiter dans les mêmes conditions de sécurité. + +// Le fait que vous puissiez accéder à cet en-tête signifie que vous avez +// pris connaissance de la licence CeCILL, et que vous en avez accepté les +// termes. + + + +/** + * Classe gérant la table de jeu du Memory dans le modèle + * Pour l'instant ne gère pas le tour des joueurs. + * Devrait probablement le faire un jour. + */ +public class Table extends EnsembleCarte { + + /** + * Constructeur de Table vide (seul constructeur pour l'instant) + */ + public Table(){ + } + + /** + * Nécessaire de la rendre publique car on a un parti pris que on commence avec une table vide à laquelle on ajoute des cartes. + * On pourrait alternativement faire un constructeur qui fabrique les cartes ou bien qui prend une collection de cartes. + * Ça n'aurait pas la vertu pédagogique de montrer qu'on peut surcharger une méthode en élevant les droits en java. + * + * Par délégation mais en rendant publique la méthode (pour l'initialisation en fait). + * @param c Carte à ajou + * @return true si la carte est ajoutée à l'ensemble + * @throws NullPointerException si la carte est null + * @throws IllegalStateException si la carte ne peut pas être ajoutée car elle est déjà présente dans l'ensemble + */ + @Override + public boolean add(Carte c){ + return super.add(c); + } + + /** + * révèle une carte. + * @param c une carte à révèler + * @throws NullPointerException si la carte est null + * @throws IllegalArgumentException si la carte n'est pas sur la table + * @throws IllegalStateException si la carte est déjà révélée + */ + public void reveler(Carte c){ + c.toggleVisible(); + } + + /** + * cache une carte. + * @param c une carte à cacher + * @throws NullPointerException si la carte est null + * @throws IllegalArgumentException si la carte n'est pas sur la table + * @throws IllegalStateException si la carte est déjà cachée + */ + public void cacher(Carte c){ + c.toggleVisible(); + } + + + public String toString(){ + return "Table " + super.toString(); + } + + + public static void main(String[] args) { + // c'est un peu moche mais on peut pour simplifier mettre des tests manuels dans un main dans chaque classe. + // C'est plutôt mieux que de mettre des print dans chaque méthode car vous êtes plus sûr de la stabilité de vos tests (vous pouvez rejouer les tests plus tard). + + // Les cartes + Carte un = new Carte(1); + Carte deux = new Carte (2); + Carte unBis = new Carte(1); + Carte deuxBis = new Carte(2); + + + // la Table + Table t = new Table(); + t.add(un); + t.add(deux); + t.add(unBis); + t.add(deuxBis); + + System.out.println(t); + + t.reveler(un); + t.reveler(unBis); + + System.out.println(t); + + } +} + + diff --git a/DEV2.1/TP6/v0/TestCarte.java b/DEV2.1/TP6/v0/TestCarte.java new file mode 100644 index 0000000..9862dd2 --- /dev/null +++ b/DEV2.1/TP6/v0/TestCarte.java @@ -0,0 +1,85 @@ +import static org.junit.Assert.assertTrue; // import static : une facilité offerte depuis java5 (pas besoin de mettre le préfixe) +import static org.junit.Assert.assertFalse; // +import org.junit.Test; + + +/** + * Une classe pour faire des tests sur la classe Carte avec JUnit + */ +public class TestCarte { + + // un test pour Junit4 c'est une méthode avec l'annotation @Test devant une méthode avec un type de retour void. + @Test + public void egaleSiIdentiquesEtVisible() { + Carte un = new Carte(1); + un.toggleVisible(); + // on peut stipuler que des choses sont normalement égales (il faut charger de manière statique les Assert si on veut éviter d'avoir à écrire de quelle classe on parle) + assertTrue(un.egale(un)); + } + + // le nom du test doit être le plus explicite possible + @Test + public void egalSiMemeValeurEtVisible() { + Carte un = new Carte(1); + un.toggleVisible(); + Carte unBis = new Carte(1); + unBis.toggleVisible(); + assertTrue(un.egale(unBis)); + } + + @Test + public void pasEgalSiPasMemeValeurEtVisible() { + Carte un = new Carte(1); + un.toggleVisible(); + Carte deux = new Carte(2); + deux.toggleVisible(); + assertFalse(un.egale(deux)); + } + + // un test pour Junit4 qui cherche à vérifier qu'il y a bien une exception + @Test(expected = NullPointerException.class) + public void egalPasFaitPourNull(){ + Carte bad = null; + Carte un = new Carte(1); + un.egale(bad); + } + + // un autre test pour Junit4 qui cherche à vérifier qu'il y a bien une exception + @Test(expected = IllegalArgumentException.class) + public void egalPasFaitPourParametreNonVisible(){ + Carte un = new Carte(1); + un.toggleVisible(); + Carte deux = new Carte(2); + un.egale(deux); + } + + // un autre test pour Junit4 qui cherche à vérifier qu'il y a bien une exception + @Test(expected = IllegalStateException.class) + public void egalPasFaitPourCarteThisNonVisible(){ + Carte un = new Carte(1); + Carte deux = new Carte(2); + deux.toggleVisible(); + un.egale(deux); + } + + //Le monde est mal fait et parfois c'est le test qui est faux. + //Notez que je suis vraiment méchant car ce test est satisfait au début avec le code proposé... + //Moralité : faites des tests très simples et faites vous relire! + @Test + public void egalTestMalFait(){ + Carte un = new Carte(1); + un.toggleVisible(); + Carte deux = new Carte(2); + deux.toggleVisible(); + un.toggleVisible();//copié collé de la mort + assertFalse(un.egale(deux)); + } + + // si on ne met pas l'annotation arobase test, le test n'est jamais pris en compte. + // c'est juste une méthode annexe qui n'est pas appellée comme dans n'importe quelle classe. + public void autreTestMalFait(){ + assertFalse(true); + } + + +} diff --git a/DEV2.1/TP6/v0Memory.zip b/DEV2.1/TP6/v0Memory.zip new file mode 100644 index 0000000000000000000000000000000000000000..dbf238d4cb4d1b1ef8292857c58d5429273a7ca4 GIT binary patch literal 9692 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 X!7Ir@K>mS%{C!b?0swhrfBgF&Z`0Jw literal 0 HcmV?d00001 diff --git a/WEBBE/TP1/bonjour.php b/WEBBE/TP1/bonjour.php new file mode 100644 index 0000000..bb6fc6c --- /dev/null +++ b/WEBBE/TP1/bonjour.php @@ -0,0 +1,6 @@ + + + + hello world";?> + + diff --git a/WEBBE/TP2/exo1.php b/WEBBE/TP2/exo1.php new file mode 100644 index 0000000..3270124 --- /dev/null +++ b/WEBBE/TP2/exo1.php @@ -0,0 +1,50 @@ + + + +
+

Qui etes-vous ?

+
+
+
+ +
+

Sexe :

+ +
+ +
+ +
+ +
+ +
+
+

+ +

+ + \ No newline at end of file