Guide for Penjat 2
Com abordar aquest problema
Has de programar un joc del penjat: per cada cas de prova, l'usuari va introduint lletres una a \ una fins que endevina la paraula secreta o arriba a 5 errors (les 6 etapes del dibuix, des de la \ forca buida fins al penjat complet).
Idea general:
- Llegeix el nombre de casos de prova i, per cadascun, la paraula secreta.
- Manté un "estat" de la paraula amb
_per cada lletra encara no endevinada (per exemple una \ llista de caràcters, tots_inicialment, de la mateixa longitud que la paraula). - Manté també un comptador d'errors (començant a 0) i un conjunt de lletres ja provades, per no \ tornar-les a comptar.
- Llegeix lletres una a una:
- Si la lletra és
1974, l'usuari es rendeix i el cas acaba aquí. - Si la lletra ja s'havia provat abans, ignora-la.
- Si la lletra és a la paraula, revela-la a totes les posicions on apareix.
- Si no hi és, incrementa el comptador d'errors.
- Si la lletra és
- Després de cada lletra, mostra l'estat actual de la paraula i el dibuix corresponent al nombre \ d'errors actual (cap, torç, braç esquerre, braç dret, cama esquerra, cama dreta — un tram nou per \ cada error).
- Acaba el cas quan s'endevina tota la paraula (missatge de victòria) o quan s'arriba a 5 errors \ (missatge de derrota), i llavors ja no cal seguir mostrant res més d'aquell cas.
Paranys habituals:
- El dibuix té 6 etapes (de 0 a 5 errors): prepara-les totes per endavant (per exemple com una \ llista de textos de diverses línies) i selecciona la que toca segons el comptador d'errors.
- No oblidis marcar les lletres ja usades, perquè si es repeteixen no comptin com un error nou ni \ tornin a revelar res.
- Un cop la paraula s'ha endevinat o el penjat s'ha completat, no s'ha de seguir processant res \ més d'aquell cas.
Pista per a Java
Fes servir un char[] per l'estat de la paraula (per poder modificar-lo posició a posició) i un \
Set<Character> per les lletres ja provades:
import java.util.*;
public class Main {
public static void main(String[] args) {
String[] dibuixos = {
// dibuixos[0] = forca buida ... dibuixos[5] = penjat complet
// ompliu aqui les 6 etapes del dibuix, tal com es descriuen a l'enunciat
};
Scanner sc = new Scanner(System.in);
int n = Integer.parseInt(sc.nextLine().trim());
for (int c = 0; c < n; c++) {
String paraula = sc.nextLine().trim();
char[] revelada = new char[paraula.length()];
Arrays.fill(revelada, '_');
Set<Character> provades = new HashSet<>();
int errors = 0;
boolean acabat = false;
while (!acabat) {
String entrada = sc.nextLine().trim();
if (entrada.equals("1974")) {
break;
}
char lletra = entrada.charAt(0);
if (provades.contains(lletra)) {
continue;
}
provades.add(lletra);
if (paraula.indexOf(lletra) >= 0) {
for (int i = 0; i < paraula.length(); i++) {
if (paraula.charAt(i) == lletra) {
revelada[i] = lletra;
}
}
} else {
errors++;
}
System.out.println(new String(revelada));
System.out.println(dibuixos[errors]);
if (new String(revelada).indexOf('_') < 0) {
System.out.println("Felicitats! Has endevinat la paraula");
acabat = true;
} else if (errors == 5) {
System.out.println("Vaja! No has endevinat la paraula");
acabat = true;
}
}
}
}
}