diff --git a/82_Stars/ruby/stars.rb b/82_Stars/ruby/stars.rb new file mode 100644 index 00000000..d6b31e8a --- /dev/null +++ b/82_Stars/ruby/stars.rb @@ -0,0 +1,90 @@ +class Stars + MAX_NUM = 100 + MAX_GUESSES = 7 + + def start + print "Do you want instructions? (Y/N) " + response = gets.chomp! + + if response.upcase[0] == "Y" + print_instructions() + end + + still_playing = true + while still_playing + secret_number = rand(1..MAX_NUM) + puts "\n\nOK, I am thinking of a number, start guessing." + + guess_number = 0 + player_has_won = false + + while (guess_number < MAX_GUESSES) and not player_has_won + puts "\n" + guess = get_guess() + guess_number += 1 + + if guess == secret_number + player_has_won = true + puts "**************************************************!!!" + puts "You got it in #{guess_number} guesses!!!\n\n" + else + print_stars(secret_number, guess) + end + end + + if not player_has_won + puts "\nSorry, that's #{guess_number} guesses, number was #{secret_number}\n" + end + + print "Play again? (Y/N) " + response = gets.chomp! + + if response.upcase[0] != "Y" + still_playing = false + end + + end + end + + private + def print_instructions + puts "I am thinking of a whole number from 1 to #{MAX_NUM}" + puts "Try to guess my number. After you guess, I" + puts "will type one or more stars (*). The more" + puts "stars I type, the closer you are to my number." + puts "one star (*) means far away, seven stars (*******)" + puts "means really close! You get #{MAX_GUESSES} guesses." + end + + def get_guess + valid_response = false + while not valid_response + print "Your guess? " + guess = gets.chomp! + + if guess.match?(/[[:digit:]]/) + valid_response = true + guess = guess.to_i + end + end + + return guess + end + + def print_stars secret_number, guess + diff = (guess - secret_number).abs + stars = "" + for i in 0..7 + if diff < 2**i + stars += "*" + end + end + print(stars) + end +end + + +if __FILE__ == $0 + stars = Stars.new + stars.start() +end \ No newline at end of file