diff --git a/25 Chief/java/src/Chief.java b/25 Chief/java/src/Chief.java new file mode 100644 index 00000000..d7fbbc08 --- /dev/null +++ b/25 Chief/java/src/Chief.java @@ -0,0 +1,196 @@ +import java.util.Arrays; +import java.util.Scanner; + +public class Chief { + + private enum GAME_STATE { + STARTING, + READY_TO_START, + ENTER_NUMBER, + CALCULATE_AND_SHOW, + END_GAME, + GAME_OVER + } + + private GAME_STATE gameState; + + private double calculatedNumber; + + // Used for keyboard input + private final Scanner kbScanner; + + public Chief() { + + gameState = GAME_STATE.STARTING; + + // Initialise kb scanner + kbScanner = new Scanner(System.in); + } + + /** + * Main game loop + */ + public void play() { + + do { + switch (gameState) { + + // Show an introduction the first time the game is played. + case STARTING: + intro(); + gameState = GAME_STATE.READY_TO_START; + break; + + // show an message to start + case READY_TO_START: + if(!yesEntered(displayTextAndGetInput("ARE YOU READY TO TAKE THE TEST YOU CALLED ME OUT FOR? "))) { + System.out.println("SHUT UP, PALE FACE WITH WISE TONGUE."); + } + + instructions(); + gameState = GAME_STATE.ENTER_NUMBER; + break; + + // Enter the number to be used to calculate + case ENTER_NUMBER: + double playerNumber = Double.parseDouble( + displayTextAndGetInput(" WHAT DO YOU HAVE? ")); + + // Exact same formula used in the original game to calculate the players original number + this.calculatedNumber = (playerNumber +1-5)*5/8*5-3; + + this.gameState = GAME_STATE.CALCULATE_AND_SHOW; + break; + + // Enter the number to be used to calculate + case CALCULATE_AND_SHOW: + if(yesEntered( + displayTextAndGetInput("I BET YOUR NUMBER WAS " + this.calculatedNumber + + ". AM I RIGHT? "))) { + this.gameState = GAME_STATE.END_GAME; + + } else { + // Player did not agree, so show the breakdown + double number = Double.parseDouble( + displayTextAndGetInput(" WHAT WAS YOUR ORIGINAL NUMBER? ")); + double f = number + 3; + double g = f / 5; + double h = g * 8; + double i = h/5 + 5; + double j = i -1; + System.out.println("SO YOU THINK YOU'RE SO SMART, EH?"); + System.out.println("NOW WATCH."); + System.out.println(number +" PLUS 3 EQUALS " + f + ". THIS DIVIDED BY 5 EQUALS " + g); + System.out.println("THIS TIMES 8 EQUALS " + h + ". IF WE DIVIDE BY 5 AND ADD 5,"); + System.out.println("WE GET " + i + ", WHICH, MINUS 1, EQUALS " + j + "."); + if(yesEntered(displayTextAndGetInput("NOW DO YOU BELIEVE ME? "))) { + this.gameState = GAME_STATE.END_GAME; + } else { + // Time for a lightning bolt. + System.out.println("YOU HAVE MADE ME MAD!!!"); + System.out.println("THERE MUST BE A GREAT LIGHTNING BOLT!"); + System.out.println(); + for(int x=30; x>=22; x--) { + System.out.println(tabbedSpaces(x) + "X X"); + } + System.out.println(tabbedSpaces(21) + "X XXX"); + System.out.println(tabbedSpaces(20) + "X X"); + System.out.println(tabbedSpaces(19) + "XX X"); + for(int y=20; y>=13; y--) { + System.out.println(tabbedSpaces(y) + "X X"); + } + System.out.println(tabbedSpaces(12) + "XX"); + System.out.println(tabbedSpaces(11) + "X"); + System.out.println(tabbedSpaces(10) + "*"); + System.out.println(); + System.out.println("#########################"); + System.out.println(); + System.out.println("I HOPE YOU BELIEVE ME NOW, FOR YOUR SAKE!!"); + this.gameState = GAME_STATE.GAME_OVER; + } + + } + break; + + // Sign off message for cases where the Chief is not upset + case END_GAME: + System.out.println("BYE!!!"); + this.gameState = GAME_STATE.GAME_OVER; + break; + + // GAME_OVER State does not specifically have a case + } + } while (gameState != GAME_STATE.GAME_OVER); + } + + /** + * Simulate tabs by building up a string of spaces + * + * @param spaces how many spaces are there to be + * @return a string with the requested number of spaces + */ + private String tabbedSpaces(int spaces) { + char[] repeat = new char[spaces]; + Arrays.fill(repeat, ' '); + return new String(repeat); + } + private void instructions() { + System.out.println(" TAKE A NUMBER AND ADD 3. DIVIDE THIS NUMBER BY 5 AND"); + System.out.println("MULTIPLY BY 8. DIVIDE BY 5 AND ADD THE SAME. SUBTRACT 1."); + } + + /** + * Basic information about the game + * + */ + private void intro() { + System.out.println("CHIEF"); + System.out.println("CREATIVE COMPUTING MORRISTOWN, NEW JERSEY"); + System.out.println(); + System.out.println("I AM CHIEF NUMBERS FREEK, THE GREAT INDIAN MATH GOD."); + } + + /** + * Returns true if a given string is equal to at least one of the values specified in the call + * to the stringIsAnyValue method + * + * @param text string to search + * @return true if string is equal to one of the varargs + */ + private boolean yesEntered(String text) { + return stringIsAnyValue(text, "Y", "YES"); + } + + /** + * Returns true if a given string contains at least one of the varargs (2nd parameter). + * Note: Case insensitive comparison. + * + * @param text string to search + * @param values varargs of type string containing values to compare + * @return true if one of the varargs arguments was found in text + */ + private boolean stringIsAnyValue(String text, String... values) { + + // Cycle through the variable number of values and test each + for(String val:values) { + if(text.equalsIgnoreCase(val)) { + return true; + } + } + + // no matches + return false; + } + + /* + * Print a message on the screen, then accept input from Keyboard. + * + * @param text message to be displayed on screen. + * @return what was typed by the player. + */ + private String displayTextAndGetInput(String text) { + System.out.print(text); + return kbScanner.next(); + } + +} \ No newline at end of file diff --git a/25 Chief/java/src/ChiefGame.java b/25 Chief/java/src/ChiefGame.java new file mode 100644 index 00000000..25ebc1bc --- /dev/null +++ b/25 Chief/java/src/ChiefGame.java @@ -0,0 +1,8 @@ +public class ChiefGame { + + public static void main(String[] args) { + + Chief chief = new Chief(); + chief.play(); + } +} \ No newline at end of file