mirror of
https://github.com/coding-horror/basic-computer-games.git
synced 2025-12-22 07:10:42 -08:00
ruby version of 92_Trap
This commit is contained in:
101
92_Trap/ruby/trab.rb
Normal file
101
92_Trap/ruby/trab.rb
Normal file
@@ -0,0 +1,101 @@
|
||||
#!/usr/bin/env ruby
|
||||
|
||||
# Trap
|
||||
# Steve Ullman, 1972-08-01
|
||||
# Ruby version Glenn Vanderburg, 2022-03-04
|
||||
|
||||
# Change these values to make the game easier or harder.
|
||||
GUESSES_PER_GAME = 6
|
||||
NUMBER_UPPER_BOUND = 100
|
||||
|
||||
# Put everything in methods for order of presentation; we
|
||||
# want to be able to refer to methods before declaring them,
|
||||
# so the code reads nicely from top to bottom.
|
||||
def main
|
||||
print_banner
|
||||
print_instructions
|
||||
|
||||
loop do
|
||||
play_a_game
|
||||
break unless yes?("\nTry again?")
|
||||
end
|
||||
end
|
||||
|
||||
def print_banner
|
||||
banner = "Creative Computing -- Morristown, New Jersey"
|
||||
|
||||
puts "Trap!".center(banner.size)
|
||||
puts banner
|
||||
3.times { puts }
|
||||
end
|
||||
|
||||
def print_instructions
|
||||
return unless yes?("Instructions?")
|
||||
|
||||
puts <<~"END"
|
||||
I am thinking of a number between 1 and #{NUMBER_UPPER_BOUND}.
|
||||
Try to guess my numbrer. On each guess,
|
||||
you are to enter 2 numbers, trying to trap
|
||||
my number between the two numbers. I will
|
||||
tell you if you have trapped my number, if my
|
||||
number is larger than your two numbers, or if
|
||||
my number is smaller than your two numbers.
|
||||
If you want to guess one single number, type
|
||||
your guess for both your trap numbers.
|
||||
You get #{GUESSES_PER_GAME} guesses to get my number.
|
||||
END
|
||||
end
|
||||
|
||||
def play_a_game
|
||||
n = choose_number
|
||||
|
||||
GUESSES_PER_GAME.times do |i|
|
||||
lower, upper = get_guesses("Guess ##{i+1}?")
|
||||
|
||||
case
|
||||
when lower == upper && lower == n
|
||||
puts "You got it!!!"
|
||||
return
|
||||
when n < lower
|
||||
puts "My number is smaller than your trap numbers."
|
||||
when n > upper
|
||||
puts "My number is larger than your trap numbers."
|
||||
else
|
||||
puts "You have trapped my number"
|
||||
end
|
||||
end
|
||||
|
||||
puts "Sorry, that's #{GUESSES_PER_GAME} guesses. Number was #{n}"
|
||||
end
|
||||
|
||||
def choose_number
|
||||
rand(NUMBER_UPPER_BOUND) + 1
|
||||
end
|
||||
|
||||
def get_guesses(prompt)
|
||||
loop do
|
||||
print "\n#{prompt} "
|
||||
|
||||
# This is forgiving of input format; it ignores spaces and
|
||||
# punctuation, returning only the strings of consecutive
|
||||
# digits in the input line.
|
||||
guesses = gets.scan(/\d+/)
|
||||
|
||||
if guesses.size != 2
|
||||
puts "Please enter two numbers for each guess."
|
||||
else
|
||||
# convert the strings of digits to integers:
|
||||
numbers = guesses.map(&:to_i)
|
||||
# and return them, lowest number first:
|
||||
return numbers.sort
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def yes?(prompt)
|
||||
print "#{prompt} "
|
||||
answer = gets
|
||||
return answer.downcase.start_with?("y")
|
||||
end
|
||||
|
||||
main
|
||||
Reference in New Issue
Block a user