require 'terminal-table'
require_relative 'bingo_checker'
class BingoBoard
attr_reader :bingo_board
LETTERS = %w(B I N G O)
def initialize
@bingo_board = (1..75).each_slice(15).each_with_object([]) do |range, board|
board << range.sample(5)
end
@pool = LETTERS.zip((1..75).each_slice(15)).to_h
end
def play
call.tap do |letter_number|
puts "CALL: #{letter_number}\n\n"
update(letter_number.first, letter_number.last)
end
end
def to_s
table = Terminal::Table.new :headings => LETTERS, :rows => bingo_board.transpose
"" << table.to_s
end
private
def call
return "not a winner" if @pool.values.all?(&:empty?)
puts "POOL: #{@pool}"
letter = LETTERS.sample
@pool[letter].length > 0 ? Array[letter, @pool[letter].shuffle!.pop] : call
end
def update(call_letter, call_number)
bingo_board[LETTERS.index(call_letter)].map! {|square| square == call_number ? 'X' : square}
end
end
card = BingoBoard.new
until !card.play || BingoChecker.new(card.bingo_board).check_board do
card.play
puts card
end