Hangman

Cette semaine, c'est Kévin qui vous propose un #KataOfTheWeek : Hangman

Briefing du Kata : Le jeu du pendu consiste à deviner un mot (le mot sera sélectionné aléatoirement à partir d'un fichier).

Pour deviner le mot, le joueur propose une lettre. Si le mot contient la lettre proposée, il faut dire où elle se trouve dans le mot, sinon le joueur a une erreur et on ajoute un trait pour dessiner le pendu.

Le jeu se termine dans 2 cas :

  • lorsque toutes les lettres du mot à deviner ont été trouvées par le joueur => affichage d'un message pour féliciter le joueur
  • lorsque le nombre de tentatives du joueur atteint 0 (pour ce kata, le joueur aura 6 tentatives). => affichage d'un message pour lui dire que le joueur a perdu et révélation du mot à deviner.

Saurez-vous résoudre le problème ?

Bon courage !


Et voici une solution une proposée par l'auteur en Java :

public class Hangman {

    public static int ATTEMPTS = 6;

    public static void main(String[] args) throws FileNotFoundException {

        /** file containing the words to guess in resources folder :
            morbier
            abondance
            comté
            bleu de laqueuille
        **/
        File hangmanFile = new File(Hangman.class.getClassLoader().getResource("words-to-guess.txt").getFile());
        Scanner scanner = new Scanner(hangmanFile);
        Scanner input = new Scanner(System.in);

        List<String> words = new ArrayList();
        while (scanner.hasNext()) {
            words.add(scanner.nextLine());
        }

        // select randomly a word from the file
        Random rand = new Random();
        String word = words.get(rand.nextInt(words.size()));
        char[] wordArray = word.toCharArray();

        char[] playerGuesses = new char[wordArray.length];
        boolean endGame = false;

        System.out.println("Guess the following word : ");
        printWordState(word, playerGuesses);

        while (!endGame) {

            System.out.println("******* It's time to guess : enter a letter *******");

            String letter = input.next();
            // input validation
            while (letter.length() != 1 || Character.isDigit(letter.charAt(0))) {
                System.out.println("Error Input. Try again.");
                letter = input.next();
            }

            // check if letter from word has been found
            boolean found = false;
            for (int i = 0; i < wordArray.length; i++) {
                if (letter.charAt(0) == wordArray[i]) {
                    playerGuesses[i] = wordArray[i];
                    found = true;
                }
            }

            if (!found) {
                ATTEMPTS--;
                System.out.println("Wrong Letter !");
            }

            System.out.println("\n" + "Attempts remaining : " + ATTEMPTS);
            // draw hangman
            drawHangman(ATTEMPTS);

            // winning condition
            if (printWordState(word, playerGuesses)) {
                System.out.println("Congratulations ! You win !");
                endGame = true;
            }

            // losing condition
            if (ATTEMPTS == 0) {
                System.out.println("Sorry, you lose ! Maybe next time ! The word was " + word);
                endGame = true;
            }
        }
    }

    private static boolean printWordState(String word, char[] playerGuesses) {
        int correctCount = 0;

        for (int i = 0; i < word.length(); i++) {
            if (playerGuesses[i] == word.charAt(i)) {
                System.out.print(word.charAt(i));
                correctCount++;
            } else {
                System.out.print("-");
            }
        }
        System.out.println();

        return word.length() == correctCount;
    }

    public static void drawHangman(int attempts) {
        System.out.println(" -------");
        System.out.println(" |     |");
        if (attempts <= 5) {
            System.out.println(" 0");
        }

        if (attempts <= 4) {
            System.out.print("\\ ");
            if (attempts <= 3) {
                System.out.println("/");
            } else {
                System.out.println("");
            }
        }

        if (attempts <= 2) {
            System.out.println(" |");
        }

        if (attempts <= 1) {
            System.out.print("/ ");
            if (attempts <= 0) {
                System.out.println("\\");
            } else {
                System.out.println("");
            }
        }
    }
}

Votre équipe TakiVeille

TakiVeille

TakiVeille