diff --git a/51 Hurkle/ruby/hurkle.rb b/51 Hurkle/ruby/hurkle.rb new file mode 100644 index 00000000..39898805 --- /dev/null +++ b/51 Hurkle/ruby/hurkle.rb @@ -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