Guide for Penjat 2


Això és una guia per ajudar-te a començar amb aquest problema — no és la solució.
Mostra el codi per a: Consideracions generals Java 11 Python 3

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:

  1. Llegeix el nombre de casos de prova i, per cadascun, la paraula secreta.
  2. 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).
  3. Manté també un comptador d'errors (començant a 0) i un conjunt de lletres ja provades, per no \ tornar-les a comptar.
  4. 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.
  5. 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).
  6. 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;
                }
            }
        }
    }
}

Tornar al problema