From 6ae9fbcd3676ad929d44c89b07d90dd415d83a4b Mon Sep 17 00:00:00 2001 From: Thomas Kwashnak Date: Thu, 6 Jan 2022 14:22:28 -0500 Subject: [PATCH 1/5] Initial Commit Added Instructions, Random mine placement, and the general layout --- 30_Cube/java/src/Cube.java | 80 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 30_Cube/java/src/Cube.java diff --git a/30_Cube/java/src/Cube.java b/30_Cube/java/src/Cube.java new file mode 100644 index 00000000..2e19a691 --- /dev/null +++ b/30_Cube/java/src/Cube.java @@ -0,0 +1,80 @@ +import java.io.PrintStream; +import java.util.Random; + +public class Cube { + + private Location playerLocation; + private Location[] mines; + private PrintStream out; + + + public static void main(String[] args) { + new Cube().play(); + } + + public Cube() { + out = System.out; + } + + private void placeMines() { + mines = new Location[5]; + Random random = new Random(); + for(int i = 0; i < mines.length; i++) { + int x = random.nextInt(1,4); + int y = random.nextInt(1,4); + int z = random.nextInt(1,4); + mines[i] = new Location(x,y,z); + } + } + + public void play() { + + } + + public void printInstructions() { + out.println("THIS IS A GAME IN WHICH YOU WILL BE PLAYING AGAINST THE"); + out.println("RANDOM DECISION OF THE COMPUTER. THE FIELD OF PLAY IS A"); + out.println("CUBE OF SIDE 3. ANY OF THE 27 LOCATIONS CAN BE DESIGNATED"); + out.println("CUBE OF SIDE 3. ANY OF THE 27 LOCATIONS CAN BE DESIGNATED"); + out.println("BY INPUTTING THREE NUMBERS SUCH AS 2,3,1. AT THE START"); + out.println("YOU ARE AUTOMATICALLY AT LOCATION 1,1,1. THE OBJECT OF"); + out.println("THE GAME IS TO GET TO LOCATION 3,3,3. ONE MINOR DETAIL:"); + out.println("THE COMPUTER WILL PICK, AT RANDOM, 5 LOCATIONS AT WHICH"); + out.println("IT WILL PLANT LAND MINES. IF YOU HIT ONE OF THESE LOCATIONS"); + out.println("YOU LOSE. ONE OTHER DETAIL: YOU MAY MOVE ONLY ONE SPACE"); + out.println("IN ONE DIRECTION EACH MOVE. FOR EXAMPLE: FROM 1,1,2 YOU"); + out.println("MAY MOVE TO 2,1,2 OR 1,1,3. YOU MAY NOT CHANGE"); + out.println("TWO OF THE NUMBERS ON THE SAME MOVE. IF YOU MAKE AN ILLEGAL"); + out.println("MOVE, YOU LOSE AND THE COMPUTER TAKES THE MONEY YOU MAY"); + } + + public class Location { + int x,y,z; + + public Location(int x, int y, int z) { + this.x = x; + this.y = y; + this.z = z; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + Location location = (Location) o; + + if (x != location.x) return false; + if (y != location.y) return false; + return z == location.z; + } + + @Override + public int hashCode() { + int result = x; + result = 31 * result + y; + result = 31 * result + z; + return result; + } + } +} From 33dbe7e92d14980b17ddfb3afa56868c95013287 Mon Sep 17 00:00:00 2001 From: Thomas Kwashnak Date: Thu, 6 Jan 2022 15:35:24 -0500 Subject: [PATCH 2/5] Started work on the play cycle --- 30_Cube/java/src/Cube.java | 90 +++++++++++++++++++++++++++++++++++--- 1 file changed, 85 insertions(+), 5 deletions(-) diff --git a/30_Cube/java/src/Cube.java b/30_Cube/java/src/Cube.java index 2e19a691..7fbe39ee 100644 --- a/30_Cube/java/src/Cube.java +++ b/30_Cube/java/src/Cube.java @@ -1,11 +1,17 @@ import java.io.PrintStream; +import java.util.HashSet; import java.util.Random; +import java.util.Scanner; +import java.util.Set; public class Cube { private Location playerLocation; - private Location[] mines; + private Set mines; private PrintStream out; + private Scanner scanner; + + private int money; public static void main(String[] args) { @@ -14,28 +20,84 @@ public class Cube { public Cube() { out = System.out; + scanner = new Scanner(System.in); + money = 500; + mines = new HashSet<>(); } private void placeMines() { - mines = new Location[5]; + mines.clear(); Random random = new Random(); - for(int i = 0; i < mines.length; i++) { + for(int i = 0; i < 5; i++) { int x = random.nextInt(1,4); int y = random.nextInt(1,4); int z = random.nextInt(1,4); - mines[i] = new Location(x,y,z); + mines.add(new Location(x,y,z)); } } public void play() { + out.println("DO YOU WANT TO SEE INSTRUCTIONS? (YES--1,NO--0)"); + if(readParsedBoolean()) { + printInstructions(); + } + do { + placeMines(); + out.println("WANT TO MAKE A WAGER?"); + int wager = 0 ; + if(readParsedBoolean()) { + out.println("HOW MUCH?"); + do { + wager = scanner.nextInt(); + if(wager > money) { + out.println("TRIED TO FOOL ME; BET AGAIN"); + } + } while(wager > money); + } + + + while(playerLocation.x + playerLocation.y + playerLocation.z != 9) { + out.println("\nNEXT MOVE"); + String input = scanner.nextLine(); + + String[] stringValues = input.split(","); + + int x = Integer.parseInt(stringValues[0]); + int y = Integer.parseInt(stringValues[1]); + int z = Integer.parseInt(stringValues[2]); + + Location location = new Location(x,y,z); + + if(x < 1 || x > 3 || y < 1 || y > 3 || z < 1 || z > 3 || isMoveValid(playerLocation,location)) { + out.println("ILLEGAL MOVE, YOU LOSE."); + return; + } + + playerLocation = location; + + if(mines.contains(location)) { + out.println("******BANG******"); + out.println("YOU LOSE!\n\n"); + money -= wager; + } + } + } while(money > 0 && !doAnotherRound()); + } + + private boolean doAnotherRound() { + if(money > 0) { + out.println("DO YOU WANT TO TRY AGAIN?"); + return readParsedBoolean(); + } else { + return false; + } } public void printInstructions() { out.println("THIS IS A GAME IN WHICH YOU WILL BE PLAYING AGAINST THE"); out.println("RANDOM DECISION OF THE COMPUTER. THE FIELD OF PLAY IS A"); out.println("CUBE OF SIDE 3. ANY OF THE 27 LOCATIONS CAN BE DESIGNATED"); - out.println("CUBE OF SIDE 3. ANY OF THE 27 LOCATIONS CAN BE DESIGNATED"); out.println("BY INPUTTING THREE NUMBERS SUCH AS 2,3,1. AT THE START"); out.println("YOU ARE AUTOMATICALLY AT LOCATION 1,1,1. THE OBJECT OF"); out.println("THE GAME IS TO GET TO LOCATION 3,3,3. ONE MINOR DETAIL:"); @@ -46,6 +108,24 @@ public class Cube { out.println("MAY MOVE TO 2,1,2 OR 1,1,3. YOU MAY NOT CHANGE"); out.println("TWO OF THE NUMBERS ON THE SAME MOVE. IF YOU MAKE AN ILLEGAL"); out.println("MOVE, YOU LOSE AND THE COMPUTER TAKES THE MONEY YOU MAY"); + out.println("\n"); + out.println("ALL YES OR NO QUESTIONS WILL BE ANSWERED BY A 1 FOR YES"); + out.println("OR A 0 (ZERO) FOR NO."); + out.println(); + out.println("WHEN STATING THE AMOUNT OF A WAGER, PRINT ONLY THE NUMBER"); + out.println("OF DOLLARS (EXAMPLE: 250) YOU ARE AUTOMATICALLY STARTED WITH"); + out.println("500 DOLLARS IN YOUR ACCOUNT."); + out.println(); + out.println("GOOD LUCK!"); + } + + private boolean readParsedBoolean() { + String in = scanner.nextLine(); + return in.toLowerCase().charAt(0) == 'y' || Boolean.parseBoolean(in); + } + + private boolean isMoveValid(Location from, Location to) { + return Math.abs(from.x - to.x) + Math.abs(from.y - to.y) + Math.abs(from.z - to.z) <= 1; } public class Location { From 28b94b55679a7b1472367b23684707e00f9b6fa6 Mon Sep 17 00:00:00 2001 From: Thomas Kwashnak Date: Thu, 6 Jan 2022 16:04:03 -0500 Subject: [PATCH 3/5] Game now works --- 30_Cube/java/src/Cube.java | 28 +++++++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/30_Cube/java/src/Cube.java b/30_Cube/java/src/Cube.java index 7fbe39ee..1b68a285 100644 --- a/30_Cube/java/src/Cube.java +++ b/30_Cube/java/src/Cube.java @@ -49,27 +49,32 @@ public class Cube { if(readParsedBoolean()) { out.println("HOW MUCH?"); do { - wager = scanner.nextInt(); + wager = Integer.parseInt(scanner.nextLine()); if(wager > money) { out.println("TRIED TO FOOL ME; BET AGAIN"); } } while(wager > money); } - + playerLocation = new Location(1,1,1); while(playerLocation.x + playerLocation.y + playerLocation.z != 9) { out.println("\nNEXT MOVE"); String input = scanner.nextLine(); String[] stringValues = input.split(","); + if(stringValues.length < 3) { + out.println("ILLEGAL MOVE, YOU LOSE."); + return; + } + int x = Integer.parseInt(stringValues[0]); int y = Integer.parseInt(stringValues[1]); int z = Integer.parseInt(stringValues[2]); Location location = new Location(x,y,z); - if(x < 1 || x > 3 || y < 1 || y > 3 || z < 1 || z > 3 || isMoveValid(playerLocation,location)) { + if(x < 1 || x > 3 || y < 1 || y > 3 || z < 1 || z > 3 || !isMoveValid(playerLocation,location)) { out.println("ILLEGAL MOVE, YOU LOSE."); return; } @@ -80,9 +85,18 @@ public class Cube { out.println("******BANG******"); out.println("YOU LOSE!\n\n"); money -= wager; + break; } } - } while(money > 0 && !doAnotherRound()); + + if(wager > 0) { + out.printf("YOU NOW HAVE %d DOLLARS\n",money); + } + + } while(money > 0 && doAnotherRound()); + + out.println("TOUGH LUCK!"); + out.println("\nGOODBYE."); } private boolean doAnotherRound() { @@ -121,7 +135,11 @@ public class Cube { private boolean readParsedBoolean() { String in = scanner.nextLine(); - return in.toLowerCase().charAt(0) == 'y' || Boolean.parseBoolean(in); + try { + return in.toLowerCase().charAt(0) == 'y' || Boolean.parseBoolean(in) || Integer.parseInt(in) == 1; + } catch(NumberFormatException exception) { + return false; + } } private boolean isMoveValid(Location from, Location to) { From fe6cb06d6f660916fe08a8d02d58f760685ac438 Mon Sep 17 00:00:00 2001 From: Thomas Kwashnak Date: Thu, 6 Jan 2022 16:11:12 -0500 Subject: [PATCH 4/5] Added Comments --- 30_Cube/java/src/Cube.java | 46 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 44 insertions(+), 2 deletions(-) diff --git a/30_Cube/java/src/Cube.java b/30_Cube/java/src/Cube.java index 1b68a285..1237a49d 100644 --- a/30_Cube/java/src/Cube.java +++ b/30_Cube/java/src/Cube.java @@ -4,16 +4,33 @@ import java.util.Random; import java.util.Scanner; import java.util.Set; +/** + * Game of Cube + *

+ * Based on game of Cube at: + * https://github.com/coding-horror/basic-computer-games/blob/main/30_Cube/cube.bas + * + * + */ public class Cube { + //Current player location private Location playerLocation; + + //Current list of mines private Set mines; + + //System input / output objects private PrintStream out; private Scanner scanner; + //Player's current money private int money; - + /** + * Entry point, creates a new Cube object and calls the play method + * @param args Java execution arguments, not used in application + */ public static void main(String[] args) { new Cube().play(); } @@ -22,9 +39,12 @@ public class Cube { out = System.out; scanner = new Scanner(System.in); money = 500; - mines = new HashSet<>(); + mines = new HashSet<>(5); } + /** + * Clears mines and places 5 new mines on the board + */ private void placeMines() { mines.clear(); Random random = new Random(); @@ -36,6 +56,9 @@ public class Cube { } } + /** + * Runs the entire game until the player runs out of money or chooses to stop + */ public void play() { out.println("DO YOU WANT TO SEE INSTRUCTIONS? (YES--1,NO--0)"); if(readParsedBoolean()) { @@ -99,6 +122,11 @@ public class Cube { out.println("\nGOODBYE."); } + /** + * Queries the user whether they want to play another round + * @return True if the player decides to play another round, + * False if the player would not like to play again + */ private boolean doAnotherRound() { if(money > 0) { out.println("DO YOU WANT TO TRY AGAIN?"); @@ -108,6 +136,9 @@ public class Cube { } } + /** + * Prints the instructions to the game, copied from the original code. + */ public void printInstructions() { out.println("THIS IS A GAME IN WHICH YOU WILL BE PLAYING AGAINST THE"); out.println("RANDOM DECISION OF THE COMPUTER. THE FIELD OF PLAY IS A"); @@ -133,6 +164,11 @@ public class Cube { out.println("GOOD LUCK!"); } + /** + * Waits for the user to input a boolean value. This could either be (true,false), (1,0), (y,n), (yes,no), etc. + * By default, it will return false + * @return Parsed boolean value of the user input + */ private boolean readParsedBoolean() { String in = scanner.nextLine(); try { @@ -155,6 +191,9 @@ public class Cube { this.z = z; } + /* + For use in HashSet and checking if two Locations are the same + */ @Override public boolean equals(Object o) { if (this == o) return true; @@ -167,6 +206,9 @@ public class Cube { return z == location.z; } + /* + For use in the HashSet to accordingly index the set + */ @Override public int hashCode() { int result = x; From d2495a55aad12e1cad51b0497bf2eac74c5ab9c0 Mon Sep 17 00:00:00 2001 From: Thomas Kwashnak Date: Thu, 6 Jan 2022 16:12:04 -0500 Subject: [PATCH 5/5] Added Comments --- 30_Cube/java/src/Cube.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/30_Cube/java/src/Cube.java b/30_Cube/java/src/Cube.java index 1237a49d..0100682a 100644 --- a/30_Cube/java/src/Cube.java +++ b/30_Cube/java/src/Cube.java @@ -178,6 +178,12 @@ public class Cube { } } + /** + * Checks if a move is valid + * @param from The point that the player is at + * @param to The point that the player wishes to move to + * @return True if the player is only moving, at most, 1 location in any direction, False if the move is invalid + */ private boolean isMoveValid(Location from, Location to) { return Math.abs(from.x - to.x) + Math.abs(from.y - to.y) + Math.abs(from.z - to.z) <= 1; }