Hangman

Man kan naturligtvis göra på många olika sätt, om man 'önsketänker' kan man komma fram till ungefär följande lösning (lösningen fungerar inte om man matar in en dold sträng som innehåller tecknet '-', vi skulle kunna låta programmet kontrollera den gömda raden så att den inte gör det):

import se.lth.cs.pt.io.*;

class Hangman {

    public static void main(String[] args) {
        new Hangman().run();
    }

    String letters = "abcdefghijklmnopqrstuvwxyzåäö";
    char mark = '-';
    StringBuilder pattern;
    String hidden;
    int nbrOfGuesses = 0;

    void run() {
        enterHiddenSentence();
        do {
            enterGuess();
        } while (!finished());
        congratulate();
    }

    void enterHiddenSentence() {
        hidden = Keyboard.nextPassword("Skriv in gömd mening: ").toLowerCase();
        clearTerminal();
        createPattern();
        nbrOfGuesses = 0;
    }

    void clearTerminal() {
        for (int k = 1; k <= 100; k++) {
            System.out.println();
        }
    }

    void createPattern() {
        pattern = new StringBuilder();
        for (int k = 0; k < hidden.length(); k++) {
            char ch = hidden.charAt(k);
            if (isLetter(ch)) {
                pattern.append(mark);
            } else {
                pattern.append(ch);
            }
        }
    }

    boolean finished() {
        return pattern.indexOf("-") < 0;
    }

    void enterGuess() {
        char ch = Keyboard.nextLine(pattern.toString() + ": ").charAt(0);
        if (!goodGuess(ch)) {
            nbrOfGuesses++;
        }
    }

    boolean goodGuess(char ch) {
        boolean found = false;
        for (int k = 0; k < hidden.length(); k++) {
            if (ch == hidden.charAt(k) && pattern.charAt(k) == mark) {
                pattern.setCharAt(k, ch);
                found = true;
            }
        }
        return found;
    }

    boolean isLetter(char ch) {
        return letters.indexOf(ch) >= 0;
    }

    void congratulate() {
        System.out.print("Grattis, du klarade det med ");
        System.out.print(nbrOfGuesses);
        System.out.println(" felgissningar.");
    }
}