From 07bfdb591266e57f9644b8ccd76f80b61520dcff Mon Sep 17 00:00:00 2001 From: Darren Cardenas <53984972+darrencardenas@users.noreply.github.com> Date: Sun, 4 Apr 2021 00:28:36 -0400 Subject: [PATCH] Ported Word to Java. --- 96 Word/java/Word.java | 223 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 223 insertions(+) create mode 100644 96 Word/java/Word.java diff --git a/96 Word/java/Word.java b/96 Word/java/Word.java new file mode 100644 index 00000000..7cae9124 --- /dev/null +++ b/96 Word/java/Word.java @@ -0,0 +1,223 @@ +import java.util.Arrays; +import java.util.Scanner; + +/** + * Game of Word + *

+ * Based on the BASIC game of Word here + * https://github.com/coding-horror/basic-computer-games/blob/main/96%20Word/word.bas + *

+ * Note: The idea was to create a version of the 1970's BASIC game in Java, without introducing + * new features - no additional text, error checking, etc has been added. + * + * Converted from BASIC to Java by Darren Cardenas. + */ + +public class Word { + + private final static String[] WORDS = { + + "DINKY", "SMOKE", "WATER", "GRASS", "TRAIN", "MIGHT", + "FIRST", "CANDY", "CHAMP", "WOULD", "CLUMP", "DOPEY" + + }; + + private final Scanner scan; // For user input + + private enum Step { + INITIALIZE, MAKE_GUESS, USER_WINS + } + + public Word() { + + scan = new Scanner(System.in); + + } // End of constructor Word + + public void play() { + + showIntro(); + startGame(); + + } // End of method play + + private void showIntro() { + + System.out.println(" ".repeat(32) + "WORD"); + System.out.println(" ".repeat(14) + "CREATIVE COMPUTING MORRISTOWN, NEW JERSEY"); + System.out.println("\n\n"); + + System.out.println("I AM THINKING OF A WORD -- YOU GUESS IT. I WILL GIVE YOU"); + System.out.println("CLUES TO HELP YOU GET IT. GOOD LUCK!!"); + System.out.println("\n"); + + } // End of method showIntro + + private void startGame() { + + char[] commonLetters = new char[8]; + char[] exactLetters = new char[8]; + + int commonIndex = 0; + int ii = 0; // Loop iterator + int jj = 0; // Loop iterator + int numGuesses = 0; + int numMatches = 0; + int wordIndex = 0; + + Step nextStep = Step.INITIALIZE; + + String commonString = ""; + String exactString = ""; + String guessWord = ""; + String secretWord = ""; + String userResponse = ""; + + // Begin outer while loop + while (true) { + + switch (nextStep) { + + case INITIALIZE: + + System.out.println("\n"); + System.out.println("YOU ARE STARTING A NEW GAME..."); + + // Select a secret word from the list + wordIndex = (int) (Math.random() * WORDS.length); + secretWord = WORDS[wordIndex]; + + numGuesses = 0; + + Arrays.fill(exactLetters, 1, 6, '-'); + Arrays.fill(commonLetters, 1, 6, '\0'); + + nextStep = Step.MAKE_GUESS; + break; + + case MAKE_GUESS: + + System.out.print("GUESS A FIVE LETTER WORD? "); + guessWord = scan.nextLine().toUpperCase(); + + numGuesses++; + + // Win condition + if (guessWord.equals(secretWord)) { + nextStep = Step.USER_WINS; + continue; + } + + Arrays.fill(commonLetters, 1, 8, '\0'); + + // Surrender condition + if (guessWord.equals("?")) { + System.out.println("THE SECRET WORD IS " + secretWord); + System.out.println(""); + nextStep = Step.INITIALIZE; // Play again + continue; + } + + // Check for valid input + if (guessWord.length() != 5) { + System.out.println("YOU MUST GUESS A 5 LETTER WORD. START AGAIN."); + numGuesses--; + nextStep = Step.MAKE_GUESS; // Guess again + continue; + } + + numMatches = 0; + commonIndex = 1; + + for (ii = 1; ii <= 5; ii++) { + + for (jj = 1; jj <= 5; jj++) { + + if (secretWord.charAt(ii - 1) != guessWord.charAt(jj - 1)) { + continue; + } + + // Avoid out of bounds errors + if (commonIndex <= 5) { + commonLetters[commonIndex] = guessWord.charAt(jj - 1); + commonIndex++; + } + + if (ii == jj) { + exactLetters[jj] = guessWord.charAt(jj - 1); + } + + // Avoid out of bounds errors + if (numMatches < 5) { + numMatches++; + } + } + } + + exactString = ""; + commonString = ""; + + // Build the exact letters string + for (ii = 1; ii <= 5; ii++) { + exactString += exactLetters[ii]; + } + + // Build the common letters string + for (ii = 1; ii <= numMatches; ii++) { + commonString += commonLetters[ii]; + } + + System.out.println("THERE WERE " + numMatches + " MATCHES AND THE COMMON LETTERS WERE..." + + commonString); + + System.out.println("FROM THE EXACT LETTER MATCHES, YOU KNOW................" + exactString); + + // Win condition + if (exactString.equals(secretWord)) { + nextStep = Step.USER_WINS; + continue; + } + + // No matches + if (numMatches <= 1) { + System.out.println(""); + System.out.println("IF YOU GIVE UP, TYPE '?' FOR YOUR NEXT GUESS."); + } + + System.out.println(""); + nextStep = Step.MAKE_GUESS; + break; + + case USER_WINS: + + System.out.println("YOU HAVE GUESSED THE WORD. IT TOOK " + numGuesses + " GUESSES!"); + System.out.println(""); + + System.out.print("WANT TO PLAY AGAIN? "); + userResponse = scan.nextLine(); + + if (userResponse.toUpperCase().equals("YES")) { + nextStep = Step.INITIALIZE; // Play again + } else { + return; // Quit game + } + break; + + default: + System.out.println("INVALID STEP"); + break; + + } + + } // End outer while loop + + } // End of method startGame + + public static void main(String[] args) { + + Word word = new Word(); + word.play(); + + } // End of method main + +} // End of class Word