From a00fbc037482d80bda14819d105d1c8e535735e1 Mon Sep 17 00:00:00 2001 From: Argie Bacomo Date: Mon, 4 Apr 2022 10:37:16 +0800 Subject: [PATCH] Orbit game in ruby --- 68_Orbit/ruby/orbit.rb | 132 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 132 insertions(+) create mode 100644 68_Orbit/ruby/orbit.rb diff --git a/68_Orbit/ruby/orbit.rb b/68_Orbit/ruby/orbit.rb new file mode 100644 index 00000000..cbf86b4d --- /dev/null +++ b/68_Orbit/ruby/orbit.rb @@ -0,0 +1,132 @@ +PAGE_WIDTH = 64 + +def print_centered(msg) + spaces = " " * ((PAGE_WIDTH / msg.length).fdiv(2)) + puts "#{spaces}#{msg}" +end + +def print_instructions + puts "SOMEWHERE ABOVE YOUR PLANET IS A ROMULAN SHIP. +THE SHIP IS IN A CONSTANT POLAR ORBIT. ITS +DISTANCE FROM THE CENTER OF YOUR PLANET IS FROM +10,000 TO 30,000 MILES AND AT ITS PRESENT VELOCITY CAN +CIRCLE YOUR PLANET ONCE EVERY 12 TO 36 HOURS. +UNFORTUNATELY, THEY ARE USING A CLOAKING DEVICE SO +YOU ARE UNABLE TO SEE THEM, BUT WITH A SPECIAL +INSTRUMENT YOU CAN TELL HOW NEAR THEIR SHIP YOUR +PHOTON BOMB EXPLODED. YOU HAVE SEVEN HOURS UNTIL THEY +HAVE BUILT UP SUFFICIENT POWER IN ORDER TO ESCAPE +YOUR PLANET'S GRAVITY. +YOUR PLANET HAS ENOUGH POWER TO FIRE ONE BOMB AN HOUR. +AT THE BEGINNING OF EACH HOUR YOU WILL BE ASKED TO GIVE AN +ANGLE (BETWEEN 0 AND 360) AND A DISTANCE IN UNITS OF +100 MILES (BETWEEN 100 AND 300), AFTER WHICH YOUR BOMB'S +DISTANCE FROM THE ENEMY SHIP WILL BE GIVEN. +AN EXPLOSION WITHIN 5,000 MILES OF THE ROMULAN SHIP +WILL DESTROY IT. +BELOW IS A DIAGRAM TO HELP YOU VISUALIZE YOUR PLIGHT. + 90 + 0000000000000 + 0000000000000000000 + 000000 000000 + 00000 00000 + 00000 XXXXXXXXXXX 00000 + 00000 XXXXXXXXXXXXX 00000 + 0000 XXXXXXXXXXXXXXX 0000 + 0000 XXXXXXXXXXXXXXXXX 0000 + 0000 XXXXXXXXXXXXXXXXXXX 0000 +180<== 00000 XXXXXXXXXXXXXXXXXXX 00000 ==>0 + 0000 XXXXXXXXXXXXXXXXXXX 0000 + 0000 XXXXXXXXXXXXXXXXX 0000 + 0000 XXXXXXXXXXXXXXX 0000 + 00000 XXXXXXXXXXXXX 00000 + 00000 XXXXXXXXXXX 00000 + 00000 00000 + 000000 000000 + 0000000000000000000 + 0000000000000 + 270 +X - YOUR PLANET +O - THE ORBIT OF THE ROMULAN SHIP +ON THE ABOVE DIAGRAM, THE ROMULAN SHIP IS CIRCLING +COUNTERCLOCKWISE AROUND YOUR PLANET. DON'T FORGET THAT +WITHOUT SUFFICIENT POWER THE ROMULAN SHIP'S ALTITUDE +AND ORBITAL RATE WILL REMAIN CONSTANT. +GOOD LUCK. THE FEDERATION IS COUNTING ON YOU. +" +end + + +def get_yes_or_no() + while true + response = gets.chomp!.upcase + if response == "YES" + return true + elsif response == "NO" + return false + else + print("PLEASE TYPE 'YES' OR 'NO'") + end + end +end + +def game_over(is_success) + if is_success + puts "YOU HAVE SUCCESSFULLY COMPLETED YOUR MISSION." + else + puts "YOU HAVE ALLOWED THE ROMULANS TO ESCAPE." + puts "ANOTHER ROMULAN SHIP HAS GONE INTO ORBIT." + puts "DO YOU WISH TO TRY TO DESTROY IT?" + return get_yes_or_no() + end +end + +def play_game + rom_angle = rand(1...360) + rom_distance = rand(100...301) + rom_angular_velocity = rand(10...31) + hour = 0 + while hour < 7 + hour += 1 + puts "\n\n" + puts "THIS IS HOUR #{hour}, AT WHAT ANGLE DO YOU WISH TO SEND" + puts "YOUR PHOTON BOMB?" + + bomb_angle = gets.chomp!.to_f + puts "HOW FAR OUT DO YOU WISH TO DETONATE IT?" + bomb_distance = gets.chomp!.to_f + puts "\n\n" + + rom_angle = (rom_angle + rom_angular_velocity) % 360 + angular_difference = rom_angle - bomb_angle + c = Math.sqrt(rom_distance**2 + bomb_distance**2 - 2 * rom_distance * bomb_distance * Math.cos(angular_difference * Math::PI / 180)) + + puts "YOUR PHOTON BOMB EXPLODED #{sprintf('%.4f', 5)}*10^2 MILES FROM THE" + puts "ROMULAN SHIP." + + if c <= 50 + # Destroyed the Romulan + return true + end + end + return false +end + +def main + print_centered "ORBIT" + + print_instructions() + + while true + success = play_game() + again = game_over(success) + if !again + return + end + end +end + +if __FILE__ == $0 + main +end + \ No newline at end of file