149 lines
5.5 KiB
Java
149 lines
5.5 KiB
Java
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){
|
|
Carte.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");
|
|
|
|
if (!this.getVisible()) throw new IllegalStateException("Carte non visible.");
|
|
if (!c.getVisible()) throw new IllegalArgumentException("Carte paramètre non visible.");
|
|
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 " + Carte.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);
|
|
}
|
|
}
|
|
|
|
|