Skip to content

Instantly share code, notes, and snippets.

@grauwoelfchen
Created December 23, 2012 09:25
Show Gist options
  • Save grauwoelfchen/4362730 to your computer and use it in GitHub Desktop.
Save grauwoelfchen/4362730 to your computer and use it in GitHub Desktop.
#!/usr/bin/env ruby
# encoding: utf-8
require 'readline'
class Wheel
CR = "\r"
WHEEL = ["\\", "|", "/", "-"]
def initialize sec
@sec = sec
@index = 0
STDOUT.sync = true
end
def self.define_spin name
define_method name do
wheel = (name =~ /back/ ? WHEEL.reverse : WHEEL)
print wheel[(@index % 4)] + CR
@index += 1
sleep @sec
end
end
define_spin :forward
define_spin :backward
end
class Bingo
def initialize(range=nil)
@prng = nil
@done = []
@range = (range || (1..100))
@candidates = (@range).to_a
end
def start
now = Time.now
puts "Start: #{now}"
started_at = now.to_i
@prng = Random.new(started_at)
begin
while action = Readline.readline("Bingo> ")
case action
when 'quit','q' ; break
when 'done','d' ; done
when 'help','h' ; help
when 'next','n',''; handle
when 'count','c' ; count
end
break if @candidates.empty?
end
rescue Interrupt # C-c
system("stty", `stty -g`.chomp)
puts
exit
end
finished = Time.now
puts "End: #{finished} (#{finished.to_i - started_at} sec.)"
end
def count
puts "Count: #{@done.length}"
end
def done
p @done
end
def help
puts <<HELP
Action:
next, n, Puts next number [Enter]
quit, q Quit the game
help, h Show this message
done, d Puts called numbers
HELP
end
private
def handle
w = Wheel.new(0.03)
loop do
10.times{ w.forward }
number = @prng.rand(@range).to_i
unless @done.include?(number)
@done << @candidates.delete(number)
puts "Number: #{number}"
break
end
end
end
end
if $0 == __FILE__
w = Wheel.new(0.03)
10.times{ w.backward }
puts <<BANNER
Bingo !!!
BANNER
bingo = Bingo.new
bingo.help
bingo.start
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment