Skip to content

Instantly share code, notes, and snippets.

@rgrinberg
Created August 25, 2013 18:22
Show Gist options
  • Save rgrinberg/6335412 to your computer and use it in GitHub Desktop.
Save rgrinberg/6335412 to your computer and use it in GitHub Desktop.
hangman using ruby fibers
#!/usr/bin/env ruby
require 'fiber'
require 'set'
def state full_word, revealed
all_letters = full_word.split('') - [' ']
hidden = all_letters.to_set - revealed
hidden.inject(full_word) {|acc, e| acc.gsub e, '_' }
end
game = Fiber.new do |fiber, word|
all_letters = word.split('').to_set - [' ']
guessed_letters = Set.new
loop do
puts "--> #{state word, guessed_letters}"
input = Fiber.yield
if input.size > 1
if input == word
break
else
fiber.resume :incorrect
end
elsif input.size == 1
if all_letters.member? input
guessed_letters << input
if guessed_letters == all_letters
break
else
fiber.resume :correct
end
else
fiber.resume :incorrect
end
end
end
fiber.resume :completed
end
result = Fiber.new do
loop do
case Fiber.yield
when :incorrect
puts "Guess incorrect"
when :correct
puts "Guess is correct"
when :completed
puts "finished puzzle"
else
puts "unknown response"
end
end
end
result.resume
game.resume result, "testing"
loop do
print '> '
if game.alive?
game.resume gets.chomp
else
puts "Finished."
break
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment