From 7c02b6647a8fdefc78a4804bf43f73c559595960 Mon Sep 17 00:00:00 2001 From: Anson VanDoren Date: Sun, 28 Feb 2021 17:41:47 -0800 Subject: [PATCH] adds Python implementation of 31 - Depth Charge --- 31 Depth Charge/python/depth_charge.py | 120 +++++++++++++++++++++++++ 1 file changed, 120 insertions(+) create mode 100644 31 Depth Charge/python/depth_charge.py diff --git a/31 Depth Charge/python/depth_charge.py b/31 Depth Charge/python/depth_charge.py new file mode 100644 index 00000000..f367962e --- /dev/null +++ b/31 Depth Charge/python/depth_charge.py @@ -0,0 +1,120 @@ +# Original BASIC version as published in Basic Computer Games (1978) +# https://www.atariarchives.org/basicgames/showpage.php?page=55 +# +# Converted to Python by Anson VanDoren in 2021 + +import math +import random + + +def show_welcome(): + # Clear screen. chr(27) is `Esc`, and the control sequence is + # initiated by Ctrl+[ + # `J` is "Erase in Display" and `2J` means clear the entire screen + print(chr(27) + "[2J") + + # Show the intro text, centered + print("DEPTH CHARGE".center(45)) + print("Creative Computing Morristown, New Jersey\n\n".center(45)) + + +def get_num_charges(): + print("Depth Charge game\n") + while True: + search_area = input("Dimensions of search area? ") + + # Make sure the input is an integer + try: + search_area = int(search_area) + break + except ValueError: + print("Must enter an integer number. Please try again...") + + num_charges = int(math.log2(search_area)) + 1 + return search_area, num_charges + + +def ask_for_new_game(): + answer = input("Another game (Y or N): ") + if answer.lower().strip()[0] == 'y': + start_new_game() + else: + print("OK. Hope you enjoyed yourself") + exit() + + +def show_shot_result(shot, location): + result = "Sonar reports shot was " + if shot[1] > location[1]: # y-direction + result += "north" + elif shot[1] < location[1]: # y-direction + result += "south" + if shot[0] > location[0]: # x-direction + result += "east" + elif shot[0] < location[0]: # x-direction + result += "west" + if shot[1] != location[1] or shot[0] != location[0]: + result += " and " + + if shot[2] > location[2]: + result += "too low." + elif shot[2] < location [2]: + result += "too high." + else: + result += "depth OK." + print(result) + return + + +def get_shot_input(): + while True: + raw_guess = input("Enter coordinates: ") + try: + x, y, z = raw_guess.split() + except ValueError: + print("Please enter coordinates separated by spaces") + print(f"Example: 3 2 1") + continue + try: + x, y, z = [int(num) for num in [x, y, z]] + return x, y, z + except ValueError: + print("Please enter whole numbers only") + + +def play_game(search_area, num_charges): + print("\nYou are the captain of the destroyer USS Computer.") + print("An enemy sub has been causing you trouble. Your") + print(f"mission is to destroy it. You have {num_charges} shots.") + print("Specify depth charge explosion point with a") + print("trio of numbers -- the first two are the") + print("surface coordinates; the third is the depth.") + print("\nGood luck!\n") + + # Generate position for submarine + a, b, c = [random.randint(0, search_area) for _ in range(3)] + + # Get inputs until win or lose + for i in range(num_charges): + print(f"\nTrial #{i+1}") + x, y, z = get_shot_input() + + if (x, y, z) == (a, b, c): + print(f"\nB O O M ! ! You found it in {i+1} tries!\n") + ask_for_new_game() + else: + show_shot_result((x, y, z), (a, b, c)) + + # out of shots + print("\nYou have been torpedoed! Abandon ship!") + print(f"The submarine was at {a} {b} {c}") + ask_for_new_game() + + +def start_new_game(): + search_area, num_charges = get_num_charges() + play_game(search_area, num_charges) + + +if __name__ == '__main__': + start_new_game()