diff --git a/13 Bounce/java/Bounce.java b/13 Bounce/java/Bounce.java new file mode 100644 index 00000000..6d39daa2 --- /dev/null +++ b/13 Bounce/java/Bounce.java @@ -0,0 +1,169 @@ +import java.util.Scanner; +import java.lang.Math; + +/** + * Game of Bounce + *

+ * Based on the BASIC game of Bounce here + * https://github.com/coding-horror/basic-computer-games/blob/main/13%20Bounce/bounce.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 Bounce { + + private final Scanner scan; // For user input + + public Bounce() { + + scan = new Scanner(System.in); + + } // End of constructor Bounce + + public void play() { + + showIntro(); + startGame(); + + } // End of method play + + private void showIntro() { + + System.out.println(" ".repeat(32) + "BOUNCE"); + System.out.println(" ".repeat(14) + "CREATIVE COMPUTING MORRISTOWN, NEW JERSEY"); + System.out.println("\n\n"); + + } // End of method showIntro + + private void startGame() { + + double coefficient = 0; + double height = 0; + double timeIncrement = 0; + double timeIndex = 0; + double timeTotal = 0; + double velocity = 0; + + double[] timeData = new double[21]; + + int heightInt = 0; + int index = 0; + int maxData = 0; + + String lineContent = ""; + + System.out.println("THIS SIMULATION LETS YOU SPECIFY THE INITIAL VELOCITY"); + System.out.println("OF A BALL THROWN STRAIGHT UP, AND THE COEFFICIENT OF"); + System.out.println("ELASTICITY OF THE BALL. PLEASE USE A DECIMAL FRACTION"); + System.out.println("COEFFICIENCY (LESS THAN 1)."); + System.out.println(""); + System.out.println("YOU ALSO SPECIFY THE TIME INCREMENT TO BE USED IN"); + System.out.println("'STROBING' THE BALL'S FLIGHT (TRY .1 INITIALLY)."); + System.out.println(""); + + // Begin outer while loop + while (true) { + + System.out.print("TIME INCREMENT (SEC)? "); + timeIncrement = Double.parseDouble(scan.nextLine()); + System.out.println(""); + + System.out.print("VELOCITY (FPS)? "); + velocity = Double.parseDouble(scan.nextLine()); + System.out.println(""); + + System.out.print("COEFFICIENT? "); + coefficient = Double.parseDouble(scan.nextLine()); + System.out.println(""); + + System.out.println("FEET"); + System.out.println(""); + + maxData = (int)(70 / (velocity / (16 * timeIncrement))); + + for (index = 1; index <= maxData; index++) { + timeData[index] = velocity * Math.pow(coefficient, index - 1) / 16; + } + + // Begin loop through all rows of y-axis data + for (heightInt = (int)(-16 * Math.pow(velocity / 32, 2) + Math.pow(velocity, 2) / 32 + 0.5) * 10; + heightInt >= 0; heightInt -= 5) { + + height = heightInt / 10.0; + + lineContent = ""; + + if ((int)(Math.floor(height)) == height) { + + lineContent += " " + (int)(height) + " "; + } + + timeTotal = 0; + + for (index = 1; index <= maxData; index++) { + + for (timeIndex = 0; timeIndex <= timeData[index]; timeIndex += timeIncrement) { + + timeTotal += timeIncrement; + + if (Math.abs(height - (0.5 * (-32) * Math.pow(timeIndex, 2) + velocity + * Math.pow(coefficient, index - 1) * timeIndex)) <= 0.25) { + + while (lineContent.length() < (timeTotal / timeIncrement) - 1) { + lineContent += " "; + } + lineContent += "0"; + } + } + + timeIndex = timeData[index + 1] / 2; + + if (-16 * Math.pow(timeIndex, 2) + velocity * Math.pow(coefficient, index - 1) * timeIndex < height) { + + break; + } + } + + System.out.println(lineContent); + + } // End loop through all rows of y-axis data + + lineContent = ""; + + // Show the x-axis + for (index = 1; index <= (int)(timeTotal + 1) / timeIncrement + 1; index++) { + + lineContent += "."; + } + + System.out.println(lineContent); + + lineContent = " 0"; + + for (index = 1; index <= (int)(timeTotal + 0.9995); index++) { + + while (lineContent.length() < (int)(index / timeIncrement)) { + lineContent += " "; + } + lineContent += index; + } + + System.out.println(lineContent); + + System.out.println(" ".repeat((int)((timeTotal + 1) / (2 * timeIncrement) - 3)) + "SECONDS"); + + } // End outer while loop + + } // End of method startGame + + public static void main(String[] args) { + + Bounce game = new Bounce(); + game.play(); + + } // End of method main + +} // End of class Bounce