/* * 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.*; public class Hangman extends ConsoleProgram { public static Random generator = new Random(); public HangmanLexicon lexicon; public HangmanCanvas canvas; public String SecretWord; public char[] GuessedWord; public int numGuessesLeft; public void run() { setUpObjects(); while(true) { setUpVariables(); println("Welcome to Hangman!"); while(true) { printGuessedWord(); println("You have "+numGuessesLeft+" guesses left."); getGuess(); updateCanvasGuessedWord(); if(checkWinCondition()) break; } if(!playAgain()) break; canvas.reset(); } exit(); } public void setUpObjects() { lexicon = new HangmanLexicon("HangmanLexicon.txt"); canvas = new HangmanCanvas(); setLayout(new GridLayout(1,2)); add(canvas); validate(); canvas.reset(); } public void setUpVariables() { setSecretWord(); updateCanvasGuessedWord(); numGuessesLeft = 8; } public void setSecretWord() { SecretWord = lexicon.getWord(generator.nextInt(lexicon.getWordCount())); GuessedWord = new char[SecretWord.length()]; for(int i = 0; i < GuessedWord.length; i++) { GuessedWord[i] = '-'; } } public boolean secretWordContains(char ch) { if(Character.isLetter(ch)) { return SecretWord.contains(Character.toString(ch).toUpperCase()); } return false; } public void getGuess() { while(true) { String guess = readLine("Your guess: "); guess = guess.toUpperCase(); if(guess.length() == 0) { println("Invalid guess! Please enter a valid guess!"); }else if(guess.length() == 1 && secretWordContains(guess.charAt(0))) { changeGuessedWord(guess.charAt(0)); println("That guess is correct."); break; } else if(guess.equalsIgnoreCase(SecretWord)) { guessedWholeWord(); break; } else if(guess.length() > 1) { println("Invalid guess! Please enter a valid guess!"); } else { println("There are no "+guess+"\'s in the word."); updateCanvasIncorrectGuess(guess.charAt(0)); numGuessesLeft--; break; } } } public String getGuessedWord() { return new String(GuessedWord); } public void printGuessedWord() { println("The word now looks like this: "+getGuessedWord()); } public void changeGuessedWord(char ch) { ch = Character.toUpperCase(ch); for(int i = 0; i < SecretWord.length(); i++) { if(SecretWord.charAt(i) == ch) { GuessedWord[i] = ch; } } } public void guessedWholeWord() { GuessedWord = SecretWord.toCharArray(); } public boolean wordIsGuessed() { for(int i = 0; i < GuessedWord.length; i++) { if(GuessedWord[i] == '-') return false; } return true; } public boolean checkWinCondition() { if(wordIsGuessed()) { println("You guessed the word: "+SecretWord); println("You win!"); canvas.displayEndgame(SecretWord,Color.green); return true; } else if(numGuessesLeft < 1) { println("You are completely hung."); println("the word was: "+SecretWord); println("You lose :("); canvas.displayEndgame(SecretWord, Color.red); int n = 0; while(n<40) { canvas.move(); canvas.repaint(); this.pause(10); n++; } n = 0; while(n<70) { canvas.moveHead(); canvas.repaint(); this.pause(10); n++; } canvas.addX(); canvas.repaint(); return true; } return false; } public boolean playAgain() { println(); println(); while(true) { String ans = readLine("Would you like to play again? (y/n): "); if(ans.equalsIgnoreCase("y")) { println(); println(); println(); println(); println(); return true; } else if(ans.equalsIgnoreCase("n")) return false; } } public void updateCanvasGuessedWord() { canvas.displayWord(getGuessedWord()); } public void updateCanvasIncorrectGuess(char ch) { canvas.noteIncorrectGuess(ch); } }