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
David Magnússon
6,601 PointsIm getting stuck in an endless loop and cant figure out where i went wrong.
So the problem is when i compile it runs fine and prompts me, after i ask a letter it just keeps asking and it doesn´t tell me if i have hits or misses, Any help would be greatly appreciated as i have tried to debug it myself for some time now and cant seem to figure it out.
class Game {
public static final int MAX_MISSES = 7;
private String answer;
private String hits;
private String misses;
public Game(String answer){
this.answer = answer.toLowerCase();
hits = "";
misses = "";
}
private char normalizeGuess(char letter){
if (! Character.isLetter(letter)){
throw new IllegalArgumentException("A letter is requierd");
}
letter = Character.toLowerCase(letter);
if (misses.indexOf(letter) != -1 || hits.indexOf(letter) != -1){
throw new IllegalArgumentException(letter + " has allready 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 = normalizeGuess(letter);
boolean isHit = answer.indexOf(letter) != -1;
if (isHit){
hits += letter;
} else {
misses += letter;
}
return isHit;
}
public int getRemainingTries(){
return MAX_MISSES - misses.length();
}
public String getCurrentProgress(){
String progress = "";
for (char letter : answer.toCharArray()){
char display = '-';
if ((hits.indexOf(letter) != -1)) {
display = letter;
}
progress += display;
}
return progress;
}
}
import java.util.Scanner;
class Prompter {
private Game game;
public Prompter(Game game){
this.game = game;
}
public boolean promptForGuess(){
Scanner scanner = new Scanner(System.in);
boolean isHit = false;
boolean isAcceptable = false;
do {
System.out.print("Enter a letter: ");
String guessInput = scanner.nextLine();
try {
isHit = game.applyGuess(guessInput);
} catch (IllegalArgumentException iae) {
System.out.println(iae.getMessage());
}
}while (! isAcceptable);
return isHit;
}
public void displayProgress() {
System.out.printf("You have %d tries left to solve: %s\n", game.getRemainingTries(), game.getCurrentProgress());
}
}
public class Hangman {
public static void main(String[] args) {
// Your incredible code goes here...
Game game = new Game("treehouse");
Prompter prompter = new Prompter(game);
while (game.getRemainingTries() > 0) {
prompter.displayProgress();
prompter.promptForGuess();
}
}
}
Moderator edited: Added markdown so the code renders properly in the forums.
1 Answer
Steve Hunter
57,712 PointsHi David,
This loop cannot be exited:
do {
System.out.print("Enter a letter: ");
String guessInput = scanner.nextLine();
try {
isHit = game.applyGuess(guessInput);
} catch (IllegalArgumentException iae) {
System.out.println(iae.getMessage());
}
}while (!isAcceptable);
Nothing changes the value of isAcceptable so you just keep going round in there.
The two strings hits and misses are populated with your guesses but there's no output to say that you've guessed correctly. Run it in debug mode and put a breakpoint at the end of the applyGuess(char letter) method. You'll see your guesses being added to those variables.
Steve.
Steve Hunter
57,712 PointsSteve Hunter
57,712 PointsRemote repo