mirror of
https://github.com/coding-horror/basic-computer-games.git
synced 2025-12-22 07:10:42 -08:00
132 lines
3.7 KiB
Ruby
132 lines
3.7 KiB
Ruby
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
|
|
|