diff --git a/org/asl/socketserver/games/Hangman.java b/org/asl/socketserver/games/Hangman.java new file mode 100644 index 0000000..cc2ed86 --- /dev/null +++ b/org/asl/socketserver/games/Hangman.java @@ -0,0 +1,74 @@ +package org.asl.socketserver.games; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.PrintWriter; + +import org.asl.socketserver.MenuInfo; +import org.asl.socketserver.Servable; + +@MenuInfo(authors = { +"Tomas Belinky and Grace Gerwe" }, version = "January, 2018", title = "Hangman", description = "Classic Hangman Game.") + +public class Hangman implements Servable{ + + public Hangman() {} + + @Override + public void serve(BufferedReader in, PrintWriter out) throws IOException { + Word word = new Word(); + + int turns = 0; + + while(true) { + out.println(word.display()); + + String letter; + + while (true) { + out.println("What letter would you like to guess?\nType quit to exit."); + letter = in.readLine(); + letter = letter.trim().toLowerCase(); + + //check response + if (letter.equals("quit")) { + break; + //if is more than one charachter + } else if (letter.length() > 1) { + out.println("Invalid letter."); + //if is not a letter + } else if (!Character.isLetter(letter.charAt(0))){ + out.println("Invalid letter."); + } else { + break; + } + } + + turns++; + + + if (letter.equals("quit")) { + out.println("You lose\nYou took " + turns + " turns\nThe word was \"" + word.getWord() + "\""); + break; + } + char letterChar = letter.charAt(0); + + if (word.hasUsedLetter(letterChar)) out.println("You've already guessed \"" + letterChar + "\" before.\nTry again.\n"); + else word.checkLetter(letterChar); + + if (!(word.isAlive())) { + out.println("You lose\nYou took " + turns + " turns\nThe word was \"" + word.getWord() + "\""); + break; + } + + if (word.isAlive() && word.isCorrect()) { + out.println(word.display()); + out.println("You win!\nIt took you " + turns + " turns to guess the word \"" + word.getWord() + "\""); + break; + } + + out.println("You have " + word.getLives() + " lives left\nThere are " + word.unkownLetters() + " unknown letters left\n"); + } + + } +} \ No newline at end of file diff --git a/org/asl/socketserver/games/HangmanMenu.java b/org/asl/socketserver/games/HangmanMenu.java new file mode 100644 index 0000000..bb6f4a8 --- /dev/null +++ b/org/asl/socketserver/games/HangmanMenu.java @@ -0,0 +1,80 @@ +package org.asl.socketserver.games; + +import java.util.Scanner; + +public class HangmanMenu { + private static int turns = 0;; + + /** + * Gets user's character guess and adds a turn + * + * @return user's guess + */ + public static String getLetter() { + String letter; + + while (true) { + System.out.println("What letter would you like to guess?\nType quit to exit."); + Scanner in = new Scanner (System.in); + letter = in.nextLine(); + letter = letter.trim().toLowerCase(); + + //check response + if (letter.equals("quit")) { + break; + //if is more than one charachter + } else if (letter.length() > 1) { + System.out.println("Invalid letter."); + //if is not a letter + } else if (!Character.isLetter(letter.charAt(0))){ + System.out.println("Invalid letter."); + } else { + break; + } + } + System.out.println(); + turns++; + return letter; + } + + /** + */ + public static void usedLetter(char c) { + System.out.println("You've already guessed \"" + c + "\" before.\nTry again.\n"); + } + + + /** + * Prints out number of lives left lives and number of letters to guess in word + * + * @param word + * Word that user is trying to guess + */ + public static void stats(Word word) { + System.out.println("You have " + word.getLives() + " lives left\nThere are " + word.unkownLetters() + " unknown letters left\n"); + } + + /** + * Prints out winning message + * + * @param word + * Word that user is trying to guess + */ + public static void win(Word word) { + System.out.println("You win!\nIt took you " + turns + " turns to guess the word \"" + word.getWord() + "\""); + } + + /** + * Prints out losing message + * + * @param word + * Word that user is trying to guess + */ + public static void lose(Word word) { + System.out.println("You lose\nYou took " + turns + " turns\nThe word was \"" + word.getWord() + "\""); + } + + public static void addTurn() { + turns++; + } +} \ No newline at end of file diff --git a/org/asl/socketserver/games/Word.java b/org/asl/socketserver/games/Word.java new file mode 100644 index 0000000..a422c7f --- /dev/null +++ b/org/asl/socketserver/games/Word.java @@ -0,0 +1,181 @@ +package org.asl.socketserver.games; + +public class Word { + private boolean[] guess; + private char[] word; + private String usedLetters = ""; + private int length; + private int lives = 10; + + //a + + public Word() { + word = generateWord().toCharArray(); + length = word.length; + guess = new boolean[length]; + setGuessesToFalse(); + } + + public Word(String word) { + this.word = word.toCharArray(); + length = word.length(); + guess = new boolean[length]; + setGuessesToFalse(); + } + + /** + * Returns a random word from an array of words + * + * @return a random word + */ + public String generateWord() { + String[] words = {"hello","amazing","football", "backpack", "tennis", "shoe", "robot", "cloth", "apple", "telephone"}; + return words[randomNum(0, words.length)]; + } + + /** + * Generates a random number + * + * @param max + * Maximum value of set + * + * @param min + * Minimum value of set + * + * @return random number inbetween min and max + */ + private static int randomNum(int min, int max) { + int random = (int)(Math.random() * max + min); + return random; + } + + /** + * Sets all values in guess boolean array to false + */ + public void setGuessesToFalse() { + for (int i = 0; i < guess.length; i++) { + guess[i] = false; + } + } + + /** + * Displays letter if letter has been guessed + * If letter has not been guessed "_" is printed + */ + public String display() { + String totalString = ""; + + for (int i = 0; i < length; i++) { + if (guess[i]) { + totalString += word[i] + " "; + } else { + totalString+= "_ "; + } + } + + return totalString; + } + + /** + * Checks if user's character is in target word + * if it is not then subtract a life + * + * @param c + * character that user has guessed + */ + public void checkLetter(char c) { + boolean gate = false; + + for (int i = 0; i < length; i++) { + if (word[i] == c) { + guess[i] = true; + gate = true; + } + } + usedLetters += c + ""; + if (!gate) lives--; + } + + /** + * Checks if the user has already guessed a character before + * + * @param c + * character that user has guessed + * + * @return true if the player has already used character c + */ + public boolean hasUsedLetter(char c) { + boolean gate = false; + + for (int i = 0; i < usedLetters.length(); i++) { + if (c == usedLetters.charAt(i)) gate = true; + } + + return gate; + } + + /** + * Gets number of lives user has left + * + * @return number of lives user has left + */ + public int getLives() { + return lives; + } + + /** + * Checks if all the letters have been guessed + * + * @return true if all the letters have been guessed + */ + public boolean isCorrect() { + boolean gate = true; + + for (int i = 0; i < length; i++) { + if (!guess[i]) { + gate = false; + } + } + + return gate; + } + + /** + * Checks if user still has more than 0 lives + * + * @return true if user has more than 0 lives + */ + public boolean isAlive() { + if (lives > 0) return true; + return false; + } + + /** + * Gets number of letters to be guessed + * + * @return number of letters that havent been guessed + */ + public int unkownLetters() { + int count = 0; + for (int i = 0; i < length; i++) { + if(!guess[i]) count++; + } + + return count; + } + + /** + * Gets target word + * + * @return target word + */ + public String getWord() { + String totalString = ""; + + for (int i = 0; i < length; i++) { + totalString += word[i] + ""; + } + + return totalString; + } +} \ No newline at end of file