I guess you've got this covered by now, but I was curious, so I made a shot at your classes, and commented my changes. Hopefully you, or someone else, can get some use of it :-]
// renamed from Hangman
public class Main {
public static void main(String[] args) {
// removed need for JFrame as no GUI is actually used.
Hangman hangman = new Hangman();
// starting a thread with the hangman runnable
new Thread(hangman).start();
// main thread will end here, but the hangman thread will keep the program running.
}
}
Then the actual Hangman class:
import java.util.Arrays;
import java.util.Scanner;
// Renamed from HangmanPanel, changed from JPanel to Runnable since no GUI is shown.
public class Hangman implements Runnable {
// always use 7 lives, as this is the number of "hangman images" in reduceLives()
private int lives = 7;
private char[] hiddenWord;
private char[] aOfWord;
// I'm guessing that at some point you will use these randomly?
private String[] words = { "ADA", "COBOL", "LOGO", "BASIC", "PROLOG", "UBUNTU", "UHURU" };
@Override
public void run() {
// This is the new Try-With-Resources in Java 7.
// If you don't have Java 7, just change the
// try ( Scanner scan = new Scanner(System.in) ) {
// to
// try {
// Scanner scan = new Scanner(System.in);
try ( Scanner scan = new Scanner(System.in) ) {
System.out.println("Enter the word to be searched: ");
String inputw = scan.nextLine();
aOfWord = inputw.toCharArray();
hiddenWord = new char[aOfWord.length];
// nice method for filling an array.
Arrays.fill(hiddenWord, '_');
// renamed from output
showStatus();
// fixed outer while-loop
while (lives > 0 && Arrays.equals(aOfWord, hiddenWord) == false) {
System.out.println("Please choose a letter: ");
String guessletter = scan.nextLine();
if(guessletter.isEmpty()) {
System.out.println("You must enter a letter. Try again!");
} else {
checkForMatch(guessletter);
}
// refactored all inner loops into checkForMatch() and reduceLives()
}
System.out.println("Game over, you " + (lives > 0 ? "won" : "lost"));
} catch (Exception e) {
System.err.println("Error: " + e.getMessage());
}
}
private void checkForMatch(String letter) {
boolean found = false;
for (int i = 0; i < aOfWord.length; i++) {
if (letter.charAt(0) == aOfWord[i]) {
found = true;
hiddenWord[i] = letter.charAt(0);
// removed break when found to allow searching entire word
}
// removed else condition to avoid clearing 'found' when searching rest of word
}
if(!found) {
// reduceLives() will also print new hangman
reduceLives();
}
// printing summary
showStatus();
}
private void reduceLives() {
lives = lives - 1;
switch (lives) {
case 6:
System.out.println("_____");
System.out.println("| |");
System.out.println("| ");
System.out.println("| ");
System.out.println("| ");
break;
case 5:
System.out.println("_____");
System.out.println("| |");
System.out.println("| o");
System.out.println("| ");
System.out.println("| ");
break;
case 4:
System.out.println("_____");
System.out.println("| |");
System.out.println("| o");
System.out.println("| | ");
System.out.println("| ");
break;
case 3:
System.out.println("_____");
System.out.println("| |");
System.out.println("| o");
System.out.println("| /| ");
System.out.println("| ");
break;
case 2:
System.out.println("_____");
System.out.println("| |");
System.out.println("| o");
System.out.println("| /|\\ ");
System.out.println("| ");
break;
case 1:
System.out.println("_____");
System.out.println("| |");
System.out.println("| o");
System.out.println("| /|\\ ");
System.out.println("| \\");
break;
case 0:
System.out.println("_____");
System.out.println("| |");
System.out.println("| o");
System.out.println("| /|\\");
System.out.println("| / \\");
break;
}
}
private void showStatus() {
System.out.println("Lives remaining: " + lives);
System.out.println("Word found so far " + new String(hiddenWord));
}
}