diff --git a/Jeu_pendu/Back/Check.java b/Jeu_pendu/Back/Check.java new file mode 100644 index 0000000..45bec7a --- /dev/null +++ b/Jeu_pendu/Back/Check.java @@ -0,0 +1,13 @@ +package back; + +/** + * Vérifie la validité des entrées utilisateur. + */ +public class Check { + /** Retourne vrai si la saisie est une seule lettre alphabétique */ + public static boolean isLetter(String value) { + if (value == null) return false; + String trimmed = value.trim(); + return trimmed.length() == 1 && Character.isLetter(trimmed.charAt(0)); + } +} \ No newline at end of file diff --git a/Jeu_pendu/Back/Game.java b/Jeu_pendu/Back/Game.java new file mode 100644 index 0000000..6d9f40e --- /dev/null +++ b/Jeu_pendu/Back/Game.java @@ -0,0 +1,76 @@ +package back; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +/** + * Logique principale du jeu du pendu (back). + * Gère le mot, les lettres trouvées, et les conditions de victoire/défaite. + */ +public class Game { + private final String word; + private final Set correct = new HashSet<>(); + private final Set all = new HashSet<>(); + private final int maxErrors; + private int errors; + + public Game(String word, int maxErrors) { + this.word = word.toLowerCase(); + this.maxErrors = maxErrors; + } + +/** Tente une lettre et renvoie le résultat */ + public Result play(char letter) { + char c = Character.toLowerCase(letter); + if (all.contains(c)) return Result.ALREADY; + all.add(c); + if (word.indexOf(c) >= 0) { + correct.add(c); + return Result.HIT; + } else { + errors++; + return Result.MISS; + } + } + + /** Retourne le mot masqué avec les lettres trouvées */ + public String maskedWord() { + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < word.length(); i++) { + char c = word.charAt(i); + if (!Character.isLetter(c)) sb.append(c); + else if (correct.contains(c)) sb.append(c); + else sb.append('_'); + if (i < word.length() - 1) sb.append(' '); + } + return sb.toString(); + } + + /** Vérifie si le joueur a gagné */ + public boolean isWin() { + for (int i = 0; i < word.length(); i++) { + char c = word.charAt(i); + if (Character.isLetter(c) && !correct.contains(c)) return false; + } + return true; + } + + /** Vérifie si le joueur a perdu */ + public boolean isLose() { + return errors >= maxErrors; + } + + /** Renvoie le nombre d'erreurs actuelles */ + public int getErrors() { return errors; } + + /** Liste les lettres déjà essayées */ + public List triedLetters() { + List sorted = new ArrayList<>(all); + sorted.sort(Character::compareTo); + List out = new ArrayList<>(); + for (Character ch : sorted) out.add(String.valueOf(ch)); + return out; + } +} \ No newline at end of file diff --git a/Jeu_pendu/Back/Result.java b/Jeu_pendu/Back/Result.java new file mode 100644 index 0000000..dec2919 --- /dev/null +++ b/Jeu_pendu/Back/Result.java @@ -0,0 +1,6 @@ +package back; + +/** + * Résultat possible d'une tentative. + */ +public enum Result { HIT, MISS, ALREADY } \ No newline at end of file diff --git a/Jeu_pendu/Back/Word.java b/Jeu_pendu/Back/Word.java new file mode 100644 index 0000000..060a08a --- /dev/null +++ b/Jeu_pendu/Back/Word.java @@ -0,0 +1,85 @@ +package back; + +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.security.SecureRandom; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Stream; + +/** + * Fournit les mots pour le jeu. + * - Lit d'abord "bibliothèque/mots.txt" (UTF-8), 1 mot par ligne. + * - Ignore les lignes vides et celles qui commencent par '#'. + * - Si le fichier est introuvable ou vide, bascule sur une liste par défaut. + */ +public class Words { + + /** Chemin du fichier de mots (relatif à la racine du projet). */ + private static final Path WORDS_PATH = Paths.get("Bibliotheque", "mots.txt"); + + /** Liste de secours si le fichier n'est pas disponible. */ + private static final List DEFAULT = List.of( + "algorithm", "variable", "function", "interface", "inheritance", + "exception", "compiler", "database", "network", "architecture", + "iteration", "recursion", "encryption", "framework", "protocol" + ); + + /** RNG partagé et cache des mots chargés. */ + private static final SecureRandom RNG = new SecureRandom(); + private static volatile List CACHE = null; + + /** + * Retourne un mot choisi au hasard depuis le fichier ou la liste par défaut. + * Déclenche un chargement paresseux (lazy-load) si nécessaire. + */ + public static String random() { + ensureLoaded(); + return CACHE.get(RNG.nextInt(CACHE.size())); + } + + /** + * Recharge les mots depuis le fichier. Utile si modification de mots.txt à chaud. + */ + public static synchronized void reload() { + CACHE = loadFromFileOrDefault(); + } + + /** Garantit que le cache est initialisé. */ + private static void ensureLoaded() { + if (CACHE == null) { + synchronized (Words.class) { + if (CACHE == null) { + CACHE = loadFromFileOrDefault(); + } + } + } + } + + /** Tente de charger depuis le fichier, sinon renvoie la liste par défaut. */ + private static List loadFromFileOrDefault() { + List fromFile = readUtf8Lines(WORDS_PATH); + if (fromFile.isEmpty()) return DEFAULT; + return fromFile; + } + + /** + * Lit toutes les lignes UTF-8 depuis le chemin fourni, + * en filtrant vides et commentaires (# ...). + */ + private static List readUtf8Lines(Path path) { + List result = new ArrayList<>(); + try (Stream lines = Files.lines(path, StandardCharsets.UTF_8)) { + lines.map(String::trim) + .filter(s -> !s.isEmpty()) + .filter(s -> !s.startsWith("#")) + .forEach(result::add); + } catch (IOException e) { + // Silencieux : on basculera sur DEFAULT + } + return result; + } +} \ No newline at end of file diff --git a/Jeu_pendu/Bibliotheque/mots.txt b/Jeu_pendu/Bibliotheque/mots.txt new file mode 100644 index 0000000..d52bfc5 --- /dev/null +++ b/Jeu_pendu/Bibliotheque/mots.txt @@ -0,0 +1,835 @@ +ABIME +ABSENT +ACCIDENT +ACCROCHER +ACROBATE +ADROIT +AEROPORT +AFFAIRE +AFFICHE +AGITER +AIDER +AIGUILLE +ALBUM +ALLER +ALPHABET +AMENER +AMI +AMPOULE +AMUSANT +AMUSER +ANCIEN +ANGLE +ANORAK +APPAREIL +APPEL +APPORTER +APPUYER +APPUYER +APRES +ARC +ARMOIRE +ARRACHER +ARRET +ARRETER +ARRIERE +ARRIVER +ARROSER +ARROSOIR +ASSIETTE +ASSIS +ATTACHER +ATTENDRE +ATTENTION +ATTERRIR +ATTRAPER +AUTANT +AUTOUR +AVANCER +AVANT +AVION +BAGAGE +BAGARRE +BAGARRER +BAGUETTE +BAIGNER +BAILLER +BAISSER +BALANCER +BALANCOIRE +BALLE +BALLON +BANC +BANDE +BARBE +BARBOTER +BARRE +BARREAU +BAS +BATEAU +BATTRE +BEAUCOUP +BIBLIOTHEQUE +BICYCLETTE +BIEN +BILLE +BLANC +BLEU +BLOND +BOIS +BOITE +BOITE +BONDIR +BONNET +BORD +BOTTE +BOUCHER +BOUCHON +BOUDER +BOUGER +BOUSCULER +BOUT +BOUTEILLE +BOUTON +BRAS +BRETELLE +BRICOLAGE +BRUIT +BRUN +BULLES +BUREAU +CABANE +CABINET +CACHER +CAGE +CAGOULE +CAHIER +CAISSE +CALME +CAMARADE +CAMESCOPE +CAMION +CANARD +CARNET +CARRE +CARREAU +CARTABLE +CARTE +CARTON +CARTON +CASIER +CASQUE +CASQUETTE +CASSE +CASSER +CASSEROLE +CASSETTE +CATALOGUE +CEINTURE +CERCEAU +CERF +CHAINE +CHAISE +CHAISE +CHANGER +CHANSON +CHANTER +CHAPEAU +CHARGER +CHATEAU +CHAUD +CHAUSSER +CHAUSSETTE +CHAUSSON +CHAUSSURE +CHEMISE +CHERCHER +CHEVILLE +CHIFFRE +CHOISIR +CHOSE +CHUCHOTER +CHUTE +CIGARETTE +CINQ +CISEAUX +CLAIR +CLASSE +CLEF +CLOU +COEUR +COGNER +COIN +COL +COLERE +COLLANT +COLLE +COLLE +COLLER +COLORIAGE +COLORIER +COMMENCER +COMPARER +COMPTER +CONDUIRE +CONSTRUIRE +CONTE +CONTINUER +CONTRAIRE +CONTRE +COPAIN +COPIER +COQUIN +CORDE +CORPS +COTE +COU +COUCHER +COUDE +COUDRE +COULER +COULEUR +COULOIR +COUP +COUPER +COUR +COURIR +COURONNE +COURSE +COURT +COUVRIR +CRACHER +CRAIE +CRAVATE +CRAYON +CREUSER +CRIER +CROCHET +CROCODILE +CUBE +CUILLERE +CUISSE +CULOTTE +CURIEUX +CUVETTE +DAME +DANGER +DANGEUREUX +DANS +DANSER +DE +DEBORDER +DEBOUT +DEBOUT +DECHIRER +DECOLLER +DECORER +DECOUPAGE +DECOUPER +DEDANS +DEFENDRE +DEGONFLER +DEGUISER +DEHORS +DEMARRER +DEMOLIR +DEPASSER +DERNIER +DERRIERE +DESCENDRE +DESHABILLER +DESOBEIR +DESSIN +DESSINER +DESSUS +DETRUIRE +DEUX +DEUXIEME +DEVANT +DICTIONNAIRE +DIFFERENCE +DIFFERENT +DIFFICILE +DIRE +DIRECTEUR +DIRECTRICE +DISCUTER +DISPARAITRE +DISPUTE +DISTRIBUER +DIX +DOIGT +DOIGTS +DOMINO +DONNER +DORMIR +DOS +DOSSIER +DOUCHE +DOUCHER +DOUX +DROIT +DROITE +DU +DUR +EAU +EAU +ECARTER +ECHANGER +ECHARPE +ECHASSE +ECHASSES +ECHELLE +ECLABOUSSER +ECLAIRER +ECOLE +ECORCHER +ECOUTER +ECRAN +ECRASER +ECRIRE +ECRITURE +ECUREUIL +EFFACER +EFFORT +ELASTIQUE +ELEVE +EMMENER +EMPECHER +EMPORTER +ENCORE +ENERVER +ENFANT +ENFILER +ENFONCER +ENGIN +ENLEVER +ENSEMBLE +ENTENDRE +ENTONNOIR +ENTOURER +ENTRER +ENTRER +ENVELOPPE +ENVOLER +ENVOYER +ENVOYER +EPAIS +EPAULE +EPEE +EQUILIBRE +EQUIPE +ESCABEAU +ESCALADE +ESCALADER +ESCALIER +ESSUYER +ETAGERE +ETIQUETTE +ETROIT +EXPLIQUER +EXPLIQUER +EXTERIEUR +FABRIQUER +FACE +FACILE +FAIRE +FATIGUE +FAUTE +FEE +FENETRE +FERMER +FESSE +FEU +FEUILLE +FEUTRE +FICELLE +FIL +FILE +FILET +FILLE +FILM +FINIR +FLAQUE +FLECHE +FLOTTER +FOI +FOIS +FONCE +FOND +FORME +FORT +FOU +FOUILLER +FRAPPER +FREIN +FROID +FUSEE +FUSIL +GAGNER +GALOPER +GANT +GARAGE +GARCON +GARDER +GARDIEN +GARE +GARER +GAUCHE +GENER +GENOU +GENTIL +GLISSER +GOMME +GONFLER +GOUTER +GOUTTES +GRAND +GRIMPER +GRIS +GRONDER +GROS +GROUPE +GRUE +GYMNASTIQUE +HABILLER +HABIT +HANCHE +HANDICAPE +HAUT +HELICOPTERE +HISTOIRE +HUIT +HUMIDE +HURLER +ICI +IDEE +IMAGE +IMITER +IMMOBILE +INONDER +INSEPARABLE +INSTALLER +INSTRUMENT +INTERESSANT +INTERIEUR +INTRUS +JALOUX +JAMAIS +JAMBE +JAUNE +JEAN +JEU +JEU +JOLI +JONGLER +JOUER +JOUET +JOUEUR +JUPE +LACER +LACET +LAINE +LAISSER +LANCER +LARGE +LAVABO +LAVER +LETTRE +LEVER +LIGNE +LINGE +LIRE +LISSE +LISTE +LIT +LITRE +LIVRE +LOIN +LONG +LUNETTES +MADAME +MAGAZINE +MAGICIEN +MAGIE +MAGNETOSCOPE +MAILLOT +MAIN +MAINS +MAITRE +MAITRESSE +MAL +MALADROIT +MANCHE +MANQUER +MANTEAU +MARCHE +MARCHER +MARIONNETTE +MARTEAU +MATELAS +MATERNELLE +MECHANT +MELANGER +MEME +MENSONGE +MESURER +METAL +METRE +METTRE +MEUBLE +MICRO +MIEUX +MILIEU +MINE +MODELE +MODELER +MOINS +MOITIE +MONTAGNE +MONTER +MONTRER +MONTRER +MORCEAU +MOT +MOTEUR +MOTO +MOUCHOIR +MOUFLE +MOUILLE +MOUILLER +MOULIN +MOUSSE +MOYEN +MUET +MULTICOLORE +MUR +MUR +MUSCLE +MUSIQUE +NAGER +NEUF +NOEUD +NOIR +NOM +NOMBRE +NOUVEAU +NU +NUMERO +OBEIR +OBJET +OBLIGER +ONGLE +ORCHESTRE +ORDINATEUR +ORDRE +OUTIL +OUVRIR +OUVRIR +PAGE +PAIRE +PAIX +PANNE +PANTALON +PAPIER +PARCOURS +PARDON +PAREIL +PARKING +PARLER +PARTAGER +PARTIE +PARTIR +PARTIR +PAS +PASSERELLE +PATE +PATTES +PEDALE +PEDALER +PEINDRE +PEINTURE +PEINTURE +PELLE +PELUCHE +PENCHER +PENTE +PERCER +PERCHER +PERDRE +PERLE +PERSONNE +PETIT +PEU +PEUR +PHOTO +PIED +PIED +PILOTE +PINCEAU +PINCEAU +PINCER +PION +PIROUETTE +PLACARD +PLAFOND +PLAINDRE +PLANCHE +PLASTIQUE +PLATRE +PLEURER +PLEUVOIR +PLI +PLIAGE +PLIER +PLONGEOIR +PLONGER +PLUIE +PLUS +PNEU +POCHE +POIGNET +POING +POINT +POINTU +POISSON +POLI +POMPE +PONT +PONT +PORTE +PORTER +POSER +POSER +POSTER +POT +POUBELLE +POUCE +POURSUIVRE +POUSSER +POUTRE +POUVOIR +PREAU +PREMIER +PRENDRE +PRENOM +PREPARER +PRES +PRESENT +PRESQUE +PRESSER +PRESSER +PRETER +PRINCE +PRISE +PRIVER +PROGRES +PROGRESSER +PROMETTRE +PROPRE +PROTEGER +PUNIR +PUZZLE +PYJAMA +QUAI +QUATRE +QUESTION +QUITTER +RACONTER +RADIATEUR +RADIO +RAMPE +RAMPER +RANG +RANGER +RAQUETTE +RATER +RAYON +RAYURE +RECEVOIR +RECHAUFFER +RECITER +RECOMMENCER +RECREATION +RECULER +REFUSER +REGARDER +REINE +REMETTRE +REMPLACER +REMPLIR +RENVERSER +REPARER +REPETER +REPONDRE +RESPIRER +RESSEMBLER +RESTER +RETARD +RETOURNER +REUSSIR +REVENIR +RIDEAU +RIVIERE +ROBE +ROBINET +ROI +ROND +ROND +ROUE +ROUGE +ROULADE +ROULER +ROUX +RUBAN +SABLE +SAC +SAGE +SAIGNER +SALADIER +SALE +SALIR +SALLE +SALON +SAUT +SAUTER +SCIE +SEAU +SEC +SECHER +SEMELLE +SENS +SENTIR +SEPARER +SEPT +SERIEUX +SERPENT +SERRE +SERRER +SERRURE +SERVIETTE +SERVIR +SEUL +SIEGE +SIESTE +SIFFLER +SIFFLET +SIGNE +SIGNE +SILENCE +SINGE +SIX +SOCIERE +SOL +SOLDAT +SOLIDE +SOMMEIL +SONNER +SONNETTE +SORTIE +SORTIR +SOUFFLER +SOULEVER +SOULIGNER +SOUPLE +SOURD +SOURIRE +SOUS +SOUVENT +SPORT +STYLO +SUIVANT +SUIVRE +SUR +SURVEILLER +TABLE +TABLEAU +TABLIER +TABOURET +TACHE +TAILLE +TAILLER +TALON +TAMBOUR +TAMPON +TAPER +TAPIS +TARD +TAS +TASSE +TELECOMMANDE +TELEPHONE +TELEVISION +TENDRE +TENIR +TERMINER +TETE +TIRER +TIROIR +TISSU +TITRE +TOBOGGAN +TOILETTE +TOMBER +TORDU +TOT +TOUCHER +TOUJOURS +TOUR +TOURNER +TOURNEVIS +TRAIN +TRAINER +TRAIT +TRAMPOLINE +TRANQUILLE +TRANSPARENT +TRANSPIRER +TRANSPORTER +TRAVAIL +TRAVAILLER +TRAVERSER +TREMPER +TRICOT +TRICYCLE +TRIER +TROIS +TROISIEME +TROMPETTE +TROP +TROUER +TROUS +TROUSSE +TROUVER +TROUVER +TUNNEL +TUYAU +UN +UNIFORME +USE +VALISE +VELO +VENIR +VENTRE +VERRE +VERS +VERSER +VERT +VESTE +VETEMENT +VIDER +VIRAGE +VIS +VITE +VITESSE +VITRE +VOITURE +VOIX +VOLANT +VOLER +VOULOIR +VOYAGE +WAGON +XYLOPHONE +ZERO +ZIGZAG