diff --git a/44_Hangman/ruby/hangman.rb b/44_Hangman/ruby/hangman.rb new file mode 100644 index 00000000..85255785 --- /dev/null +++ b/44_Hangman/ruby/hangman.rb @@ -0,0 +1,280 @@ +class Canvas + BUFFER = [] + def initialize width = 12, height = 12, fill = " " + for i in (0...height) do + line = [] + for i in (0...width) do + line << "" + end + BUFFER << line + end + + clear + end + + def render + lines = [] + for line in BUFFER do + lines << line.join("") + end + + return lines.join("\n") + end + + def put s, x, y + BUFFER[y][x] = s[0] + end + + private + def clear fill = " " + for row in BUFFER do + for x in (0...(row.length)) do + row[x] = fill + end + end + end +end + +def init_gallows canvas + for i in (0...12) do + canvas.put("X", 0, i) + end + + for i in (0...7) do + canvas.put("X", i, 0) + end + + canvas.put("X", 6, 1) +end + +def draw_head canvas + canvas.put("-", 5, 2) + canvas.put("-", 6, 2) + canvas.put("-", 7, 2) + canvas.put("(", 4, 3) + canvas.put(".", 5, 3) + canvas.put(".", 7, 3) + canvas.put(")", 8, 3) + canvas.put("-", 5, 4) + canvas.put("-", 6, 4) + canvas.put("-", 7, 4) +end + +def draw_body canvas + for i in (5...9) do + canvas.put("X", 6, i) + end +end + +def draw_right_arm canvas + for i in (3...8) do + canvas.put("\\", i - 1, i) + end +end + +def draw_left_arm canvas + canvas.put("/", 10, 3) + canvas.put("/", 9, 4) + canvas.put("/", 8, 5) + canvas.put("/", 7, 6) +end + +def draw_right_leg canvas + canvas.put("/", 5, 9) + canvas.put("/", 4, 10) +end + +def draw_left_leg canvas + canvas.put("\\", 7, 9) + canvas.put("\\", 8, 10) +end + +def draw_left_hand canvas + canvas.put("\\", 10, 2) +end + +def draw_right_hand canvas + canvas.put("/", 2, 2) +end + +def draw_left_foot canvas + canvas.put("\\", 9, 11) + canvas.put("-", 10, 11) +end + +def draw_right_foot canvas + canvas.put("-", 2, 11) + canvas.put("/", 3, 11) +end + +PHASES = [ + ["First, we draw a head", 'draw_head'], + ["Now we draw a body.", 'draw_body'], + ["Next we draw an arm.", 'draw_right_arm'], + ["this time it's the other arm.", 'draw_left_arm'], + ["Now, let's draw the right leg.", 'draw_right_leg'], + ["This time we draw the left leg.", 'draw_left_leg'], + ["Now we put up a hand.", 'draw_left_hand'], + ["Next the other hand.", 'draw_right_hand'], + ["Now we draw one foot", 'draw_left_foot'], + ["Here's the other foot -- you're hung!!", 'draw_right_foot'], +] + +WORDS = [ + "GUM", + "SIN", + "FOR", + "CRY", + "LUG", + "BYE", + "FLY", + "UGLY", + "EACH", + "FROM", + "WORK", + "TALK", + "WITH", + "SELF", + "PIZZA", + "THING", + "FEIGN", + "FIEND", + "ELBOW", + "FAULT", + "DIRTY", + "BUDGET", + "SPIRIT", + "QUAINT", + "MAIDEN", + "ESCORT", + "PICKAX", + "EXAMPLE", + "TENSION", + "QUININE", + "KIDNEY", + "REPLICA", + "SLEEPER", + "TRIANGLE", + "KANGAROO", + "MAHOGANY", + "SERGEANT", + "SEQUENCE", + "MOUSTACHE", + "DANGEROUS", + "SCIENTIST", + "DIFFERENT", + "QUIESCENT", + "MAGISTRATE", + "ERRONEOUSLY", + "LOUDSPEAKER", + "PHYTOTOXIC", + "MATRIMONIAL", + "PARASYMPATHOMIMETIC", + "THIGMOTROPISM", +] + +def play_game guess_target + wrong_guesses = 0 + guess_progress = ["-"] * guess_target.length + guess_list = [] + + gallows = Canvas.new + init_gallows(gallows) + + guess_count = 0 + while true + puts "Here are the letters you used:" + puts "#{guess_list.join(",")}\n" + puts "#{guess_progress.join("")}\n" + + guess_letter = "" + guess_word = "" + while guess_letter == "" + print "What is your guess? " + guess_letter = gets.chomp!.upcase[0] + if !guess_letter.match?(/[[:alpha:]]/) + guess_letter = "" + puts "Only letters are allowed!" + elsif guess_list.include?(guess_letter) + guess_letter = "" + puts "You guessed that letter before!" + end + end + + guess_list << guess_letter + guess_count += 1 + + if guess_target.include?(guess_letter) + indices = (0...guess_target.length).find_all { |i| guess_target[i,1] == guess_letter } + + for i in indices do + guess_progress[i] = guess_letter + end + + if guess_progress.join("") == guess_target + puts "You found the word!" + break + else + puts "\n#{guess_progress.join("")}\n" + + while guess_word == "" + print "What is your guess for the word? " + guess_word = gets.chomp!.upcase + if !guess_word.match?(/[[:alpha:]]/) + guess_word = "" + puts "Only words are allowed!" + end + end + + if guess_word == guess_target + puts "Right!! It took you #{guess_count} guesses!" + break + end + end + else + comment, draw_bodypart = PHASES[wrong_guesses] + + puts comment + method(draw_bodypart).call(gallows) + puts gallows.render() + + wrong_guesses += 1 + puts "Sorry, that letter isn't in the word." + + if wrong_guesses == 10 + puts "Sorry, you lose. The word was #{guess_target}" + break + end + end + end +end + + +def main + puts "#{(" " * 32)}HANGMAN" + + shuffled = WORDS.shuffle(random: Random.new(1)) + current_word = 0 + word_count = shuffled.length + + keep_playing = true + while keep_playing + + play_game(WORDS[current_word]) + current_word += 1 + + if current_word == word_count + puts "You did all the words!!" + keep_playing = false + else + print "Want another word? (yes or no) " + a = gets.chomp!.upcase + keep_playing = true if a == 'Y' || a == 'y' || a == 'Yes' || a == 'YES' || a == 'yes' + end + end + puts "It's been fun! Bye for now." +end + +if __FILE__ == $0 + main +end \ No newline at end of file