-1

I got a couple issues with my code. I know it is not the best looking design/coding but I don't claim to be a good programmer yet. I have to other classes does their work correctly. Dictionary class which contains a word list and HangmanAnimation class which draws the hangman onto console.

Now, I want my game to ask to player if he/she wants to play again after the game finished. Actually, it does asking if player wants to play again but exits the game before the player can type anything.

I would appreciate any other suggestions aswell. Thanks in advance! You guys really rock! :)

public class HangmanGame {
    public static void main(String[] args) {
        HangmanUI ui = new HangmanUI();
        ui.initialize();
        String input = "";
        if(ui.newGame(input).equalsIgnoreCase("yes"))
            main(null);
    }
}

public class HangmanUI {

    private final Dictionary d = new Dictionary();
    private final HangmanAnimation ha = new HangmanAnimation();
    private String wordInProgress = d.getWordInProgress();
    Scanner sc = new Scanner(System.in);
    private int maxTries = 5;
    String word;

    public void initialize() {
        int easyWords = 1;
        int hardWords = 2;
        System.out.println("Welcome to Hangman game.");
        System.out.println("=========================");
        System.out.println("Rules: You need to find the given word in 5 tries.");
        System.out.println("You will continue guessing letters until you can either");
        System.out.println("solve the word or all five body parts are on the gallows.");
        System.out.println("In that case you will lose the game. Try not to enter");
        System.out.println("same letter more than once. Those are counts too.");
        System.out.println();
        System.out.println("Choose your game level or Quit:");
        System.out.println("1) Easy");
        System.out.println("2) Hard");
        System.out.println("3) Quit");

        try {
            int playersChoice = sc.nextInt();
            switch (playersChoice) {
                case 1:
                    d.wordList(easyWords);
                    break;
                case 2:
                    d.wordList(hardWords);
                    break;
                case 3:
                    System.out.println("Thank you for your time!");
                    System.exit(0);
                default:
                    System.out.println("Invalid input. Try again!");
                    initialize();
            }
            word = d.pickRandomWord(d.getWordList());
            hideWord(word);

            while(maxTries > 0) {
                if(wordInProgress.contains("-")) {
                    System.out.println(wordInProgress);
                    revealLetter(notifyGuess());
                } else {
                    System.out.println("Good work! You found the word.");
                }
            } 
        } catch (InputMismatchException e) {
            System.out.println("Invalid input. Use only digits!");
        }
    }

    //TODO: Do not count same letter more than once & let player to know.
    public char notifyGuess() {
        ArrayList<Character> charSet = new ArrayList<>();
        System.out.print("Please enter a letter: ");
        char c = sc.next().charAt(0);
        if(Character.isDigit(c)){
            System.out.println("You can't use numbers. Please enter a letter.");
            notifyGuess();
        } else if(charSet.contains(c)) {
            System.out.println("You already used '" + c + "' before.");
            notifyGuess();
        } else
            charSet.add(c);
        return c; 
    }

    public void hideWord(String word) {
        StringBuilder sb = new StringBuilder();
        for(int i = 0; i < word.length(); i++) {
            sb.append("-");
        }
        wordInProgress = sb.toString();
    }

    public void revealLetter(char c) {
        try {
            String temp = wordInProgress;
            char[] charArray = wordInProgress.toCharArray();
            for (int i = 0; i < word.length(); i++) {
                if(c == word.charAt(i))
                    charArray[i] = word.charAt(i);
            }
            wordInProgress = new String(charArray);
            if(temp.equals(wordInProgress)){
                maxTries--;
                ha.drawHanging(maxTries);
            } else {
                System.out.println("Good! There is '" + c + "' in the word.");
            }
        } catch (StringIndexOutOfBoundsException e) {
            System.err.println("You have to enter a character!");
        }
    }

    public String newGame(String input) {
        System.out.println("Do you want to play again? (yes/no)");
        input = sc.nextLine();
        return input;
    }
}
oxyt
  • 1,039
  • 3
  • 16
  • 29

1 Answers1

1

Try using this:

    System.out.println("Do you want to play again? (yes/no)");
    input = sc.next(); //<== here is the change
    return input;
SkyMaster
  • 1,303
  • 1
  • 8
  • 15
  • Hi Jose! Thank you for your answer! It works well. Did problem occured because i did use `sc.next()` and `sc.nextLine()` in the same code? I got another problem. In `notifyGuess()` method, I want to check if a character already used and notify the player with `System.out.println("You already used '" + c + "' before.");` but it doesn't work! Same characters still counts! – oxyt Oct 27 '14 at 08:30
  • @oxyt Remove this line from the method `notifyGuess()`: `ArrayList charSet = new ArrayList<>();` And define it in the class: `public class HangmanUI `. About next() and nextline() here a better explanation.[Difference between next() and nextLine()?](http://stackoverflow.com/questions/22458575/whats-the-difference-between-next-and-nextline-methods-from-scanner-class) – SkyMaster Oct 27 '14 at 18:15