diff --git a/Jeu_pendu/Back/Words.java b/Jeu_pendu/Back/Words.java new file mode 100644 index 0000000..060a08a --- /dev/null +++ b/Jeu_pendu/Back/Words.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/assets/images/1.png b/Jeu_pendu/assets/images/1.png index 0fc7563..57efc4f 100644 Binary files a/Jeu_pendu/assets/images/1.png and b/Jeu_pendu/assets/images/1.png differ diff --git a/Jeu_pendu/assets/images/2.png b/Jeu_pendu/assets/images/2.png index f9dbe06..1942cca 100644 Binary files a/Jeu_pendu/assets/images/2.png and b/Jeu_pendu/assets/images/2.png differ diff --git a/Jeu_pendu/assets/images/3.png b/Jeu_pendu/assets/images/3.png index f9ff091..844245a 100644 Binary files a/Jeu_pendu/assets/images/3.png and b/Jeu_pendu/assets/images/3.png differ diff --git a/Jeu_pendu/assets/images/4.png b/Jeu_pendu/assets/images/4.png index 1d81a8a..c233758 100644 Binary files a/Jeu_pendu/assets/images/4.png and b/Jeu_pendu/assets/images/4.png differ diff --git a/Jeu_pendu/assets/images/5.png b/Jeu_pendu/assets/images/5.png index 023025e..81fbc39 100644 Binary files a/Jeu_pendu/assets/images/5.png and b/Jeu_pendu/assets/images/5.png differ diff --git a/Jeu_pendu/assets/images/6.png b/Jeu_pendu/assets/images/6.png index 81369e2..71d389a 100644 Binary files a/Jeu_pendu/assets/images/6.png and b/Jeu_pendu/assets/images/6.png differ