ビンゴカードプログラム作成してみた(Ruby)

class Number
  def dimentional_number_array
    array_of_each_numbers = []
    array_of_each_numbers.push(select_five_numbers_in_B, select_five_numbers_in_I, select_five_numbers_in_N, select_five_numbers_in_G, select_five_numbers_in_O)
    array_of_each_numbers.transpose
  end

  private
  def select_five_numbers_in_B
    (1..15).to_a.sample(5)
  end

  def select_five_numbers_in_I
    (16..30).to_a.sample(5)
  end

  def select_five_numbers_in_N
    (31..45).to_a.sample(4).insert(2, ' ')
  end

  def select_five_numbers_in_G
    (46..60).to_a.sample(5)
  end

  def select_five_numbers_in_O
    (61..75).to_a.sample(5)
  end
end

class Bingo
  def initialize
    @dimentional_number_array = Number.new.dimentional_number_array
  end

  def create_card
    enumerate_in_a_low(bingo_words)
    @dimentional_number_array.each do |number_array|
      enumerate_in_a_low(number_array)
    end
  end

  private
  def bingo_words
    'BINGO'.split(//)
  end

  def enumerate_in_a_low(array)
    print ' '
    array.each do |e|
      print e.to_s.rjust(2)
      if e == array[4]
        puts
      else
        print ' | '
      end
    end
  end
end

Bingo.new.create_card
  • コンソール表示
~ % ruby bingo.rb
  B |  I |  N |  G |  O
 13 | 16 | 45 | 46 | 71
  8 | 19 | 44 | 60 | 68
  6 | 24 |    | 56 | 61
 15 | 22 | 34 | 49 | 63
  2 | 29 | 33 | 55 | 72
~ % ruby bingo.rb
  B |  I |  N |  G |  O
  5 | 22 | 32 | 46 | 62
  4 | 24 | 44 | 52 | 75
  2 | 26 |    | 50 | 73
 15 | 17 | 35 | 51 | 69
 12 | 20 | 40 | 55 | 65

オブジェクト指向実践ガイドを読んでいて、コードを書きたくなったので書いてみました。 実際に書くと難しいです。
悩んだ点は

  • クラスを分ける必要性
  • dimentional_number_arrayメソッドはどちらのクラスにおくべきか
  • Bingoクラスのコンストラクタで@dimentional_number_array = Number.new.dimentional_number_array(インスタンス変数)を作成したが、
    • メソッド内でローカル変数としてとるべきか
    • コンストラクタで引数でとるべきか まだまだなので、アウトプットすべし!