package hangman; import java.awt.*; import java.applet.*; import java.awt.event.*; import javax.swing.*; import java.util.*; import java.io.*; import java.net.*; public class HangmanGame extends Applet{ HangmanCanvas hangmanCanvas = null; LetterCanvas letterCanvas = null; AnswerCanvas answerCanvas = null; JButton exitButton = null; JButton newWordButton = null; int mistakeCount = 0; String letters = null; WordEntry currentWord = null; StringBuffer partialWord = null; Vector wordList = null; int currentWordIndex = 0; boolean bWinner = false; int penalty = 0; int loadProgress = 0; class ButtonHandler implements ActionListener{ public void actionPerformed(ActionEvent e){ if(e.getSource() == exitButton){ Runtime.getRuntime().exit(0); } else if(e.getSource() == newWordButton){ newWord(); } } } class WordEntry{ String word = null; String definition = null; public WordEntry(){ } public WordEntry(String word){ this.word = word; } } public class LoadThread extends Thread{ public void run(){ //constant penalty for this word group try { penalty = Integer.parseInt(getParameter("penalty")); } catch (Exception ex) { penalty = 0; } String word_list_file = getParameter("word_list"); try { URL db = getDocumentBase(); URL url = new URL(db, word_list_file); InputStream inputStream = url.openStream(); readWordFile(inputStream); } catch (Exception ex) { System.err.println(ex); ex.printStackTrace(); } newWord(); newWordButton.setEnabled(true); } } public static void main(String[] argList){ HangmanGame game = new HangmanGame(); //words from file if(argList.length > 0){ String filename = argList[0]; try { InputStream reader = new FileInputStream(filename); game.readWordFile(reader); } catch (Exception ex) { System.err.println("Bad word filename: " + filename); return; } } game.newWord(); //frame it JFrame frame = new JFrame(); frame.setContentPane(game); frame.setBounds(100, 100, 600, 700); frame.setTitle("Hangman"); frame.show(); System.err.println("Welcome to the hangman"); } public HangmanGame(){ setLayout(null); hangmanCanvas = new HangmanCanvas(); hangmanCanvas.game = this; letterCanvas = new LetterCanvas(); letterCanvas.game = this; answerCanvas = new AnswerCanvas(); answerCanvas.game = this; exitButton = new JButton("Exit"); exitButton.addActionListener(new ButtonHandler()); newWordButton = new JButton("New Word"); newWordButton.addActionListener(new ButtonHandler()); newWordButton.setEnabled(false); add(hangmanCanvas); add(letterCanvas); add(answerCanvas); add(exitButton); add(newWordButton); } public void init(){ new LoadThread().start(); } public void setBounds(int x, int y, int w, int h){ super.setBounds(0, 0, w, h); int letterWidth = 40; int answerHeight = 100; int buttonHeight = 28; int buttonWidth = (w - letterWidth)/2; letterCanvas.setBounds(0, 0, letterWidth, h); hangmanCanvas.setBounds(letterWidth, 0, w - letterWidth, h - answerHeight - buttonHeight); answerCanvas.setBounds(letterWidth, h - answerHeight - buttonHeight, w - letterWidth, answerHeight); exitButton.setBounds(letterWidth, h - buttonHeight, buttonWidth, buttonHeight); newWordButton.setBounds(letterWidth + buttonWidth, h - buttonHeight, buttonWidth, buttonHeight); } /* * We do it this way because LineNumberReader is unreliable */ public void readWordFile(InputStream inputStream){ wordList = new Vector(); InputStreamReader reader = new InputStreamReader(inputStream); char[] buffer = new char[256]; int nRead = 0; try { for (; ; ){ char c = (char)reader.read(); switch (c){ case '\n': case '\r':{ if(nRead > 0){ addEntry(new String(buffer, 0, nRead)); } nRead = 0; break; } default:{ buffer[nRead++] = c; break; } } } } catch (Exception ex) { ex.printStackTrace(); } loadProgress = -1; answerCanvas.repaint(); } void addEntry(String line){ if(line.length() == 0){ return; } WordEntry entry = new WordEntry(); int iSpace = line.indexOf(' '); if(iSpace != -1){ entry.word = line.substring(0, iSpace); entry.word = entry.word.toUpperCase(); entry.definition = line.substring(iSpace + 1, line.length()); entry.definition = entry.definition.trim(); } else{ entry.word = line.toUpperCase(); } wordList.add(entry); loadProgress++; if(loadProgress%1000 == 0){ //answerCanvas.repaint(); //Thread.yield(); answerCanvas.paint(answerCanvas.getGraphics()); } } void buildDefaultWordList(){ wordList = new Vector(); wordList.add(new WordEntry("AARDVARK")); wordList.add(new WordEntry("TIGER")); wordList.add(new WordEntry("GIRAFFE")); } void newWord(){ int i = 0; int tryCount = 0; while (tryCount++ < 3){ i = (int)(Math.random()*wordList.size()); WordEntry test = (WordEntry)wordList.elementAt(i); if(currentWordIndex != i){ if(test.word.length() > 4){ break; } } } currentWordIndex = i; currentWord = (WordEntry)wordList.elementAt(currentWordIndex); setWord(currentWord); } public void tryLetter(int letterIndex){ int letter = letters.charAt(letterIndex); int inWord = -1; boolean mistake = true; String word = currentWord.word; do { inWord = word.indexOf(letter, inWord + 1); if(inWord != -1){ partialWord.setCharAt(inWord, (char)letter); mistake = false; } }while (inWord != -1); if(mistake){ mistakeCount++; //game is lost if(mistakeCount > 9){ letters = ""; partialWord = new StringBuffer(word); repaint(); return; } } //game is won else if(partialWord.toString().equals(word)){ bWinner = true; letters = ""; hangmanCanvas.makeColors(); repaint(); return; } //progress or error: remove letter letters = letters.substring(0, letterIndex) + letters.substring(letterIndex + 1, letters.length()); repaint(); } public void setWord(WordEntry entry){ this.currentWord = entry; this.partialWord = new StringBuffer(" ".substring(0, currentWord.word.length())); this.letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ-"; mistakeCount = 0; if(currentWord.word.length() > 8){ mistakeCount = 1; } if(currentWord.word.length() > 11){ mistakeCount = 2; } if(currentWord.word.length() > 14){ mistakeCount = 3; } mistakeCount+= penalty; bWinner = false; hangmanCanvas.makeColors(); repaint(); } }