// © 2025 Alessio Severi — vedi licenza nel file Main.java package impiccato; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.util.List; import java.util.Random; /** * Astrazione delle operazioni di input/output legate alla gestione * del gioco dell'impiccato. * * Fornisce un metodo di utilità per l'estrazione della parola segreta * da file e un metodo statico per la stampa grafica dell'impiccato * in base al numero di errori commessi. */ interface IOImpiccato { /** * Estrae una parola casuale dal file indicato. * In caso di problemi di lettura, gestisce l'eccezione I/O * e restituisce {@code null}. * * @param path percorso del file contenente l'elenco delle parole. * @param msg1 messaggio da mostrare in caso di errore di lettura. * @return parola estratta come oggetto generico, oppure {@code null} * se si è verificato un errore. */ default Object estraiParola(Path path, String msg1) { final Random rn = new Random(); List lista = null; try { lista = Files.readAllLines(path); } catch (IOException e) {} if (lista == null || lista.isEmpty()) { System.out.println(msg1 + path + "\n\n"); System.exit(1); } return lista.get(rn.nextInt(lista.size())); } /** * Stampa a video la rappresentazione testuale dell'impiccato * in funzione del numero di tentativi errati effettuati. * * @param count numero di errori commessi dal giocatore. */ public static void printImpiccato(int count) { // disegno il sostegno e la corda String s1=(" |ˉˉˉˉˉ|"); String s2=(" | "); String s3=(" | "); String s4=(" | "); String s5=("_|_ "); String[] array1= { s2, s3, s4}; System.out.println("\n" + s1); for (int i = 0; i < 3; i++) System.out.print(array1[i] + "\n"); System.out.println(s5); // disegno l'impiccato String s6=("ò_ò\033[1B\033[4D°-|-°\033[1B\033[3D∫la"); System.out.print("\033[4A"); // salgo di 4 righe System.out.print("\033[6C"); // vado 6 colonne a destra int tent = count + 2; // Compensa i caratteri ANSI che occupano spazio if (count >= 2) tent += 8; // dopo 'ò_ò' ci sono 2 escape = 8 caratteri if (count >= 6) tent += 8; // dopo '°-|-°' ci sono altri 2 escape = 8 caratteri for (int i = 0; i < tent; i++) System.out.print(s6.charAt(i)); System.out.print("\033[3B"); // Scendo di 3 righe if(count == 1) System.out.println(""); } }