mirror of
https://github.com/coding-horror/basic-computer-games.git
synced 2025-12-23 15:37:51 -08:00
Merge pull request #148 from jamiemccarthy/51-hurkle-ruby
Hurkle in Ruby
This commit is contained in:
95
51 Hurkle/ruby/hurkle.rb
Normal file
95
51 Hurkle/ruby/hurkle.rb
Normal file
@@ -0,0 +1,95 @@
|
|||||||
|
MAX_GUESSES = 5
|
||||||
|
GRID_SIZE = 10
|
||||||
|
|
||||||
|
class Point < Object
|
||||||
|
attr_accessor :x
|
||||||
|
attr_accessor :y
|
||||||
|
|
||||||
|
def initialize(text="")
|
||||||
|
x, y = text.split(",").map(&:strip)
|
||||||
|
@x = (x || rand(GRID_SIZE).floor).to_i
|
||||||
|
@y = (y || rand(GRID_SIZE).floor).to_i
|
||||||
|
end
|
||||||
|
|
||||||
|
def to_s
|
||||||
|
"#{@x}, #{@y}"
|
||||||
|
end
|
||||||
|
|
||||||
|
def ==(other_point)
|
||||||
|
@x == other_point.x && @y == other_point.y
|
||||||
|
end
|
||||||
|
|
||||||
|
def direction_to(other_point)
|
||||||
|
( @y < other_point.y ? "NORTH" : "SOUTH" unless @y == other_point.y ).to_s +
|
||||||
|
(@x < other_point.x ? "EAST" : "WEST" unless @x == other_point.x ).to_s
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def main
|
||||||
|
say_introduction
|
||||||
|
|
||||||
|
loop do
|
||||||
|
hurkle_point = Point.new
|
||||||
|
found = false
|
||||||
|
(1..MAX_GUESSES).each do |guess_num|
|
||||||
|
found = guess(hurkle_point, guess_num)
|
||||||
|
break if found
|
||||||
|
end
|
||||||
|
say_failure(hurkle_point) if not found
|
||||||
|
say_play_again
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
def say_introduction
|
||||||
|
puts " " * 33 + "HURKLE"
|
||||||
|
puts " " * 15 + "CREATIVE COMPUTING MORRISTOWN, NEW JERSEY"
|
||||||
|
3.times { puts }
|
||||||
|
puts
|
||||||
|
puts "A HURKLE IS HIDING ON A #{GRID_SIZE} BY #{GRID_SIZE} GRID. HOMEBASE"
|
||||||
|
puts "ON THE GRID IS POINT 0,0 IN THE SOUTHWEST CORNER,"
|
||||||
|
puts "AND ANY POINT ON THE GRID IS DESIGNATED BY A"
|
||||||
|
puts "PAIR OF WHOLE NUMBERS SEPERATED BY A COMMA. THE FIRST"
|
||||||
|
puts "NUMBER IS THE HORIZONTAL POSITION AND THE SECOND NUMBER"
|
||||||
|
puts "IS THE VERTICAL POSITION. YOU MUST TRY TO"
|
||||||
|
puts "GUESS THE HURKLE'S GRIDPOINT. YOU GET #{MAX_GUESSES} TRIES."
|
||||||
|
puts "AFTER EACH TRY, I WILL TELL YOU THE APPROXIMATE"
|
||||||
|
puts "DIRECTION TO GO TO LOOK FOR THE HURKLE."
|
||||||
|
puts
|
||||||
|
end
|
||||||
|
|
||||||
|
def guess(hurkle_point, guess_num)
|
||||||
|
print "GUESS # #{guess_num} ? "
|
||||||
|
guess_point = Point.new(gets.chomp)
|
||||||
|
if guess_point == hurkle_point
|
||||||
|
say_success(guess_num)
|
||||||
|
true
|
||||||
|
else
|
||||||
|
say_where_to_go(hurkle_point, guess_point)
|
||||||
|
false
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def say_success(guess_num)
|
||||||
|
puts
|
||||||
|
puts "YOU FOUND IT IN #{guess_num} GUESSES!"
|
||||||
|
end
|
||||||
|
|
||||||
|
def say_where_to_go(hurkle_point, guess_point)
|
||||||
|
puts "GO #{guess_point.direction_to(hurkle_point)}"
|
||||||
|
puts
|
||||||
|
end
|
||||||
|
|
||||||
|
def say_failure(hurkle_point)
|
||||||
|
puts
|
||||||
|
puts "SORRY, THAT'S " + MAX_GUESSES.to_s + " GUESSES."
|
||||||
|
puts "THE HURKLE IS AT #{hurkle_point}"
|
||||||
|
end
|
||||||
|
|
||||||
|
def say_play_again
|
||||||
|
puts
|
||||||
|
puts "LET'S PLAY AGAIN, HURKLE IS HIDING."
|
||||||
|
puts
|
||||||
|
end
|
||||||
|
|
||||||
|
main
|
||||||
Reference in New Issue
Block a user