Welcome to the Treehouse Community

Want to collaborate on code errors? Have bugs you need feedback on? Looking for an extra set of eyes on your latest project? Get support with fellow developers, designers, and programmers of all backgrounds and skill levels here with the Treehouse Community! While you're at it, check out some resources Treehouse students have shared here.

Looking to learn something new?

Treehouse offers a seven day free trial for new students. Get access to thousands of hours of content and join thousands of Treehouse students and alumni in the community today.

Start your free trial

Java Java Objects (Retired) Delivering the MVP Refactoring

Kevin Faust
Kevin Faust
15,353 Points

no error but keep getting "letter has already been guessed. please try again"

so whenever i enter a letter/string, it will keep giving me that error in the console. I checked over my code involving the part deciding whether the letter is inside mHits or inside mMisses. Everything seems perfectly fine but i have no idea. it was working fine before this video.

hangman.java

public class Hangman {

    public static void main(String[] args) {
        // Enter amazing code here:
      Game game = new Game("treehouse");
      Prompter prompter = new Prompter(game);
      prompter.play();
    }
}

prompter.java

import java.io.Console;

public class Prompter {
  private Game mGame;

  public Prompter(Game game) {
    mGame = game;
  }

  public void play() {
    while (mGame.getRemainingTries() > 0) {
     displayProgress();
     promptForGuess();
    }
  }

  public boolean promptForGuess() {
    Console console = System.console();
    boolean isHit = false;
    boolean isValidGuess = false;
    while (!isValidGuess) {
      String guessAsString = console.readLine("Enter a letter: ");
      try {
        isHit = mGame.applyGuess(guessAsString);
        mGame.applyGuess(guessAsString);
        isValidGuess = true;
      } catch (IllegalArgumentException iae) {
       console.printf("%s. Please try again.\n", iae.getMessage());
      }
    }
   return isHit;
  }

  public void displayProgress() {
   System.out.printf("You have %d tries left to solve: %s\n",mGame.getRemainingTries(), mGame.getCurrentProgress());
  }


}

game.java

public class Game {
  public static final int MAX_MISSES = 7;
  private String mAnswer;
  private String mHits;
  private String mMisses;

  public Game(String answer) {
    mAnswer = answer;
    mHits = "";
    mMisses = "";
  }

  private char validateGuess(char letter) {
   if (!Character.isLetter(letter)) { 
     throw new IllegalArgumentException("A letter is required");
   }
    letter = Character.toLowerCase(letter);
    if (mMisses.indexOf(letter) >= 0 || mHits.indexOf(letter) >= 0) {
      throw new IllegalArgumentException(letter + " has already been guessed");
    }
    return letter;
  }

  public boolean applyGuess(String letters) {
    if (letters.length() == 0) {
      throw new IllegalArgumentException("no letter found");
    }
    return applyGuess(letters.charAt(0));
  }

  public boolean applyGuess(char letter) {
    letter = validateGuess(letter);
    boolean isHit = mAnswer.indexOf(letter) >= 0;
    if (isHit) {
      mHits += letter; 
    } else {
      mMisses += letter; 
    }
    return isHit;
}

  public String getCurrentProgress() {
    String progress = "";
    for (char letter: mAnswer.toCharArray()) {
     char display =  '-';
      if (mHits.indexOf(letter) >= 0) {
        display = letter;
      }
      progress += display;
    }
    return progress;
  }

  public int getRemainingTries () {
    return MAX_MISSES - mMisses.length();
  }

}

1 Answer

Woah. It sure did take me awhile to find the problem. Turns out you added one extra line of code. Remove the following code on line 25 in Prompter.java:

mGame.applyGuess(guessAsString);
Kevin Faust
Kevin Faust
15,353 Points

Thank you alot for your time and help Kristian. that second line was camouflaged

Any time :) Glad I could help.