From f2e7381878c198b467093eef1deac7c3bc3b6e88 Mon Sep 17 00:00:00 2001 From: jason Date: Tue, 4 Jan 2022 20:44:47 -0800 Subject: [PATCH 01/17] first very ugly port. --- 81_Splat/java/src/Splat.java | 277 +++++++++++++++++++++++++++++++++++ 1 file changed, 277 insertions(+) create mode 100644 81_Splat/java/src/Splat.java diff --git a/81_Splat/java/src/Splat.java b/81_Splat/java/src/Splat.java new file mode 100644 index 00000000..0930dcc2 --- /dev/null +++ b/81_Splat/java/src/Splat.java @@ -0,0 +1,277 @@ +import java.util.Arrays; +import java.util.Random; +import java.util.Scanner; + +public class Splat { + private final Random random = new Random(); + private final Scanner scanner = new Scanner(System.in); + + public static void main(String[] args) { + new Splat().run(); + } + + public void run() { + System.out.printf("%33s%s\n", " ", "SPLAT"); + System.out.printf("%15s%s\n", " ", "CREATIVE COMPUTING MORRISTOWN, NEW JERSEY"); + System.out.print("\n\n\n"); + System.out.println("WELCOME TO 'SPLAT' -- THE GAME THAT SIMULATES A PARACHUTE"); + System.out.println("JUMP. TRY TO OPEN YOUR CHUTE AT THE LAST POSSIBLE"); + System.out.println("MOMENT WITHOUT GOING SPLAT."); + + float[] Arr = new float[42]; + Arrays.fill(Arr, 0.0f); + int K = 0; + int K1 = 0; + while (true) { + + System.out.print("\n\n"); + float V = 0.0f; + float A = 0.0f; + int N = 0; + int M = 0; + int D1 = (int) (9001.0f * random.nextFloat() + 1000); + D1 = 2937; //debug fixme + + System.out.print("SELECT YOUR OWN TERMINAL VELOCITY (YES OR NO) "); + float V1; + while (true) { + String A1 = scanner.next(); + if (A1.equals("NO")) { + V1 = (int) (1000 * random.nextFloat()); + System.out.printf("OK. TERMINAL VELOCITY = %d MI/HR\n", (int) V1); + break; + } + if (!A1.equals("YES")) { + System.out.print("YES OR NO "); + continue; + } + System.out.print("WHAT TERMINAL VELOCITY (MI/HR) "); + V1 = scanner.nextInt(); + break; + } + V1 = V1 * (5280.0f / 3600.0f); + V = V1 + ((V1 * random.nextFloat()) / 20.0f) - ((V1 * random.nextFloat()) / 20.0f); + System.out.print("WANT TO SELECT ACCELERATION DUE TO GRAVITY (YES OR NO) "); + float A2; + while (true) { + String B1 = scanner.next(); + if (B1.equals("NO")) { + switch (random.nextInt(10)) { + case 0: + System.out.println("FINE. YOU'RE ON MERCURY. ACCELERATION=12.2 FT/SEC/SEC."); + A2 = 12.2f; + break; + case 1: + System.out.println("ALL RIGHT. YOU'RE ON VENUS. ACCELERATION=28.3 FT/SEC/SEC."); + A2 = 28.3f; + break; + case 2: + System.out.println("THEN YOU'RE ON EARTH. ACCELERATION=32.16 FT/SEC/SEC."); + A2 = 32.16f; + break; + case 3: + System.out.println("FINE. YOU'RE ON THE MOON. ACCELERATION=5.15 FT/SEC/SEC."); + A2 = 5.15f; + break; + case 4: + System.out.println("ALL RIGHT. YOU'RE ON MARS. ACCELERATION=12.5 FT/SEC/SEC."); + A2 = 12.5f; + break; + case 5: + System.out.println("THEN YOU'RE ON JUPITER. ACCELERATION=85.2 FT/SEC/SEC."); + A2 = 85.2f; + break; + case 6: + System.out.println("FINE. YOU'RE ON SATURN. ACCELERATION=37.6 FT/SEC/SEC."); + A2 = 37.6f; + break; + case 7: + System.out.println("ALL RIGHT. YOU'RE ON URANUS. ACCELERATION=33.8 FT/SEC/SEC."); + A2 = 33.8f; + break; + case 8: + System.out.println("THEN YOU'RE ON NEPTUNE. ACCELERATION=39.6 FT/SEC/SEC."); + A2 = 39.6f; + break; + case 9: + System.out.println("FINE. YOU'RE ON THE SUN. ACCELERATION=896 FT/SEC/SEC."); + A2 = 896.0f; + break; + default: + throw new RuntimeException("Impossible. Will fix stupid switch statement later."); + } + break; + } + if (!B1.equals("YES")) { + System.out.print("YES OR NO "); + continue; + } + System.out.print("WHAT ACCELERATION (FT/SEC/SEC) "); + A2 = scanner.nextFloat(); + break; + } + A = A2 + ((A2 * random.nextFloat()) / 20.0f) - ((A2 * random.nextFloat()) / 20.0f); + System.out.println(); + System.out.printf(" ALTITUDE = %d FT\n", D1); + System.out.printf(" TERM. VELOCITY = %.2f FT/SEC +/-5%%\n", V1); + System.out.printf(" ACCELERATION = %.2f FT/SEC/SEC +/-5%%\n", A2); + System.out.println("SET THE TIMER FOR YOUR FREEFALL."); + System.out.print("HOW MANY SECONDS "); + float T = scanner.nextFloat(); + System.out.println("HERE WE GO.\n"); + System.out.println("TIME (SEC) DIST TO FALL (FT)"); + System.out.println("========== ================="); + boolean splat = false; + boolean terminalReached = false; + float D = 0.0f; + for (float i = 0.0f; !splat && (i < T); i += T / 8) { + if (i > (V / A)) { + terminalReached = true; + System.out.printf("TERMINAL VELOCITY REACHED AT T PLUS %f SECONDS.\n", (V / A)); + for (i = i; i < T; i += T / 8) { + D = D1 - ((V * V / (2 * A)) + (V * (i - (V / A)))); +// System.out.printf(" ......................................tv %f\n", D); + if (D <= 0) { + splat = true; + break; + } + System.out.printf("%10.2f %f\n", i, D); + } + break; + } + D = D1 - ((A / 2) * i * i); +// System.out.printf(" ......................................debug %f\n", D); + if (D <= 0) { + splat = true; + break; + } + System.out.printf("%10.2f %f\n", i, D); + } + + if (!splat) { + + System.out.println("CHUTE OPEN"); + int J = 0; + for (J = 0; J < 42; J++) { + if (Arr[J] == 0) { + Arr[J] = D; + break; + } + K = K + 1; + if (D > Arr[J]) { + continue; + } + K1 = K1 + 1; + } + + if (J > 2) { + if (K - K1 <= 0.1 * K) { + System.out.printf("WOW! THAT'S SOME JUMPING. OF THE %d SUCCESSFUL JUMPS\n", K); + System.out.printf("BEFORE YOURS, ONLY %d OPENED THEIR CHUTES LOWER THAN\n", K - K1); + System.out.println("YOU DID."); + } else if (K - K1 <= 0.25 * K) { + System.out.printf("PRETTY GOOD! %d SUCCESSFUL JUMPS PRECEDED YOURS AND ONLY\n", K); + System.out.printf("%d OF THEM GOT LOWER THAN YOU DID BEFORE THEIR CHUTES\n", K - K1); + System.out.println("OPENED."); + } else if (K - K1 <= 0.5 * K) { + System.out.printf("NOT BAD. THERE HAVE BEEN %d SUCCESSFUL JUMPS BEFORE YOURS.\n", K); + System.out.printf("YOU WERE BEATEN OUT BY %d OF THEM.\n", K - K1); + } else if (K - K1 <= 0.75 * K) { + System.out.printf("CONSERVATIVE, AREN'T YOU? YOU RANKED ONLY %d IN THE\n", K - K1); + System.out.printf("%d SUCCESSFUL JUMPS BEFORE YOURS.", K); + } else if (K - K1 <= -0.9 * K) { + System.out.println("HUMPH! DON'T YOU HAVE ANY SPORTING BLOOD? THERE WERE"); + System.out.printf("%d SUCCESSFUL JUMPS BEFORE YOURS AND YOU CAME IN %d JUMPS\n", K, K1); + System.out.println("BETTER THAN THE WORST. SHAPE UP!!!\n"); + } else { + System.out.printf("HEY! YOU PULLED THE RIP CORD MUCH TOO SOON. %f SUCCESSFUL\n", K); + System.out.printf("JUMPS BEFORE YOURS AND YOU CAME IN NUMBER %d! GET WITH IT!\n", K - K1); + } + } else { + System.out.println("AMAZING!!! NOT BAD FOR YOUR "); + switch (J) { + case 0: + System.out.print("1ST "); + break; + case 1: + System.out.print("2ND "); + break; + case 2: + System.out.print("3RD "); + break; + } + System.out.println("SUCCESSFUL JUMP!!!"); + } + + + } else { + if (terminalReached) { + System.out.printf("%.2f SPLAT\n", (V / A) + ((D1 - (V * V / (2 * A))) / V)); + } else { + System.out.printf("%.2f SPLAT\n", Math.sqrt(2 * D1 / A)); + + } + switch (random.nextInt(10)) { + case 0: + System.out.println("REQUIESCAT IN PACE."); + break; + case 1: + System.out.println("MAY THE ANGEL OF HEAVEN LEAD YOU INTO PARADISE."); + break; + case 2: + System.out.println("REST IN PEACE."); + break; + case 3: + System.out.println("SON-OF-A-GUN."); + break; + case 4: + System.out.println("#$%&&%!$"); + break; + case 5: + System.out.println("A KICK IN THE PANTS IS A BOOST IF YOU'RE HEADED RIGHT."); + break; + case 6: + System.out.println("HMMM. SHOULD HAVE PICKED A SHORTER TIME."); + break; + case 7: + System.out.println("MUTTER. MUTTER. MUTTER."); + break; + case 8: + System.out.println("PUSHING UP DAISIES."); + break; + default: + System.out.println("EASY COME, EASY GO."); + + } + } + boolean chosen = false; + while (!chosen) { + System.out.print("DO YOU WANT TO PLAY AGAIN "); + String Z = scanner.next(); + if (Z.equals("YES")) { + break; + } + if (Z.equals("NO")) { + System.out.print("PLEASE "); + while (true) { + Z = scanner.next(); + if (Z.equals("YES")) { + chosen = true; + break; + } + if (Z.equals("NO")) { + System.out.println("SSSSSSSSSS."); + return; + } + System.out.print("YES OR NO "); + } + continue; + } else { + System.out.print("YES OR NO "); + } + } + + } + + } +} \ No newline at end of file From b899d6d5c508bfe9a746c64b9dbaad2496ac33dd Mon Sep 17 00:00:00 2001 From: jason Date: Tue, 4 Jan 2022 21:14:36 -0800 Subject: [PATCH 02/17] factor out planet enum --- 81_Splat/java/src/Splat.java | 86 +++++++++++++++++------------------- 1 file changed, 41 insertions(+), 45 deletions(-) diff --git a/81_Splat/java/src/Splat.java b/81_Splat/java/src/Splat.java index 0930dcc2..c5c94a5d 100644 --- a/81_Splat/java/src/Splat.java +++ b/81_Splat/java/src/Splat.java @@ -30,7 +30,6 @@ public class Splat { int N = 0; int M = 0; int D1 = (int) (9001.0f * random.nextFloat() + 1000); - D1 = 2937; //debug fixme System.out.print("SELECT YOUR OWN TERMINAL VELOCITY (YES OR NO) "); float V1; @@ -56,50 +55,7 @@ public class Splat { while (true) { String B1 = scanner.next(); if (B1.equals("NO")) { - switch (random.nextInt(10)) { - case 0: - System.out.println("FINE. YOU'RE ON MERCURY. ACCELERATION=12.2 FT/SEC/SEC."); - A2 = 12.2f; - break; - case 1: - System.out.println("ALL RIGHT. YOU'RE ON VENUS. ACCELERATION=28.3 FT/SEC/SEC."); - A2 = 28.3f; - break; - case 2: - System.out.println("THEN YOU'RE ON EARTH. ACCELERATION=32.16 FT/SEC/SEC."); - A2 = 32.16f; - break; - case 3: - System.out.println("FINE. YOU'RE ON THE MOON. ACCELERATION=5.15 FT/SEC/SEC."); - A2 = 5.15f; - break; - case 4: - System.out.println("ALL RIGHT. YOU'RE ON MARS. ACCELERATION=12.5 FT/SEC/SEC."); - A2 = 12.5f; - break; - case 5: - System.out.println("THEN YOU'RE ON JUPITER. ACCELERATION=85.2 FT/SEC/SEC."); - A2 = 85.2f; - break; - case 6: - System.out.println("FINE. YOU'RE ON SATURN. ACCELERATION=37.6 FT/SEC/SEC."); - A2 = 37.6f; - break; - case 7: - System.out.println("ALL RIGHT. YOU'RE ON URANUS. ACCELERATION=33.8 FT/SEC/SEC."); - A2 = 33.8f; - break; - case 8: - System.out.println("THEN YOU'RE ON NEPTUNE. ACCELERATION=39.6 FT/SEC/SEC."); - A2 = 39.6f; - break; - case 9: - System.out.println("FINE. YOU'RE ON THE SUN. ACCELERATION=896 FT/SEC/SEC."); - A2 = 896.0f; - break; - default: - throw new RuntimeException("Impossible. Will fix stupid switch statement later."); - } + A2 = chooseRandomAcceleration(); break; } if (!B1.equals("YES")) { @@ -274,4 +230,44 @@ public class Splat { } } + + private float chooseRandomAcceleration() { + Planet planet = Planet.pickRandom(); + System.out.printf("%s. ACCELERATION=%.2f FT/SEC/SEC.\n", planet.getMessage(), planet.getAcceleration()); + return planet.getAcceleration(); + } + + enum Planet { + MERCURY("FINE. YOU'RE ON MERCURY", 12.2f), + VENUS("ALL RIGHT. YOU'RE ON VENUS", 28.3f), + EARTH("THEN YOU'RE ON EARTH", 32.16f), + MOON("FINE. YOU'RE ON THE MOON", 5.15f), + MARS("ALL RIGHT. YOU'RE ON MARS", 12.5f), + JUPITER("THEN YOU'RE ON JUPITER", 85.2f), + SATURN("FINE. YOU'RE ON SATURN", 37.6f), + URANUS("ALL RIGHT. YOU'RE ON URANUS", 33.8f), + NEPTUNE("THEN YOU'RE ON NEPTUNE", 39.6f), + SUN("FINE. YOU'RE ON THE SUN", 896.0f); + + static final Random random = new Random(); + private final String message; + private final float acceleration; + + Planet(String message, float acceleration) { + this.message = message; + this.acceleration = acceleration; + } + + static Planet pickRandom(){ + return values()[random.nextInt(Planet.values().length)]; + } + + public String getMessage() { + return message; + } + + public float getAcceleration() { + return acceleration; + } + } } \ No newline at end of file From 22213547fc81233c2645c7014e60a2537a9a50ef Mon Sep 17 00:00:00 2001 From: jason Date: Tue, 4 Jan 2022 21:22:11 -0800 Subject: [PATCH 03/17] factor out askYesNo --- 81_Splat/java/src/Splat.java | 33 ++++++++++++++++++--------------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/81_Splat/java/src/Splat.java b/81_Splat/java/src/Splat.java index c5c94a5d..3f44af2f 100644 --- a/81_Splat/java/src/Splat.java +++ b/81_Splat/java/src/Splat.java @@ -27,27 +27,18 @@ public class Splat { System.out.print("\n\n"); float V = 0.0f; float A = 0.0f; - int N = 0; - int M = 0; int D1 = (int) (9001.0f * random.nextFloat() + 1000); - System.out.print("SELECT YOUR OWN TERMINAL VELOCITY (YES OR NO) "); float V1; - while (true) { - String A1 = scanner.next(); - if (A1.equals("NO")) { - V1 = (int) (1000 * random.nextFloat()); - System.out.printf("OK. TERMINAL VELOCITY = %d MI/HR\n", (int) V1); - break; - } - if (!A1.equals("YES")) { - System.out.print("YES OR NO "); - continue; - } + if(askYesNo("SELECT YOUR OWN TERMINAL VELOCITY")){ System.out.print("WHAT TERMINAL VELOCITY (MI/HR) "); V1 = scanner.nextInt(); - break; } + else { + V1 = (int) (1000 * random.nextFloat()); + System.out.printf("OK. TERMINAL VELOCITY = %d MI/HR\n", (int) V1); + } + V1 = V1 * (5280.0f / 3600.0f); V = V1 + ((V1 * random.nextFloat()) / 20.0f) - ((V1 * random.nextFloat()) / 20.0f); System.out.print("WANT TO SELECT ACCELERATION DUE TO GRAVITY (YES OR NO) "); @@ -231,6 +222,18 @@ public class Splat { } + private boolean askYesNo(String prompt){ + System.out.printf("%s (YES OR NO) ", prompt); + while (true) { + String answer = scanner.next(); + switch(answer){ + case "YES": return true; + case "NO": return false; + default: System.out.print("YES OR NO "); + } + } + } + private float chooseRandomAcceleration() { Planet planet = Planet.pickRandom(); System.out.printf("%s. ACCELERATION=%.2f FT/SEC/SEC.\n", planet.getMessage(), planet.getAcceleration()); From 9fba41771c254890d30b14cf343d4f6babc4b645 Mon Sep 17 00:00:00 2001 From: jason Date: Tue, 4 Jan 2022 21:24:01 -0800 Subject: [PATCH 04/17] plug in yesno prompt for acceleration --- 81_Splat/java/src/Splat.java | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/81_Splat/java/src/Splat.java b/81_Splat/java/src/Splat.java index 3f44af2f..ba1496ca 100644 --- a/81_Splat/java/src/Splat.java +++ b/81_Splat/java/src/Splat.java @@ -41,22 +41,16 @@ public class Splat { V1 = V1 * (5280.0f / 3600.0f); V = V1 + ((V1 * random.nextFloat()) / 20.0f) - ((V1 * random.nextFloat()) / 20.0f); - System.out.print("WANT TO SELECT ACCELERATION DUE TO GRAVITY (YES OR NO) "); + float A2; - while (true) { - String B1 = scanner.next(); - if (B1.equals("NO")) { - A2 = chooseRandomAcceleration(); - break; - } - if (!B1.equals("YES")) { - System.out.print("YES OR NO "); - continue; - } + if(askYesNo("WANT TO SELECT ACCELERATION DUE TO GRAVITY")){ System.out.print("WHAT ACCELERATION (FT/SEC/SEC) "); A2 = scanner.nextFloat(); - break; } + else { + A2 = chooseRandomAcceleration(); + } + A = A2 + ((A2 * random.nextFloat()) / 20.0f) - ((A2 * random.nextFloat()) / 20.0f); System.out.println(); System.out.printf(" ALTITUDE = %d FT\n", D1); From c3a1b621b917aaa71966c18cbe64004924d36dfd Mon Sep 17 00:00:00 2001 From: jason Date: Tue, 4 Jan 2022 21:32:56 -0800 Subject: [PATCH 05/17] factor out intro and prompt messages --- 81_Splat/java/src/Splat.java | 69 ++++++++++++++++++++---------------- 1 file changed, 38 insertions(+), 31 deletions(-) diff --git a/81_Splat/java/src/Splat.java b/81_Splat/java/src/Splat.java index ba1496ca..e4614fa8 100644 --- a/81_Splat/java/src/Splat.java +++ b/81_Splat/java/src/Splat.java @@ -11,12 +11,7 @@ public class Splat { } public void run() { - System.out.printf("%33s%s\n", " ", "SPLAT"); - System.out.printf("%15s%s\n", " ", "CREATIVE COMPUTING MORRISTOWN, NEW JERSEY"); - System.out.print("\n\n\n"); - System.out.println("WELCOME TO 'SPLAT' -- THE GAME THAT SIMULATES A PARACHUTE"); - System.out.println("JUMP. TRY TO OPEN YOUR CHUTE AT THE LAST POSSIBLE"); - System.out.println("MOMENT WITHOUT GOING SPLAT."); + showIntroduction(); float[] Arr = new float[42]; Arrays.fill(Arr, 0.0f); @@ -25,37 +20,18 @@ public class Splat { while (true) { System.out.print("\n\n"); - float V = 0.0f; - float A = 0.0f; int D1 = (int) (9001.0f * random.nextFloat() + 1000); - float V1; - if(askYesNo("SELECT YOUR OWN TERMINAL VELOCITY")){ - System.out.print("WHAT TERMINAL VELOCITY (MI/HR) "); - V1 = scanner.nextInt(); - } - else { - V1 = (int) (1000 * random.nextFloat()); - System.out.printf("OK. TERMINAL VELOCITY = %d MI/HR\n", (int) V1); - } + float terminalVelocity = promptTerminalVelocity(); + float V = terminalVelocity + ((terminalVelocity * random.nextFloat()) / 20.0f) - ((terminalVelocity * random.nextFloat()) / 20.0f); - V1 = V1 * (5280.0f / 3600.0f); - V = V1 + ((V1 * random.nextFloat()) / 20.0f) - ((V1 * random.nextFloat()) / 20.0f); + float gravitationalAcceleration = promptGravitationalAcceleration(); + float A = gravitationalAcceleration + ((gravitationalAcceleration * random.nextFloat()) / 20.0f) - ((gravitationalAcceleration * random.nextFloat()) / 20.0f); - float A2; - if(askYesNo("WANT TO SELECT ACCELERATION DUE TO GRAVITY")){ - System.out.print("WHAT ACCELERATION (FT/SEC/SEC) "); - A2 = scanner.nextFloat(); - } - else { - A2 = chooseRandomAcceleration(); - } - - A = A2 + ((A2 * random.nextFloat()) / 20.0f) - ((A2 * random.nextFloat()) / 20.0f); System.out.println(); System.out.printf(" ALTITUDE = %d FT\n", D1); - System.out.printf(" TERM. VELOCITY = %.2f FT/SEC +/-5%%\n", V1); - System.out.printf(" ACCELERATION = %.2f FT/SEC/SEC +/-5%%\n", A2); + System.out.printf(" TERM. VELOCITY = %.2f FT/SEC +/-5%%\n", terminalVelocity); + System.out.printf(" ACCELERATION = %.2f FT/SEC/SEC +/-5%%\n", gravitationalAcceleration); System.out.println("SET THE TIMER FOR YOUR FREEFALL."); System.out.print("HOW MANY SECONDS "); float T = scanner.nextFloat(); @@ -216,6 +192,37 @@ public class Splat { } + private void showIntroduction() { + System.out.printf("%33s%s\n", " ", "SPLAT"); + System.out.printf("%15s%s\n", " ", "CREATIVE COMPUTING MORRISTOWN, NEW JERSEY"); + System.out.print("\n\n\n"); + System.out.println("WELCOME TO 'SPLAT' -- THE GAME THAT SIMULATES A PARACHUTE"); + System.out.println("JUMP. TRY TO OPEN YOUR CHUTE AT THE LAST POSSIBLE"); + System.out.println("MOMENT WITHOUT GOING SPLAT."); + } + + private float promptTerminalVelocity() { + if(askYesNo("SELECT YOUR OWN TERMINAL VELOCITY")){ + System.out.print("WHAT TERMINAL VELOCITY (MI/HR) "); + return mphToFeetPerSec(scanner.nextFloat()); + } + float terminalVelocity = (int) (1000 * random.nextFloat()); + System.out.printf("OK. TERMINAL VELOCITY = %.2f MI/HR\n", terminalVelocity); + return mphToFeetPerSec(terminalVelocity); + } + + private float promptGravitationalAcceleration() { + if(askYesNo("WANT TO SELECT ACCELERATION DUE TO GRAVITY")){ + System.out.print("WHAT ACCELERATION (FT/SEC/SEC) "); + return scanner.nextFloat(); + } + return chooseRandomAcceleration(); + } + + private float mphToFeetPerSec(float speed){ + return speed * (5280.0f / 3600.0f); + } + private boolean askYesNo(String prompt){ System.out.printf("%s (YES OR NO) ", prompt); while (true) { From eba6c07fd03cd2f08ec0b711a3289397ba3b4cf9 Mon Sep 17 00:00:00 2001 From: jason Date: Tue, 4 Jan 2022 22:05:24 -0800 Subject: [PATCH 06/17] factor out initial jump conditions --- 81_Splat/java/src/Splat.java | 94 ++++++++++++++++++++++++++++-------- 1 file changed, 74 insertions(+), 20 deletions(-) diff --git a/81_Splat/java/src/Splat.java b/81_Splat/java/src/Splat.java index e4614fa8..67e278f8 100644 --- a/81_Splat/java/src/Splat.java +++ b/81_Splat/java/src/Splat.java @@ -3,7 +3,7 @@ import java.util.Random; import java.util.Scanner; public class Splat { - private final Random random = new Random(); + private static final Random random = new Random(); private final Scanner scanner = new Scanner(System.in); public static void main(String[] args) { @@ -19,19 +19,15 @@ public class Splat { int K1 = 0; while (true) { - System.out.print("\n\n"); - int D1 = (int) (9001.0f * random.nextFloat() + 1000); - - float terminalVelocity = promptTerminalVelocity(); - float V = terminalVelocity + ((terminalVelocity * random.nextFloat()) / 20.0f) - ((terminalVelocity * random.nextFloat()) / 20.0f); - - float gravitationalAcceleration = promptGravitationalAcceleration(); - float A = gravitationalAcceleration + ((gravitationalAcceleration * random.nextFloat()) / 20.0f) - ((gravitationalAcceleration * random.nextFloat()) / 20.0f); + InitialJumpConditions jump = buildInitialConditions(); + final float V = jump.getTerminalVelocity(); + final float A = jump.getGravitationalAcceleration(); System.out.println(); - System.out.printf(" ALTITUDE = %d FT\n", D1); - System.out.printf(" TERM. VELOCITY = %.2f FT/SEC +/-5%%\n", terminalVelocity); - System.out.printf(" ACCELERATION = %.2f FT/SEC/SEC +/-5%%\n", gravitationalAcceleration); + System.out.printf(" ALTITUDE = %d FT\n", jump.getAltitude()); + System.out.printf(" TERM. VELOCITY = %.2f FT/SEC +/-5%%\n", jump.getOriginalTerminalVelocity()); + System.out.printf(" ACCELERATION = %.2f FT/SEC/SEC +/-5%%\n", jump.getOriginalGravitationalAcceleration()); + System.out.println("SET THE TIMER FOR YOUR FREEFALL."); System.out.print("HOW MANY SECONDS "); float T = scanner.nextFloat(); @@ -42,12 +38,11 @@ public class Splat { boolean terminalReached = false; float D = 0.0f; for (float i = 0.0f; !splat && (i < T); i += T / 8) { - if (i > (V / A)) { + if (i > jump.getTimeOfTerminalAccelerationReached()) { terminalReached = true; - System.out.printf("TERMINAL VELOCITY REACHED AT T PLUS %f SECONDS.\n", (V / A)); + System.out.printf("TERMINAL VELOCITY REACHED AT T PLUS %f SECONDS.\n", jump.getTimeOfTerminalAccelerationReached()); for (i = i; i < T; i += T / 8) { - D = D1 - ((V * V / (2 * A)) + (V * (i - (V / A)))); -// System.out.printf(" ......................................tv %f\n", D); + D = jump.getAltitude() - ((V * V / (2 * A)) + (V * (i - (V / A)))); if (D <= 0) { splat = true; break; @@ -56,8 +51,7 @@ public class Splat { } break; } - D = D1 - ((A / 2) * i * i); -// System.out.printf(" ......................................debug %f\n", D); + D = jump.getAltitude() - ((A / 2) * i * i); if (D <= 0) { splat = true; break; @@ -123,9 +117,9 @@ public class Splat { } else { if (terminalReached) { - System.out.printf("%.2f SPLAT\n", (V / A) + ((D1 - (V * V / (2 * A))) / V)); + System.out.printf("%.2f SPLAT\n", (V / A) + ((jump.getAltitude() - (V * V / (2 * A))) / V)); } else { - System.out.printf("%.2f SPLAT\n", Math.sqrt(2 * D1 / A)); + System.out.printf("%.2f SPLAT\n", Math.sqrt(2 * jump.getAltitude() / A)); } switch (random.nextInt(10)) { @@ -192,6 +186,13 @@ public class Splat { } + private InitialJumpConditions buildInitialConditions() { + System.out.print("\n\n"); + float terminalVelocity = promptTerminalVelocity(); + float gravitationalAcceleration = promptGravitationalAcceleration(); + return InitialJumpConditions.create(terminalVelocity, gravitationalAcceleration); + } + private void showIntroduction() { System.out.printf("%33s%s\n", " ", "SPLAT"); System.out.printf("%15s%s\n", " ", "CREATIVE COMPUTING MORRISTOWN, NEW JERSEY"); @@ -241,6 +242,59 @@ public class Splat { return planet.getAcceleration(); } + + static class InitialJumpConditions { + private final float originalTerminalVelocity; + private final float originalGravitationalAcceleration; + private final float terminalVelocity; + private final float gravitationalAcceleration; + private final int altitude; + + private InitialJumpConditions(float originalTerminalVelocity, float originalGravitationalAcceleration, + float terminalVelocity, float gravitationalAcceleration, int altitude) { + this.originalTerminalVelocity = originalTerminalVelocity; + this.originalGravitationalAcceleration = originalGravitationalAcceleration; + this.terminalVelocity = terminalVelocity; + this.gravitationalAcceleration = gravitationalAcceleration; + this.altitude = altitude; + } + + // Create initial jump conditions with adjusted velocity/acceleration and a random initial altitude + private static InitialJumpConditions create(float terminalVelocity, float gravitationalAcceleration) { + final int altitude = (int) (9001.0f * random.nextFloat() + 1000); + return new InitialJumpConditions(terminalVelocity, gravitationalAcceleration, + plusMinus5Percent(terminalVelocity), plusMinus5Percent(gravitationalAcceleration), altitude); + } + + private static float plusMinus5Percent(float value) { + return value + ((value * random.nextFloat()) / 20.0f) - ((value * random.nextFloat()) / 20.0f); + } + + public float getOriginalTerminalVelocity() { + return originalTerminalVelocity; + } + + public float getOriginalGravitationalAcceleration() { + return originalGravitationalAcceleration; + } + + public float getTerminalVelocity() { + return terminalVelocity; + } + + public float getGravitationalAcceleration() { + return gravitationalAcceleration; + } + + public int getAltitude() { + return altitude; + } + + public float getTimeOfTerminalAccelerationReached(){ + return terminalVelocity / gravitationalAcceleration; + } + } + enum Planet { MERCURY("FINE. YOU'RE ON MERCURY", 12.2f), VENUS("ALL RIGHT. YOU'RE ON VENUS", 28.3f), From 8a992b6ba44b38beb827a66d6e5f551dbbbec786 Mon Sep 17 00:00:00 2001 From: jason Date: Tue, 4 Jan 2022 22:07:32 -0800 Subject: [PATCH 07/17] invert if and factor out splat message --- 81_Splat/java/src/Splat.java | 85 +++++++++++++++++++----------------- 1 file changed, 45 insertions(+), 40 deletions(-) diff --git a/81_Splat/java/src/Splat.java b/81_Splat/java/src/Splat.java index 67e278f8..65be1d77 100644 --- a/81_Splat/java/src/Splat.java +++ b/81_Splat/java/src/Splat.java @@ -59,7 +59,15 @@ public class Splat { System.out.printf("%10.2f %f\n", i, D); } - if (!splat) { + if (splat) { + if (terminalReached) { + System.out.printf("%.2f SPLAT\n", (V / A) + ((jump.getAltitude() - (V * V / (2 * A))) / V)); + } else { + System.out.printf("%.2f SPLAT\n", Math.sqrt(2 * jump.getAltitude() / A)); + + } + showRandomSplatMessage(); + } else { System.out.println("CHUTE OPEN"); int J = 0; @@ -115,45 +123,6 @@ public class Splat { } - } else { - if (terminalReached) { - System.out.printf("%.2f SPLAT\n", (V / A) + ((jump.getAltitude() - (V * V / (2 * A))) / V)); - } else { - System.out.printf("%.2f SPLAT\n", Math.sqrt(2 * jump.getAltitude() / A)); - - } - switch (random.nextInt(10)) { - case 0: - System.out.println("REQUIESCAT IN PACE."); - break; - case 1: - System.out.println("MAY THE ANGEL OF HEAVEN LEAD YOU INTO PARADISE."); - break; - case 2: - System.out.println("REST IN PEACE."); - break; - case 3: - System.out.println("SON-OF-A-GUN."); - break; - case 4: - System.out.println("#$%&&%!$"); - break; - case 5: - System.out.println("A KICK IN THE PANTS IS A BOOST IF YOU'RE HEADED RIGHT."); - break; - case 6: - System.out.println("HMMM. SHOULD HAVE PICKED A SHORTER TIME."); - break; - case 7: - System.out.println("MUTTER. MUTTER. MUTTER."); - break; - case 8: - System.out.println("PUSHING UP DAISIES."); - break; - default: - System.out.println("EASY COME, EASY GO."); - - } } boolean chosen = false; while (!chosen) { @@ -186,6 +155,41 @@ public class Splat { } + private void showRandomSplatMessage() { + switch (random.nextInt(10)) { + case 0: + System.out.println("REQUIESCAT IN PACE."); + break; + case 1: + System.out.println("MAY THE ANGEL OF HEAVEN LEAD YOU INTO PARADISE."); + break; + case 2: + System.out.println("REST IN PEACE."); + break; + case 3: + System.out.println("SON-OF-A-GUN."); + break; + case 4: + System.out.println("#$%&&%!$"); + break; + case 5: + System.out.println("A KICK IN THE PANTS IS A BOOST IF YOU'RE HEADED RIGHT."); + break; + case 6: + System.out.println("HMMM. SHOULD HAVE PICKED A SHORTER TIME."); + break; + case 7: + System.out.println("MUTTER. MUTTER. MUTTER."); + break; + case 8: + System.out.println("PUSHING UP DAISIES."); + break; + default: + System.out.println("EASY COME, EASY GO."); + + } + } + private InitialJumpConditions buildInitialConditions() { System.out.print("\n\n"); float terminalVelocity = promptTerminalVelocity(); @@ -243,6 +247,7 @@ public class Splat { } + // Immutable static class InitialJumpConditions { private final float originalTerminalVelocity; private final float originalGravitationalAcceleration; From dd0dbf648037ba072c4df2bba66b9ed2d62bccc7 Mon Sep 17 00:00:00 2001 From: jason Date: Tue, 4 Jan 2022 22:10:44 -0800 Subject: [PATCH 08/17] simplify splat message --- 81_Splat/java/src/Splat.java | 48 +++++++++++------------------------- 1 file changed, 14 insertions(+), 34 deletions(-) diff --git a/81_Splat/java/src/Splat.java b/81_Splat/java/src/Splat.java index 65be1d77..3e2f2f83 100644 --- a/81_Splat/java/src/Splat.java +++ b/81_Splat/java/src/Splat.java @@ -1,4 +1,5 @@ import java.util.Arrays; +import java.util.List; import java.util.Random; import java.util.Scanner; @@ -121,8 +122,6 @@ public class Splat { } System.out.println("SUCCESSFUL JUMP!!!"); } - - } boolean chosen = false; while (!chosen) { @@ -156,38 +155,19 @@ public class Splat { } private void showRandomSplatMessage() { - switch (random.nextInt(10)) { - case 0: - System.out.println("REQUIESCAT IN PACE."); - break; - case 1: - System.out.println("MAY THE ANGEL OF HEAVEN LEAD YOU INTO PARADISE."); - break; - case 2: - System.out.println("REST IN PEACE."); - break; - case 3: - System.out.println("SON-OF-A-GUN."); - break; - case 4: - System.out.println("#$%&&%!$"); - break; - case 5: - System.out.println("A KICK IN THE PANTS IS A BOOST IF YOU'RE HEADED RIGHT."); - break; - case 6: - System.out.println("HMMM. SHOULD HAVE PICKED A SHORTER TIME."); - break; - case 7: - System.out.println("MUTTER. MUTTER. MUTTER."); - break; - case 8: - System.out.println("PUSHING UP DAISIES."); - break; - default: - System.out.println("EASY COME, EASY GO."); - - } + List messages = Arrays.asList( + "REQUIESCAT IN PACE.", + "MAY THE ANGEL OF HEAVEN LEAD YOU INTO PARADISE.", + "REST IN PEACE.", + "SON-OF-A-GUN.", + "#$%&&%!$", + "A KICK IN THE PANTS IS A BOOST IF YOU'RE HEADED RIGHT.", + "HMMM. SHOULD HAVE PICKED A SHORTER TIME.", + "MUTTER. MUTTER. MUTTER.", + "PUSHING UP DAISIES.", + "EASY COME, EASY GO." + ); + System.out.println(messages.get(random.nextInt(10))); } private InitialJumpConditions buildInitialConditions() { From 42f57024fe971b10c0399eb81decc776e04ce04d Mon Sep 17 00:00:00 2001 From: jason Date: Tue, 4 Jan 2022 22:31:51 -0800 Subject: [PATCH 09/17] factor out silly play again prompt --- 81_Splat/java/src/Splat.java | 72 +++++++++++++++--------------------- 1 file changed, 29 insertions(+), 43 deletions(-) diff --git a/81_Splat/java/src/Splat.java b/81_Splat/java/src/Splat.java index 3e2f2f83..73d91021 100644 --- a/81_Splat/java/src/Splat.java +++ b/81_Splat/java/src/Splat.java @@ -21,13 +21,11 @@ public class Splat { while (true) { InitialJumpConditions jump = buildInitialConditions(); - final float V = jump.getTerminalVelocity(); - final float A = jump.getGravitationalAcceleration(); System.out.println(); System.out.printf(" ALTITUDE = %d FT\n", jump.getAltitude()); System.out.printf(" TERM. VELOCITY = %.2f FT/SEC +/-5%%\n", jump.getOriginalTerminalVelocity()); - System.out.printf(" ACCELERATION = %.2f FT/SEC/SEC +/-5%%\n", jump.getOriginalGravitationalAcceleration()); + System.out.printf(" ACCELERATION = %.2f FT/SEC/SEC +/-5%%\n", jump.getOriginalAcceleration()); System.out.println("SET THE TIMER FOR YOUR FREEFALL."); System.out.print("HOW MANY SECONDS "); @@ -35,6 +33,8 @@ public class Splat { System.out.println("HERE WE GO.\n"); System.out.println("TIME (SEC) DIST TO FALL (FT)"); System.out.println("========== ================="); + final float V = jump.getTerminalVelocity(); + final float A = jump.getAcceleration(); boolean splat = false; boolean terminalReached = false; float D = 0.0f; @@ -123,37 +123,24 @@ public class Splat { System.out.println("SUCCESSFUL JUMP!!!"); } } - boolean chosen = false; - while (!chosen) { - System.out.print("DO YOU WANT TO PLAY AGAIN "); - String Z = scanner.next(); - if (Z.equals("YES")) { - break; - } - if (Z.equals("NO")) { - System.out.print("PLEASE "); - while (true) { - Z = scanner.next(); - if (Z.equals("YES")) { - chosen = true; - break; - } - if (Z.equals("NO")) { - System.out.println("SSSSSSSSSS."); - return; - } - System.out.print("YES OR NO "); - } - continue; - } else { - System.out.print("YES OR NO "); - } + if(!playAgain()){ + return; } - } } + private boolean playAgain() { + if (askYesNo("DO YOU WANT TO PLAY AGAIN ")) { + return true; + } + if (askYesNo("PLEASE")) { + return true; + } + System.out.println("SSSSSSSSSS."); + return false; + } + private void showRandomSplatMessage() { List messages = Arrays.asList( "REQUIESCAT IN PACE.", @@ -173,8 +160,8 @@ public class Splat { private InitialJumpConditions buildInitialConditions() { System.out.print("\n\n"); float terminalVelocity = promptTerminalVelocity(); - float gravitationalAcceleration = promptGravitationalAcceleration(); - return InitialJumpConditions.create(terminalVelocity, gravitationalAcceleration); + float acceleration = promptGravitationalAcceleration(); + return InitialJumpConditions.create(terminalVelocity, acceleration); } private void showIntroduction() { @@ -226,21 +213,20 @@ public class Splat { return planet.getAcceleration(); } - // Immutable static class InitialJumpConditions { private final float originalTerminalVelocity; - private final float originalGravitationalAcceleration; + private final float originalAcceleration; private final float terminalVelocity; - private final float gravitationalAcceleration; + private final float acceleration; private final int altitude; - private InitialJumpConditions(float originalTerminalVelocity, float originalGravitationalAcceleration, - float terminalVelocity, float gravitationalAcceleration, int altitude) { + private InitialJumpConditions(float originalTerminalVelocity, float originalAcceleration, + float terminalVelocity, float acceleration, int altitude) { this.originalTerminalVelocity = originalTerminalVelocity; - this.originalGravitationalAcceleration = originalGravitationalAcceleration; + this.originalAcceleration = originalAcceleration; this.terminalVelocity = terminalVelocity; - this.gravitationalAcceleration = gravitationalAcceleration; + this.acceleration = acceleration; this.altitude = altitude; } @@ -259,16 +245,16 @@ public class Splat { return originalTerminalVelocity; } - public float getOriginalGravitationalAcceleration() { - return originalGravitationalAcceleration; + public float getOriginalAcceleration() { + return originalAcceleration; } public float getTerminalVelocity() { return terminalVelocity; } - public float getGravitationalAcceleration() { - return gravitationalAcceleration; + public float getAcceleration() { + return acceleration; } public int getAltitude() { @@ -276,7 +262,7 @@ public class Splat { } public float getTimeOfTerminalAccelerationReached(){ - return terminalVelocity / gravitationalAcceleration; + return terminalVelocity / acceleration; } } From 347558b966a041a6bf221cfeb8d655aeedd28441 Mon Sep 17 00:00:00 2001 From: jason Date: Tue, 4 Jan 2022 22:53:32 -0800 Subject: [PATCH 10/17] factor out JumpResult and executeJump() --- 81_Splat/java/src/Splat.java | 111 +++++++++++++++++++++++------------ 1 file changed, 72 insertions(+), 39 deletions(-) diff --git a/81_Splat/java/src/Splat.java b/81_Splat/java/src/Splat.java index 73d91021..ad15d84e 100644 --- a/81_Splat/java/src/Splat.java +++ b/81_Splat/java/src/Splat.java @@ -20,65 +20,41 @@ public class Splat { int K1 = 0; while (true) { - InitialJumpConditions jump = buildInitialConditions(); + InitialJumpConditions initial = buildInitialConditions(); System.out.println(); - System.out.printf(" ALTITUDE = %d FT\n", jump.getAltitude()); - System.out.printf(" TERM. VELOCITY = %.2f FT/SEC +/-5%%\n", jump.getOriginalTerminalVelocity()); - System.out.printf(" ACCELERATION = %.2f FT/SEC/SEC +/-5%%\n", jump.getOriginalAcceleration()); + System.out.printf(" ALTITUDE = %d FT\n", initial.getAltitude()); + System.out.printf(" TERM. VELOCITY = %.2f FT/SEC +/-5%%\n", initial.getOriginalTerminalVelocity()); + System.out.printf(" ACCELERATION = %.2f FT/SEC/SEC +/-5%%\n", initial.getOriginalAcceleration()); System.out.println("SET THE TIMER FOR YOUR FREEFALL."); System.out.print("HOW MANY SECONDS "); - float T = scanner.nextFloat(); + float freefallTime = scanner.nextFloat(); System.out.println("HERE WE GO.\n"); System.out.println("TIME (SEC) DIST TO FALL (FT)"); System.out.println("========== ================="); - final float V = jump.getTerminalVelocity(); - final float A = jump.getAcceleration(); - boolean splat = false; - boolean terminalReached = false; - float D = 0.0f; - for (float i = 0.0f; !splat && (i < T); i += T / 8) { - if (i > jump.getTimeOfTerminalAccelerationReached()) { - terminalReached = true; - System.out.printf("TERMINAL VELOCITY REACHED AT T PLUS %f SECONDS.\n", jump.getTimeOfTerminalAccelerationReached()); - for (i = i; i < T; i += T / 8) { - D = jump.getAltitude() - ((V * V / (2 * A)) + (V * (i - (V / A)))); - if (D <= 0) { - splat = true; - break; - } - System.out.printf("%10.2f %f\n", i, D); - } - break; - } - D = jump.getAltitude() - ((A / 2) * i * i); - if (D <= 0) { - splat = true; - break; - } - System.out.printf("%10.2f %f\n", i, D); - } + final float V = initial.getTerminalVelocity(); + final float A = initial.getAcceleration(); + JumpResult jump = executeJump(initial, freefallTime); - if (splat) { - if (terminalReached) { - System.out.printf("%.2f SPLAT\n", (V / A) + ((jump.getAltitude() - (V * V / (2 * A))) / V)); + if (jump.isSplat()) { + if (jump.hasReachedTerminalVelocity()) { + System.out.printf("%.2f SPLAT\n", (V / A) + ((initial.getAltitude() - (V * V / (2 * A))) / V)); } else { - System.out.printf("%.2f SPLAT\n", Math.sqrt(2 * jump.getAltitude() / A)); + System.out.printf("%.2f SPLAT\n", Math.sqrt(2 * initial.getAltitude() / A)); } showRandomSplatMessage(); } else { - System.out.println("CHUTE OPEN"); int J = 0; for (J = 0; J < 42; J++) { if (Arr[J] == 0) { - Arr[J] = D; + Arr[J] = jump.getDistance(); break; } K = K + 1; - if (D > Arr[J]) { + if (jump.getDistance() > Arr[J]) { continue; } K1 = K1 + 1; @@ -98,7 +74,7 @@ public class Splat { System.out.printf("YOU WERE BEATEN OUT BY %d OF THEM.\n", K - K1); } else if (K - K1 <= 0.75 * K) { System.out.printf("CONSERVATIVE, AREN'T YOU? YOU RANKED ONLY %d IN THE\n", K - K1); - System.out.printf("%d SUCCESSFUL JUMPS BEFORE YOURS.", K); + System.out.printf("%d SUCCESSFUL JUMPS BEFORE YOURS.\n", K); } else if (K - K1 <= -0.9 * K) { System.out.println("HUMPH! DON'T YOU HAVE ANY SPORTING BLOOD? THERE WERE"); System.out.printf("%d SUCCESSFUL JUMPS BEFORE YOURS AND YOU CAME IN %d JUMPS\n", K, K1); @@ -130,6 +106,33 @@ public class Splat { } + private JumpResult executeJump(InitialJumpConditions initial, float T) { + final float V = initial.getTerminalVelocity(); + final float A = initial.getAcceleration(); + + JumpResult jump = new JumpResult(initial.getAltitude()); + for (float i = 0.0f; !jump.isSplat() && (i < T); i += T / 8) { + if (i > initial.getTimeOfTerminalAccelerationReached()) { + jump.setReachedTerminalVelocity(); + System.out.printf("TERMINAL VELOCITY REACHED AT T PLUS %f SECONDS.\n", initial.getTimeOfTerminalAccelerationReached()); + for (i = i; i < T; i += T / 8) { + jump.setDistance(initial.getAltitude() - ((V * V / (2 * A)) + (V * (i - (V / A))))); + if (jump.isSplat()) { + break; + } + System.out.printf("%10.2f %f\n", i, jump.getDistance()); + } + break; + } + jump.setDistance( initial.getAltitude() - ((A / 2) * i * i)); + if (jump.isSplat()) { + break; + } + System.out.printf("%10.2f %f\n", i, jump.getDistance()); + } + return jump; + } + private boolean playAgain() { if (askYesNo("DO YOU WANT TO PLAY AGAIN ")) { return true; @@ -213,6 +216,36 @@ public class Splat { return planet.getAcceleration(); } + // Mutable + static class JumpResult { + private boolean reachedTerminalVelocity = false; + private float distance; // from the ground + + public JumpResult(float distance) { + this.distance = distance; + } + + public boolean isSplat() { + return distance <= 0; + } + + public boolean hasReachedTerminalVelocity() { + return reachedTerminalVelocity; + } + + public float getDistance() { + return distance; + } + + public void setDistance(float distance){ + this.distance = distance; + } + + public void setReachedTerminalVelocity(){ + reachedTerminalVelocity = true; + } + } + // Immutable static class InitialJumpConditions { private final float originalTerminalVelocity; From 98b4e94719d08fbcc05cf6fba07eca8df7aaa66f Mon Sep 17 00:00:00 2001 From: jason Date: Tue, 4 Jan 2022 23:14:58 -0800 Subject: [PATCH 11/17] factor out result message display and clean up ordinal switch --- 81_Splat/java/src/Splat.java | 159 +++++++++++++++++------------------ 1 file changed, 76 insertions(+), 83 deletions(-) diff --git a/81_Splat/java/src/Splat.java b/81_Splat/java/src/Splat.java index ad15d84e..a0193507 100644 --- a/81_Splat/java/src/Splat.java +++ b/81_Splat/java/src/Splat.java @@ -6,6 +6,9 @@ import java.util.Scanner; public class Splat { private static final Random random = new Random(); private final Scanner scanner = new Scanner(System.in); + private final float[] Arr = new float[42]; + private int K = 0; + private int K1 = 0; public static void main(String[] args) { new Splat().run(); @@ -14,10 +17,7 @@ public class Splat { public void run() { showIntroduction(); - float[] Arr = new float[42]; Arrays.fill(Arr, 0.0f); - int K = 0; - int K1 = 0; while (true) { InitialJumpConditions initial = buildInitialConditions(); @@ -33,106 +33,100 @@ public class Splat { System.out.println("HERE WE GO.\n"); System.out.println("TIME (SEC) DIST TO FALL (FT)"); System.out.println("========== ================="); - final float V = initial.getTerminalVelocity(); - final float A = initial.getAcceleration(); + JumpResult jump = executeJump(initial, freefallTime); + showJumpResults(initial, jump); - if (jump.isSplat()) { - if (jump.hasReachedTerminalVelocity()) { - System.out.printf("%.2f SPLAT\n", (V / A) + ((initial.getAltitude() - (V * V / (2 * A))) / V)); - } else { - System.out.printf("%.2f SPLAT\n", Math.sqrt(2 * initial.getAltitude() / A)); - - } - showRandomSplatMessage(); - } else { - System.out.println("CHUTE OPEN"); - int J = 0; - for (J = 0; J < 42; J++) { - if (Arr[J] == 0) { - Arr[J] = jump.getDistance(); - break; - } - K = K + 1; - if (jump.getDistance() > Arr[J]) { - continue; - } - K1 = K1 + 1; - } - - if (J > 2) { - if (K - K1 <= 0.1 * K) { - System.out.printf("WOW! THAT'S SOME JUMPING. OF THE %d SUCCESSFUL JUMPS\n", K); - System.out.printf("BEFORE YOURS, ONLY %d OPENED THEIR CHUTES LOWER THAN\n", K - K1); - System.out.println("YOU DID."); - } else if (K - K1 <= 0.25 * K) { - System.out.printf("PRETTY GOOD! %d SUCCESSFUL JUMPS PRECEDED YOURS AND ONLY\n", K); - System.out.printf("%d OF THEM GOT LOWER THAN YOU DID BEFORE THEIR CHUTES\n", K - K1); - System.out.println("OPENED."); - } else if (K - K1 <= 0.5 * K) { - System.out.printf("NOT BAD. THERE HAVE BEEN %d SUCCESSFUL JUMPS BEFORE YOURS.\n", K); - System.out.printf("YOU WERE BEATEN OUT BY %d OF THEM.\n", K - K1); - } else if (K - K1 <= 0.75 * K) { - System.out.printf("CONSERVATIVE, AREN'T YOU? YOU RANKED ONLY %d IN THE\n", K - K1); - System.out.printf("%d SUCCESSFUL JUMPS BEFORE YOURS.\n", K); - } else if (K - K1 <= -0.9 * K) { - System.out.println("HUMPH! DON'T YOU HAVE ANY SPORTING BLOOD? THERE WERE"); - System.out.printf("%d SUCCESSFUL JUMPS BEFORE YOURS AND YOU CAME IN %d JUMPS\n", K, K1); - System.out.println("BETTER THAN THE WORST. SHAPE UP!!!\n"); - } else { - System.out.printf("HEY! YOU PULLED THE RIP CORD MUCH TOO SOON. %f SUCCESSFUL\n", K); - System.out.printf("JUMPS BEFORE YOURS AND YOU CAME IN NUMBER %d! GET WITH IT!\n", K - K1); - } - } else { - System.out.println("AMAZING!!! NOT BAD FOR YOUR "); - switch (J) { - case 0: - System.out.print("1ST "); - break; - case 1: - System.out.print("2ND "); - break; - case 2: - System.out.print("3RD "); - break; - } - System.out.println("SUCCESSFUL JUMP!!!"); - } - } if(!playAgain()){ + System.out.println("SSSSSSSSSS."); return; } } - } - private JumpResult executeJump(InitialJumpConditions initial, float T) { + private void showJumpResults(InitialJumpConditions initial, JumpResult jump) { final float V = initial.getTerminalVelocity(); final float A = initial.getAcceleration(); + if (jump.isSplat()) { + if (jump.hasReachedTerminalVelocity()) { + System.out.printf("%.2f SPLAT\n", (V / A) + ((initial.getAltitude() - (V * V / (2 * A))) / V)); + } else { + System.out.printf("%.2f SPLAT\n", Math.sqrt(2 * initial.getAltitude() / A)); + } + showRandomSplatMessage(); + } else { + System.out.println("CHUTE OPEN"); + int J = 0; + for (J = 0; J < 42; J++) { + if (Arr[J] == 0) { + Arr[J] = jump.getDistance(); + break; + } + K = K + 1; + if (jump.getDistance() > Arr[J]) { + continue; + } + K1 = K1 + 1; + } + + if (J > 2) { + if (K - K1 <= 0.1 * K) { + System.out.printf("WOW! THAT'S SOME JUMPING. OF THE %d SUCCESSFUL JUMPS\n", K); + System.out.printf("BEFORE YOURS, ONLY %d OPENED THEIR CHUTES LOWER THAN\n", K - K1); + System.out.println("YOU DID."); + } else if (K - K1 <= 0.25 * K) { + System.out.printf("PRETTY GOOD! %d SUCCESSFUL JUMPS PRECEDED YOURS AND ONLY\n", K); + System.out.printf("%d OF THEM GOT LOWER THAN YOU DID BEFORE THEIR CHUTES\n", K - K1); + System.out.println("OPENED."); + } else if (K - K1 <= 0.5 * K) { + System.out.printf("NOT BAD. THERE HAVE BEEN %d SUCCESSFUL JUMPS BEFORE YOURS.\n", K); + System.out.printf("YOU WERE BEATEN OUT BY %d OF THEM.\n", K - K1); + } else if (K - K1 <= 0.75 * K) { + System.out.printf("CONSERVATIVE, AREN'T YOU? YOU RANKED ONLY %d IN THE\n", K - K1); + System.out.printf("%d SUCCESSFUL JUMPS BEFORE YOURS.\n", K); + } else if (K - K1 <= -0.9 * K) { + System.out.println("HUMPH! DON'T YOU HAVE ANY SPORTING BLOOD? THERE WERE"); + System.out.printf("%d SUCCESSFUL JUMPS BEFORE YOURS AND YOU CAME IN %d JUMPS\n", K, K1); + System.out.println("BETTER THAN THE WORST. SHAPE UP!!!\n"); + } else { + System.out.printf("HEY! YOU PULLED THE RIP CORD MUCH TOO SOON. %f SUCCESSFUL\n", K); + System.out.printf("JUMPS BEFORE YOURS AND YOU CAME IN NUMBER %d! GET WITH IT!\n", K - K1); + } + } else { + String[] nums = new String[]{ "1ST", "2ND", "3RD"}; + System.out.printf("AMAZING!!! NOT BAD FOR YOUR %s SUCCESSFUL JUMP!!!\n", nums[J]); + } + } + } + + private JumpResult executeJump(InitialJumpConditions initial, float chuteOpenTime) { JumpResult jump = new JumpResult(initial.getAltitude()); - for (float i = 0.0f; !jump.isSplat() && (i < T); i += T / 8) { - if (i > initial.getTimeOfTerminalAccelerationReached()) { + for (float time = 0.0f; !jump.isSplat() && (time < chuteOpenTime); time += chuteOpenTime / 8) { + if (!jump.hasReachedTerminalVelocity() && time > initial.getTimeOfTerminalAccelerationReached()) { jump.setReachedTerminalVelocity(); System.out.printf("TERMINAL VELOCITY REACHED AT T PLUS %f SECONDS.\n", initial.getTimeOfTerminalAccelerationReached()); - for (i = i; i < T; i += T / 8) { - jump.setDistance(initial.getAltitude() - ((V * V / (2 * A)) + (V * (i - (V / A))))); - if (jump.isSplat()) { - break; - } - System.out.printf("%10.2f %f\n", i, jump.getDistance()); - } - break; } - jump.setDistance( initial.getAltitude() - ((A / 2) * i * i)); + float newDistance = computeDistance(initial, time, jump.hasReachedTerminalVelocity()); + jump.setDistance(newDistance); + if (jump.isSplat()) { - break; + return jump; } - System.out.printf("%10.2f %f\n", i, jump.getDistance()); + System.out.printf("%10.2f %f\n", time, jump.getDistance()); } return jump; } + private float computeDistance(InitialJumpConditions initial, float i, boolean hasReachedTerminalVelocity) { + final float V = initial.getTerminalVelocity(); + final float A = initial.getAcceleration(); + if(hasReachedTerminalVelocity) { + return initial.getAltitude() - ((V * V / (2 * A)) + (V * (i - (V / A)))); + } + return initial.getAltitude() - ((A / 2) * i * i); + } + private boolean playAgain() { if (askYesNo("DO YOU WANT TO PLAY AGAIN ")) { return true; @@ -140,7 +134,6 @@ public class Splat { if (askYesNo("PLEASE")) { return true; } - System.out.println("SSSSSSSSSS."); return false; } From 8e98439f35e93e95379ef652fd283a10d919baeb Mon Sep 17 00:00:00 2001 From: jason Date: Tue, 4 Jan 2022 23:49:31 -0800 Subject: [PATCH 12/17] simplify handling of past successes --- 81_Splat/java/src/Splat.java | 146 +++++++++++++++++------------------ 1 file changed, 72 insertions(+), 74 deletions(-) diff --git a/81_Splat/java/src/Splat.java b/81_Splat/java/src/Splat.java index a0193507..2586ecab 100644 --- a/81_Splat/java/src/Splat.java +++ b/81_Splat/java/src/Splat.java @@ -1,14 +1,9 @@ -import java.util.Arrays; -import java.util.List; -import java.util.Random; -import java.util.Scanner; +import java.util.*; public class Splat { private static final Random random = new Random(); private final Scanner scanner = new Scanner(System.in); - private final float[] Arr = new float[42]; - private int K = 0; - private int K1 = 0; + private final List pastSuccessfulJumpDistances = new ArrayList<>(); public static void main(String[] args) { new Splat().run(); @@ -17,7 +12,6 @@ public class Splat { public void run() { showIntroduction(); - Arrays.fill(Arr, 0.0f); while (true) { InitialJumpConditions initial = buildInitialConditions(); @@ -45,59 +39,66 @@ public class Splat { } private void showJumpResults(InitialJumpConditions initial, JumpResult jump) { + if (jump.isSplat()) { + showSplatMessage(initial, jump); + showCleverSplatMessage(); + return; + } + System.out.println("CHUTE OPEN"); + int worseJumpCount = countWorseHistoricalJumps(jump); + pastSuccessfulJumpDistances.add(jump.getDistance()); + int successfulJumpCt = pastSuccessfulJumpDistances.size(); + + if (pastSuccessfulJumpDistances.size() <= 2) { + List ordinals = Arrays.asList("1ST", "2ND", "3RD"); + System.out.printf("AMAZING!!! NOT BAD FOR YOUR %s SUCCESSFUL JUMP!!!\n", ordinals.get(successfulJumpCt)); + return; + } + + int betterThanCount = successfulJumpCt - worseJumpCount; + if (betterThanCount <= 0.1 * successfulJumpCt) { + System.out.printf("WOW! THAT'S SOME JUMPING. OF THE %d SUCCESSFUL JUMPS\n", successfulJumpCt); + System.out.printf("BEFORE YOURS, ONLY %d OPENED THEIR CHUTES LOWER THAN\n", betterThanCount); + System.out.println("YOU DID."); + } else if (betterThanCount <= 0.25 * successfulJumpCt) { + System.out.printf("PRETTY GOOD! %d SUCCESSFUL JUMPS PRECEDED YOURS AND ONLY\n", successfulJumpCt); + System.out.printf("%d OF THEM GOT LOWER THAN YOU DID BEFORE THEIR CHUTES\n", betterThanCount); + System.out.println("OPENED."); + } else if (betterThanCount <= 0.5 * successfulJumpCt) { + System.out.printf("NOT BAD. THERE HAVE BEEN %d SUCCESSFUL JUMPS BEFORE YOURS.\n", successfulJumpCt); + System.out.printf("YOU WERE BEATEN OUT BY %d OF THEM.\n", betterThanCount); + } else if (betterThanCount <= 0.75 * successfulJumpCt) { + System.out.printf("CONSERVATIVE, AREN'T YOU? YOU RANKED ONLY %d IN THE\n", betterThanCount); + System.out.printf("%d SUCCESSFUL JUMPS BEFORE YOURS.\n", successfulJumpCt); + } else if (betterThanCount <= -0.9 * successfulJumpCt) { + System.out.println("HUMPH! DON'T YOU HAVE ANY SPORTING BLOOD? THERE WERE"); + System.out.printf("%d SUCCESSFUL JUMPS BEFORE YOURS AND YOU CAME IN %d JUMPS\n", successfulJumpCt, worseJumpCount); + System.out.println("BETTER THAN THE WORST. SHAPE UP!!!\n"); + } else { + System.out.printf("HEY! YOU PULLED THE RIP CORD MUCH TOO SOON. %d SUCCESSFUL\n", successfulJumpCt); + System.out.printf("JUMPS BEFORE YOURS AND YOU CAME IN NUMBER %d! GET WITH IT!\n", betterThanCount); + } + } + + private void showSplatMessage(InitialJumpConditions initial, JumpResult jump) { + double timeOfSplat = computeTimeOfSplat(initial, jump); + System.out.printf("%10.2f SPLAT\n", timeOfSplat); + } + + private double computeTimeOfSplat(InitialJumpConditions initial, JumpResult jump) { final float V = initial.getTerminalVelocity(); final float A = initial.getAcceleration(); - - if (jump.isSplat()) { - if (jump.hasReachedTerminalVelocity()) { - System.out.printf("%.2f SPLAT\n", (V / A) + ((initial.getAltitude() - (V * V / (2 * A))) / V)); - } else { - System.out.printf("%.2f SPLAT\n", Math.sqrt(2 * initial.getAltitude() / A)); - } - showRandomSplatMessage(); - } else { - System.out.println("CHUTE OPEN"); - int J = 0; - for (J = 0; J < 42; J++) { - if (Arr[J] == 0) { - Arr[J] = jump.getDistance(); - break; - } - K = K + 1; - if (jump.getDistance() > Arr[J]) { - continue; - } - K1 = K1 + 1; - } - - if (J > 2) { - if (K - K1 <= 0.1 * K) { - System.out.printf("WOW! THAT'S SOME JUMPING. OF THE %d SUCCESSFUL JUMPS\n", K); - System.out.printf("BEFORE YOURS, ONLY %d OPENED THEIR CHUTES LOWER THAN\n", K - K1); - System.out.println("YOU DID."); - } else if (K - K1 <= 0.25 * K) { - System.out.printf("PRETTY GOOD! %d SUCCESSFUL JUMPS PRECEDED YOURS AND ONLY\n", K); - System.out.printf("%d OF THEM GOT LOWER THAN YOU DID BEFORE THEIR CHUTES\n", K - K1); - System.out.println("OPENED."); - } else if (K - K1 <= 0.5 * K) { - System.out.printf("NOT BAD. THERE HAVE BEEN %d SUCCESSFUL JUMPS BEFORE YOURS.\n", K); - System.out.printf("YOU WERE BEATEN OUT BY %d OF THEM.\n", K - K1); - } else if (K - K1 <= 0.75 * K) { - System.out.printf("CONSERVATIVE, AREN'T YOU? YOU RANKED ONLY %d IN THE\n", K - K1); - System.out.printf("%d SUCCESSFUL JUMPS BEFORE YOURS.\n", K); - } else if (K - K1 <= -0.9 * K) { - System.out.println("HUMPH! DON'T YOU HAVE ANY SPORTING BLOOD? THERE WERE"); - System.out.printf("%d SUCCESSFUL JUMPS BEFORE YOURS AND YOU CAME IN %d JUMPS\n", K, K1); - System.out.println("BETTER THAN THE WORST. SHAPE UP!!!\n"); - } else { - System.out.printf("HEY! YOU PULLED THE RIP CORD MUCH TOO SOON. %f SUCCESSFUL\n", K); - System.out.printf("JUMPS BEFORE YOURS AND YOU CAME IN NUMBER %d! GET WITH IT!\n", K - K1); - } - } else { - String[] nums = new String[]{ "1ST", "2ND", "3RD"}; - System.out.printf("AMAZING!!! NOT BAD FOR YOUR %s SUCCESSFUL JUMP!!!\n", nums[J]); - } + if (jump.hasReachedTerminalVelocity()) { + return (V / A) + ((initial.getAltitude() - (V * V / (2 * A))) / V); } + return Math.sqrt(2 * initial.getAltitude() / A); + } + + // Returns the number of jumps that this jump was better than + private int countWorseHistoricalJumps(JumpResult jump) { + return (int) pastSuccessfulJumpDistances.stream() + .filter(distance -> jump.getDistance() < distance) + .count(); } private JumpResult executeJump(InitialJumpConditions initial, float chuteOpenTime) { @@ -131,13 +132,10 @@ public class Splat { if (askYesNo("DO YOU WANT TO PLAY AGAIN ")) { return true; } - if (askYesNo("PLEASE")) { - return true; - } - return false; + return askYesNo("PLEASE"); } - private void showRandomSplatMessage() { + private void showCleverSplatMessage() { List messages = Arrays.asList( "REQUIESCAT IN PACE.", "MAY THE ANGEL OF HEAVEN LEAD YOU INTO PARADISE.", @@ -205,7 +203,7 @@ public class Splat { private float chooseRandomAcceleration() { Planet planet = Planet.pickRandom(); - System.out.printf("%s. ACCELERATION=%.2f FT/SEC/SEC.\n", planet.getMessage(), planet.getAcceleration()); + System.out.printf("%s %s. ACCELERATION=%.2f FT/SEC/SEC.\n", planet.getMessage(), planet.name(), planet.getAcceleration()); return planet.getAcceleration(); } @@ -293,16 +291,16 @@ public class Splat { } enum Planet { - MERCURY("FINE. YOU'RE ON MERCURY", 12.2f), - VENUS("ALL RIGHT. YOU'RE ON VENUS", 28.3f), - EARTH("THEN YOU'RE ON EARTH", 32.16f), - MOON("FINE. YOU'RE ON THE MOON", 5.15f), - MARS("ALL RIGHT. YOU'RE ON MARS", 12.5f), - JUPITER("THEN YOU'RE ON JUPITER", 85.2f), - SATURN("FINE. YOU'RE ON SATURN", 37.6f), - URANUS("ALL RIGHT. YOU'RE ON URANUS", 33.8f), - NEPTUNE("THEN YOU'RE ON NEPTUNE", 39.6f), - SUN("FINE. YOU'RE ON THE SUN", 896.0f); + MERCURY("FINE. YOU'RE ON", 12.2f), + VENUS("ALL RIGHT. YOU'RE ON", 28.3f), + EARTH("THEN YOU'RE ON", 32.16f), + MOON("FINE. YOU'RE ON THE", 5.15f), + MARS("ALL RIGHT. YOU'RE ON", 12.5f), + JUPITER("THEN YOU'RE ON", 85.2f), + SATURN("FINE. YOU'RE ON", 37.6f), + URANUS("ALL RIGHT. YOU'RE ON", 33.8f), + NEPTUNE("THEN YOU'RE ON", 39.6f), + SUN("FINE. YOU'RE ON THE", 896.0f); static final Random random = new Random(); private final String message; From 522975485110ed58784438945e21e575e14bc5ef Mon Sep 17 00:00:00 2001 From: jason Date: Tue, 4 Jan 2022 23:59:26 -0800 Subject: [PATCH 13/17] fix problem with holding count after add and fix up some visiblity for simplicity --- 81_Splat/java/src/Splat.java | 92 ++++++++++++++++++------------------ 1 file changed, 46 insertions(+), 46 deletions(-) diff --git a/81_Splat/java/src/Splat.java b/81_Splat/java/src/Splat.java index 2586ecab..6b89dde2 100644 --- a/81_Splat/java/src/Splat.java +++ b/81_Splat/java/src/Splat.java @@ -46,8 +46,8 @@ public class Splat { } System.out.println("CHUTE OPEN"); int worseJumpCount = countWorseHistoricalJumps(jump); - pastSuccessfulJumpDistances.add(jump.getDistance()); int successfulJumpCt = pastSuccessfulJumpDistances.size(); + pastSuccessfulJumpDistances.add(jump.getDistance()); if (pastSuccessfulJumpDistances.size() <= 2) { List ordinals = Arrays.asList("1ST", "2ND", "3RD"); @@ -207,6 +207,40 @@ public class Splat { return planet.getAcceleration(); } + enum Planet { + MERCURY("FINE. YOU'RE ON", 12.2f), + VENUS("ALL RIGHT. YOU'RE ON", 28.3f), + EARTH("THEN YOU'RE ON", 32.16f), + MOON("FINE. YOU'RE ON THE", 5.15f), + MARS("ALL RIGHT. YOU'RE ON", 12.5f), + JUPITER("THEN YOU'RE ON", 85.2f), + SATURN("FINE. YOU'RE ON", 37.6f), + URANUS("ALL RIGHT. YOU'RE ON", 33.8f), + NEPTUNE("THEN YOU'RE ON", 39.6f), + SUN("FINE. YOU'RE ON THE", 896.0f); + + private static final Random random = new Random(); + private final String message; + private final float acceleration; + + Planet(String message, float acceleration) { + this.message = message; + this.acceleration = acceleration; + } + + static Planet pickRandom(){ + return values()[random.nextInt(Planet.values().length)]; + } + + String getMessage() { + return message; + } + + float getAcceleration() { + return acceleration; + } + } + // Mutable static class JumpResult { private boolean reachedTerminalVelocity = false; @@ -216,23 +250,23 @@ public class Splat { this.distance = distance; } - public boolean isSplat() { + boolean isSplat() { return distance <= 0; } - public boolean hasReachedTerminalVelocity() { + boolean hasReachedTerminalVelocity() { return reachedTerminalVelocity; } - public float getDistance() { + float getDistance() { return distance; } - public void setDistance(float distance){ + void setDistance(float distance){ this.distance = distance; } - public void setReachedTerminalVelocity(){ + void setReachedTerminalVelocity(){ reachedTerminalVelocity = true; } } @@ -265,62 +299,28 @@ public class Splat { return value + ((value * random.nextFloat()) / 20.0f) - ((value * random.nextFloat()) / 20.0f); } - public float getOriginalTerminalVelocity() { + float getOriginalTerminalVelocity() { return originalTerminalVelocity; } - public float getOriginalAcceleration() { + float getOriginalAcceleration() { return originalAcceleration; } - public float getTerminalVelocity() { + float getTerminalVelocity() { return terminalVelocity; } - public float getAcceleration() { + float getAcceleration() { return acceleration; } - public int getAltitude() { + int getAltitude() { return altitude; } - public float getTimeOfTerminalAccelerationReached(){ + float getTimeOfTerminalAccelerationReached(){ return terminalVelocity / acceleration; } } - - enum Planet { - MERCURY("FINE. YOU'RE ON", 12.2f), - VENUS("ALL RIGHT. YOU'RE ON", 28.3f), - EARTH("THEN YOU'RE ON", 32.16f), - MOON("FINE. YOU'RE ON THE", 5.15f), - MARS("ALL RIGHT. YOU'RE ON", 12.5f), - JUPITER("THEN YOU'RE ON", 85.2f), - SATURN("FINE. YOU'RE ON", 37.6f), - URANUS("ALL RIGHT. YOU'RE ON", 33.8f), - NEPTUNE("THEN YOU'RE ON", 39.6f), - SUN("FINE. YOU'RE ON THE", 896.0f); - - static final Random random = new Random(); - private final String message; - private final float acceleration; - - Planet(String message, float acceleration) { - this.message = message; - this.acceleration = acceleration; - } - - static Planet pickRandom(){ - return values()[random.nextInt(Planet.values().length)]; - } - - public String getMessage() { - return message; - } - - public float getAcceleration() { - return acceleration; - } - } } \ No newline at end of file From 9cc332f568189fa7bc028e662de6a5e08e3a88a7 Mon Sep 17 00:00:00 2001 From: jason Date: Wed, 5 Jan 2022 00:00:03 -0800 Subject: [PATCH 14/17] grammar nit --- 81_Splat/java/src/Splat.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/81_Splat/java/src/Splat.java b/81_Splat/java/src/Splat.java index 6b89dde2..4c0e2fdf 100644 --- a/81_Splat/java/src/Splat.java +++ b/81_Splat/java/src/Splat.java @@ -94,7 +94,7 @@ public class Splat { return Math.sqrt(2 * initial.getAltitude() / A); } - // Returns the number of jumps that this jump was better than + // Returns the number of jumps for which this jump was better private int countWorseHistoricalJumps(JumpResult jump) { return (int) pastSuccessfulJumpDistances.stream() .filter(distance -> jump.getDistance() < distance) From 11dba9dd92cef1a0d26c2300129be460072a6fd7 Mon Sep 17 00:00:00 2001 From: jason Date: Wed, 5 Jan 2022 00:04:24 -0800 Subject: [PATCH 15/17] debrand --- 81_Splat/java/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/81_Splat/java/README.md b/81_Splat/java/README.md index 51edd8d4..b8998fa6 100644 --- a/81_Splat/java/README.md +++ b/81_Splat/java/README.md @@ -1,3 +1,3 @@ Original source downloaded [from Vintage Basic](http://www.vintage-basic.net/games.html) -Conversion to [Oracle Java](https://openjdk.java.net/) +Conversion to [Java](https://openjdk.java.net/) From 18b37bda81c1504cc6c062de84787a6403953630 Mon Sep 17 00:00:00 2001 From: jason Date: Wed, 5 Jan 2022 00:12:43 -0800 Subject: [PATCH 16/17] add top comment copied from readme (includes attribution) and reorganize methods for readability. --- 81_Splat/java/src/Splat.java | 196 +++++++++++++++++++---------------- 1 file changed, 109 insertions(+), 87 deletions(-) diff --git a/81_Splat/java/src/Splat.java b/81_Splat/java/src/Splat.java index 4c0e2fdf..3c4cd817 100644 --- a/81_Splat/java/src/Splat.java +++ b/81_Splat/java/src/Splat.java @@ -1,5 +1,22 @@ import java.util.*; +/** + * SPLAT simulates a parachute jump in which you try to open your parachute at the last possible moment without going + * splat! You may select your own terminal velocity or let the computer do it for you. You many also select the + * acceleration due to gravity or, again, let the computer do it in which case you might wind up on any of eight + * planets (out to Neptune), the moon, or the sun. + *

+ * The computer then tells you the height you’re jumping from and asks for the seconds of free fall. It then divides + * your free fall time into eight intervals and gives you progress reports on your way down. The computer also keeps + * track of all prior jumps in the array A and lets you know how you compared with previous successful jumps. If you + * want to recall information from previous runs, then you should store array A in a disk or take file and read it + * before each run. + *

+ * John Yegge created this program while at the Oak Ridge Associated Universities. + *

+ * Ported from BASIC by jason plumb (@breedx2) + *

+ */ public class Splat { private static final Random random = new Random(); private final Scanner scanner = new Scanner(System.in); @@ -31,13 +48,74 @@ public class Splat { JumpResult jump = executeJump(initial, freefallTime); showJumpResults(initial, jump); - if(!playAgain()){ + if (!playAgain()) { System.out.println("SSSSSSSSSS."); return; } } } + private void showIntroduction() { + System.out.printf("%33s%s\n", " ", "SPLAT"); + System.out.printf("%15s%s\n", " ", "CREATIVE COMPUTING MORRISTOWN, NEW JERSEY"); + System.out.print("\n\n\n"); + System.out.println("WELCOME TO 'SPLAT' -- THE GAME THAT SIMULATES A PARACHUTE"); + System.out.println("JUMP. TRY TO OPEN YOUR CHUTE AT THE LAST POSSIBLE"); + System.out.println("MOMENT WITHOUT GOING SPLAT."); + } + + private InitialJumpConditions buildInitialConditions() { + System.out.print("\n\n"); + float terminalVelocity = promptTerminalVelocity(); + float acceleration = promptGravitationalAcceleration(); + return InitialJumpConditions.create(terminalVelocity, acceleration); + } + + private float promptTerminalVelocity() { + if (askYesNo("SELECT YOUR OWN TERMINAL VELOCITY")) { + System.out.print("WHAT TERMINAL VELOCITY (MI/HR) "); + return mphToFeetPerSec(scanner.nextFloat()); + } + float terminalVelocity = (int) (1000 * random.nextFloat()); + System.out.printf("OK. TERMINAL VELOCITY = %.2f MI/HR\n", terminalVelocity); + return mphToFeetPerSec(terminalVelocity); + } + + private float promptGravitationalAcceleration() { + if (askYesNo("WANT TO SELECT ACCELERATION DUE TO GRAVITY")) { + System.out.print("WHAT ACCELERATION (FT/SEC/SEC) "); + return scanner.nextFloat(); + } + return chooseRandomAcceleration(); + } + + private JumpResult executeJump(InitialJumpConditions initial, float chuteOpenTime) { + JumpResult jump = new JumpResult(initial.getAltitude()); + for (float time = 0.0f; !jump.isSplat() && (time < chuteOpenTime); time += chuteOpenTime / 8) { + if (!jump.hasReachedTerminalVelocity() && time > initial.getTimeOfTerminalAccelerationReached()) { + jump.setReachedTerminalVelocity(); + System.out.printf("TERMINAL VELOCITY REACHED AT T PLUS %f SECONDS.\n", initial.getTimeOfTerminalAccelerationReached()); + } + float newDistance = computeDistance(initial, time, jump.hasReachedTerminalVelocity()); + jump.setDistance(newDistance); + + if (jump.isSplat()) { + return jump; + } + System.out.printf("%10.2f %f\n", time, jump.getDistance()); + } + return jump; + } + + private float computeDistance(InitialJumpConditions initial, float i, boolean hasReachedTerminalVelocity) { + final float V = initial.getTerminalVelocity(); + final float A = initial.getAcceleration(); + if (hasReachedTerminalVelocity) { + return initial.getAltitude() - ((V * V / (2 * A)) + (V * (i - (V / A)))); + } + return initial.getAltitude() - ((A / 2) * i * i); + } + private void showJumpResults(InitialJumpConditions initial, JumpResult jump) { if (jump.isSplat()) { showSplatMessage(initial, jump); @@ -85,6 +163,9 @@ public class Splat { System.out.printf("%10.2f SPLAT\n", timeOfSplat); } + /** + * Returns the number of jumps for which this jump was better + */ private double computeTimeOfSplat(InitialJumpConditions initial, JumpResult jump) { final float V = initial.getTerminalVelocity(); final float A = initial.getAcceleration(); @@ -94,38 +175,26 @@ public class Splat { return Math.sqrt(2 * initial.getAltitude() / A); } - // Returns the number of jumps for which this jump was better private int countWorseHistoricalJumps(JumpResult jump) { return (int) pastSuccessfulJumpDistances.stream() .filter(distance -> jump.getDistance() < distance) .count(); } - private JumpResult executeJump(InitialJumpConditions initial, float chuteOpenTime) { - JumpResult jump = new JumpResult(initial.getAltitude()); - for (float time = 0.0f; !jump.isSplat() && (time < chuteOpenTime); time += chuteOpenTime / 8) { - if (!jump.hasReachedTerminalVelocity() && time > initial.getTimeOfTerminalAccelerationReached()) { - jump.setReachedTerminalVelocity(); - System.out.printf("TERMINAL VELOCITY REACHED AT T PLUS %f SECONDS.\n", initial.getTimeOfTerminalAccelerationReached()); - } - float newDistance = computeDistance(initial, time, jump.hasReachedTerminalVelocity()); - jump.setDistance(newDistance); - - if (jump.isSplat()) { - return jump; - } - System.out.printf("%10.2f %f\n", time, jump.getDistance()); - } - return jump; - } - - private float computeDistance(InitialJumpConditions initial, float i, boolean hasReachedTerminalVelocity) { - final float V = initial.getTerminalVelocity(); - final float A = initial.getAcceleration(); - if(hasReachedTerminalVelocity) { - return initial.getAltitude() - ((V * V / (2 * A)) + (V * (i - (V / A)))); - } - return initial.getAltitude() - ((A / 2) * i * i); + private void showCleverSplatMessage() { + List messages = Arrays.asList( + "REQUIESCAT IN PACE.", + "MAY THE ANGEL OF HEAVEN LEAD YOU INTO PARADISE.", + "REST IN PEACE.", + "SON-OF-A-GUN.", + "#$%&&%!$", + "A KICK IN THE PANTS IS A BOOST IF YOU'RE HEADED RIGHT.", + "HMMM. SHOULD HAVE PICKED A SHORTER TIME.", + "MUTTER. MUTTER. MUTTER.", + "PUSHING UP DAISIES.", + "EASY COME, EASY GO." + ); + System.out.println(messages.get(random.nextInt(10))); } private boolean playAgain() { @@ -135,68 +204,21 @@ public class Splat { return askYesNo("PLEASE"); } - private void showCleverSplatMessage() { - List messages = Arrays.asList( - "REQUIESCAT IN PACE.", - "MAY THE ANGEL OF HEAVEN LEAD YOU INTO PARADISE.", - "REST IN PEACE.", - "SON-OF-A-GUN.", - "#$%&&%!$", - "A KICK IN THE PANTS IS A BOOST IF YOU'RE HEADED RIGHT.", - "HMMM. SHOULD HAVE PICKED A SHORTER TIME.", - "MUTTER. MUTTER. MUTTER.", - "PUSHING UP DAISIES.", - "EASY COME, EASY GO." - ); - System.out.println(messages.get(random.nextInt(10))); - } - - private InitialJumpConditions buildInitialConditions() { - System.out.print("\n\n"); - float terminalVelocity = promptTerminalVelocity(); - float acceleration = promptGravitationalAcceleration(); - return InitialJumpConditions.create(terminalVelocity, acceleration); - } - - private void showIntroduction() { - System.out.printf("%33s%s\n", " ", "SPLAT"); - System.out.printf("%15s%s\n", " ", "CREATIVE COMPUTING MORRISTOWN, NEW JERSEY"); - System.out.print("\n\n\n"); - System.out.println("WELCOME TO 'SPLAT' -- THE GAME THAT SIMULATES A PARACHUTE"); - System.out.println("JUMP. TRY TO OPEN YOUR CHUTE AT THE LAST POSSIBLE"); - System.out.println("MOMENT WITHOUT GOING SPLAT."); - } - - private float promptTerminalVelocity() { - if(askYesNo("SELECT YOUR OWN TERMINAL VELOCITY")){ - System.out.print("WHAT TERMINAL VELOCITY (MI/HR) "); - return mphToFeetPerSec(scanner.nextFloat()); - } - float terminalVelocity = (int) (1000 * random.nextFloat()); - System.out.printf("OK. TERMINAL VELOCITY = %.2f MI/HR\n", terminalVelocity); - return mphToFeetPerSec(terminalVelocity); - } - - private float promptGravitationalAcceleration() { - if(askYesNo("WANT TO SELECT ACCELERATION DUE TO GRAVITY")){ - System.out.print("WHAT ACCELERATION (FT/SEC/SEC) "); - return scanner.nextFloat(); - } - return chooseRandomAcceleration(); - } - - private float mphToFeetPerSec(float speed){ + private float mphToFeetPerSec(float speed) { return speed * (5280.0f / 3600.0f); } - private boolean askYesNo(String prompt){ + private boolean askYesNo(String prompt) { System.out.printf("%s (YES OR NO) ", prompt); while (true) { String answer = scanner.next(); - switch(answer){ - case "YES": return true; - case "NO": return false; - default: System.out.print("YES OR NO "); + switch (answer) { + case "YES": + return true; + case "NO": + return false; + default: + System.out.print("YES OR NO "); } } } @@ -228,7 +250,7 @@ public class Splat { this.acceleration = acceleration; } - static Planet pickRandom(){ + static Planet pickRandom() { return values()[random.nextInt(Planet.values().length)]; } @@ -262,11 +284,11 @@ public class Splat { return distance; } - void setDistance(float distance){ + void setDistance(float distance) { this.distance = distance; } - void setReachedTerminalVelocity(){ + void setReachedTerminalVelocity() { reachedTerminalVelocity = true; } } @@ -319,7 +341,7 @@ public class Splat { return altitude; } - float getTimeOfTerminalAccelerationReached(){ + float getTimeOfTerminalAccelerationReached() { return terminalVelocity / acceleration; } } From 3c185d1c8c2c3c7eed2995b04aed9861699294dc Mon Sep 17 00:00:00 2001 From: jason Date: Wed, 5 Jan 2022 00:15:05 -0800 Subject: [PATCH 17/17] remove unnecessary leftover check --- 81_Splat/java/src/Splat.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/81_Splat/java/src/Splat.java b/81_Splat/java/src/Splat.java index 3c4cd817..b76c82ff 100644 --- a/81_Splat/java/src/Splat.java +++ b/81_Splat/java/src/Splat.java @@ -91,7 +91,7 @@ public class Splat { private JumpResult executeJump(InitialJumpConditions initial, float chuteOpenTime) { JumpResult jump = new JumpResult(initial.getAltitude()); - for (float time = 0.0f; !jump.isSplat() && (time < chuteOpenTime); time += chuteOpenTime / 8) { + for (float time = 0.0f; time < chuteOpenTime; time += chuteOpenTime / 8) { if (!jump.hasReachedTerminalVelocity() && time > initial.getTimeOfTerminalAccelerationReached()) { jump.setReachedTerminalVelocity(); System.out.printf("TERMINAL VELOCITY REACHED AT T PLUS %f SECONDS.\n", initial.getTimeOfTerminalAccelerationReached());