/* * File: Hangman.java * ------------------ * This program will eventually play the Hangman game from * Assignment #4. */ import acm.graphics.*; import acm.program.*; import acm.util.*; import java.awt.*; import java.util.Arrays; import java.util.Random; public class Hangman extends ConsoleProgram { private static final int NUM_GUESSES = 8; private static Random generator = new Random(); private HangmanLexicon lexicon; private String word; private char[] working; private String guessedLetters; private int guessesRemaining; public void run() { setup(); while(true) { play(); if(!playAgain()) break; } } public void setup() { lexicon = new HangmanLexicon("ShorterLexicon.txt"); println("Welcome to Hangman!"); } public void play() { pickWord(); guessesRemaining = NUM_GUESSES; while(true) { println("The word now looks like this " + workingString()); printNumGuesses(); String guessLine = getGuess(); if(guessLine.equalsIgnoreCase(word)) { printWinMessage(); break; } checkGuess(guessLine); if(guessesRemaining == 0) { printLossMessage(); break; } else if(!workingString().contains("-")) { printWinMessage(); break; } } } private void checkGuess(String guessLine) { char guess = guessLine.charAt(0); if(guessedLetters.indexOf(guess) != -1) { println("You have already guessed that letter"); return; } else if(guessIsCorrect(guess)) { println("That guess is correct."); updateWorkingSet(guess); } else { println("There are no " + guess + "'s in the word."); guessesRemaining--; } guessedLetters += guess; } public void pickWord() { word = lexicon.getWord(generator.nextInt(lexicon.getWordCount())); working = new char[word.length()]; Arrays.fill(working, '-'); guessedLetters = ""; } public String getGuess() { String guess = readLine("Your guess: ").toUpperCase(); if(guess.equals("") || guess.charAt(0) < 'A' || guess.charAt(0) > 'Z' || (guess.length() > 1 && !guess.equalsIgnoreCase(word))) { println("Invalid guess!"); return getGuess(); } return guess; } public boolean guessIsCorrect(char ch) { return (word.indexOf(ch) != -1); } public void updateWorkingSet(char ch) { for(int i = 0; i < word.length(); i++) if(word.charAt(i) == ch) working[i] = ch; } public String workingString() { return new String(working); } public void printNumGuesses() { if(guessesRemaining > 1) { println("You have " + guessesRemaining + " guesses left."); } else { println("You have only one guess left."); } } public void printWinMessage() { println("You guessed the word: " + word + "\nYou win."); } public void printLossMessage() { println("You are completely hung."); println("The word was: " + word); println("You lose."); } public boolean playAgain() { println(); String ans = readLine("Play again? (y/n)").toLowerCase(); if(ans.equals("y")) return true; else if(ans.equals("n")) return false; else return playAgain(); } }