Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
74 changes: 74 additions & 0 deletions org/asl/socketserver/games/Hangman.java
Original file line number Diff line number Diff line change
@@ -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");
}

}
}
80 changes: 80 additions & 0 deletions org/asl/socketserver/games/HangmanMenu.java
Original file line number Diff line number Diff line change
@@ -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++;
}
}
181 changes: 181 additions & 0 deletions org/asl/socketserver/games/Word.java
Original file line number Diff line number Diff line change
@@ -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;
}
}