mirror of
https://github.com/coding-horror/basic-computer-games.git
synced 2025-12-25 04:15:45 -08:00
196 lines
7.2 KiB
Java
196 lines
7.2 KiB
Java
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();
|
|
}
|
|
|
|
} |