mirror of
https://github.com/coding-horror/basic-computer-games.git
synced 2025-12-23 07:29:02 -08:00
Java version of Trap
This commit is contained in:
202
92 Trap/java/Trap.java
Normal file
202
92 Trap/java/Trap.java
Normal file
@@ -0,0 +1,202 @@
|
||||
import java.util.Arrays;
|
||||
import java.util.Scanner;
|
||||
|
||||
/**
|
||||
* Game of Trap
|
||||
*
|
||||
* Based on the Basic game of Trap here
|
||||
* https://github.com/coding-horror/basic-computer-games/blob/main/92%20Trap/trap.bas
|
||||
*
|
||||
* Note: The idea was to create a version of 1970's Basic game in Java, without introducing
|
||||
* new features - no additional text, error checking, etc has been added.
|
||||
*/
|
||||
public class Trap {
|
||||
|
||||
public static final int HIGH_NUMBER_RANGE = 100;
|
||||
public static final int MAX_GUESSES = 6;
|
||||
|
||||
private enum GAME_STATE {
|
||||
STARTING,
|
||||
START_GAME,
|
||||
GUESSING,
|
||||
PLAY_AGAIN,
|
||||
GAME_OVER
|
||||
}
|
||||
|
||||
// Used for keyboard input
|
||||
private final Scanner kbScanner;
|
||||
|
||||
// Current game state
|
||||
private GAME_STATE gameState;
|
||||
|
||||
// Players guess count;
|
||||
private int currentPlayersGuess;
|
||||
|
||||
// Computers random number
|
||||
private int computersNumber;
|
||||
|
||||
public Trap() {
|
||||
|
||||
gameState = GAME_STATE.STARTING;
|
||||
|
||||
// Initialise kb scanner
|
||||
kbScanner = new Scanner(System.in);
|
||||
}
|
||||
|
||||
/**
|
||||
* Main game loop
|
||||
*
|
||||
*/
|
||||
public void play() {
|
||||
|
||||
do {
|
||||
switch (gameState) {
|
||||
|
||||
// Show an introduction and optional instructions the first time the game is played.
|
||||
case STARTING:
|
||||
intro();
|
||||
if(yesEntered(displayTextAndGetInput("INSTRUCTIONS? "))) {
|
||||
instructions();
|
||||
}
|
||||
gameState = GAME_STATE.START_GAME;
|
||||
break;
|
||||
|
||||
// Start new game
|
||||
case START_GAME:
|
||||
computersNumber = randomNumber();
|
||||
currentPlayersGuess = 1;
|
||||
gameState = GAME_STATE.GUESSING;
|
||||
break;
|
||||
|
||||
// Player guesses the number until they get it or run out of guesses
|
||||
case GUESSING:
|
||||
System.out.println();
|
||||
String playerRangeGuess = displayTextAndGetInput("GUESS # " + currentPlayersGuess + "? ");
|
||||
int startRange = getDelimitedValue(playerRangeGuess,0);
|
||||
int endRange = getDelimitedValue(playerRangeGuess,1);
|
||||
|
||||
// Has the player won?
|
||||
if(startRange == computersNumber && endRange == computersNumber) {
|
||||
System.out.println("YOU GOT IT!!!");
|
||||
System.out.println();
|
||||
gameState = GAME_STATE.PLAY_AGAIN;
|
||||
} else {
|
||||
// show where the guess is at
|
||||
System.out.println(showGuessResult(startRange, endRange));
|
||||
currentPlayersGuess++;
|
||||
if(currentPlayersGuess > MAX_GUESSES) {
|
||||
System.out.println("SORRY, THAT'S " + MAX_GUESSES + " GUESSES. THE NUMBER WAS "
|
||||
+ computersNumber);
|
||||
gameState = GAME_STATE.PLAY_AGAIN;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
// Play again, or exit game?
|
||||
case PLAY_AGAIN:
|
||||
System.out.println("TRY AGAIN");
|
||||
gameState = GAME_STATE.START_GAME;
|
||||
}
|
||||
} while (gameState != GAME_STATE.GAME_OVER);
|
||||
}
|
||||
|
||||
/**
|
||||
* Show the players guess result
|
||||
*
|
||||
* @param start start range entered by player
|
||||
* @param end end range
|
||||
* @return text to indicate their progress.
|
||||
*/
|
||||
private String showGuessResult(int start, int end) {
|
||||
|
||||
String status;
|
||||
if(start <= computersNumber && computersNumber <= end) {
|
||||
status = "YOU HAVE TRAPPED MY NUMBER.";
|
||||
} else if(computersNumber < start) {
|
||||
status = "MY NUMBER IS SMALLER THAN YOUR TRAP NUMBERS.";
|
||||
} else {
|
||||
status = "MY NUMBER IS LARGER THAN YOUR TRAP NUMBERS.";
|
||||
}
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
private void instructions() {
|
||||
System.out.println("I AM THINKING OF A NUMBER BETWEEN 1 AND " + HIGH_NUMBER_RANGE);
|
||||
System.out.println("TRY TO GUESS MY NUMBER. ON EACH GUESS,");
|
||||
System.out.println("YOU ARE TO ENTER 2 NUMBERS, TRYING TO TRAP");
|
||||
System.out.println("MY NUMBER BETWEEN THE TWO NUMBERS. I WILL");
|
||||
System.out.println("TELL YOU IF YOU HAVE TRAPPED MY NUMBER, IF MY");
|
||||
System.out.println("NUMBER IS LARGER THAN YOUR TWO NUMBERS, OR IF");
|
||||
System.out.println("MY NUMBER IS SMALLER THAN YOUR TWO NUMBERS.");
|
||||
System.out.println("IF YOU WANT TO GUESS ONE SINGLE NUMBER, TYPE");
|
||||
System.out.println("YOUR GUESS FOR BOTH YOUR TRAP NUMBERS.");
|
||||
System.out.println("YOU GET " + MAX_GUESSES + " GUESSES TO GET MY NUMBER.");
|
||||
}
|
||||
|
||||
private void intro() {
|
||||
System.out.println("TRAP");
|
||||
System.out.println("CREATIVE COMPUTING MORRISTOWN, NEW JERSEY");
|
||||
System.out.println();
|
||||
System.out.println();
|
||||
}
|
||||
|
||||
/**
|
||||
* Accepts a string delimited by comma's and returns the nth delimited
|
||||
* value (starting at count 0).
|
||||
*
|
||||
* @param text - text with values separated by comma's
|
||||
* @param pos - which position to return a value for
|
||||
* @return the int representation of the value
|
||||
*/
|
||||
private int getDelimitedValue(String text, int pos) {
|
||||
String[] tokens = text.split(",");
|
||||
return Integer.parseInt(tokens[pos]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks whether player entered Y or YES to a question.
|
||||
*
|
||||
* @param text player string from kb
|
||||
* @return true of Y or YES was entered, otherwise false
|
||||
*/
|
||||
private boolean yesEntered(String text) {
|
||||
return stringIsAnyValue(text, "Y", "YES");
|
||||
}
|
||||
|
||||
/**
|
||||
* Check whether a string equals one of a variable number of values
|
||||
* Useful to check for Y or YES for example
|
||||
* Comparison is case insensitive.
|
||||
*
|
||||
* @param text source string
|
||||
* @param values a range of values to compare against the source string
|
||||
* @return true if a comparison was found in one of the variable number of strings passed
|
||||
*/
|
||||
private boolean stringIsAnyValue(String text, String... values) {
|
||||
|
||||
return Arrays.stream(values).anyMatch(str -> str.equalsIgnoreCase(text));
|
||||
}
|
||||
|
||||
/*
|
||||
* 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();
|
||||
}
|
||||
|
||||
/**
|
||||
* Generate random number
|
||||
* Used as a single digit of the computer player
|
||||
*
|
||||
* @return random number
|
||||
*/
|
||||
private int randomNumber() {
|
||||
return (int) (Math.random()
|
||||
* (HIGH_NUMBER_RANGE) + 1);
|
||||
}
|
||||
}
|
||||
8
92 Trap/java/TrapGame.java
Normal file
8
92 Trap/java/TrapGame.java
Normal file
@@ -0,0 +1,8 @@
|
||||
public class TrapGame {
|
||||
|
||||
public static void main(String[] args) {
|
||||
|
||||
Trap trap = new Trap();
|
||||
trap.play();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user