class WordSearch::Generator::Base

Attributes

plane[RW]
positions[RW]
used_coordinates[RW]
word_bank[RW]

Public Class Methods

new(plane, word_bank) click to toggle source
# File lib/word_search/generator/base.rb, line 15
def initialize(plane, word_bank)
  @plane = plane
  @word_bank = word_bank
  @used_coordinates = []
  @positions = {}
end

Public Instance Methods

directions() click to toggle source
# File lib/word_search/generator/base.rb, line 11
def directions
  raise NotImplementedError
end
perform() click to toggle source
# File lib/word_search/generator/base.rb, line 22
def perform
  word_bank.each do |word|
    @positions[word] = place_word(word)
  end
end

Private Instance Methods

place_word(word) click to toggle source
# File lib/word_search/generator/base.rb, line 30
def place_word(word)
  placed = false
  until placed || used_coordinates.uniq.count == plane.total_points
    placed = position_word(word)
  end

  word_bank.errors.add(word, "cannot be placed") if placed.blank?
  placed
end
position_word(word) click to toggle source
# File lib/word_search/generator/base.rb, line 40
def position_word(word)
  used_coordinates << (coordinate = random_point)
  position = false

  directions.find do |direction|
    dimension = plane.two_dimensional? ? TwoDimensional : ThreeDimensional
    position =
      dimension::PositionWord.new(
        plane, word, direction, coordinate
      ).perform
  end

  position
end
random(number) click to toggle source
# File lib/word_search/generator/base.rb, line 55
def random(number)
  SecureRandom.random_number number
end
random_point() click to toggle source
# File lib/word_search/generator/base.rb, line 59
def random_point
  raise NotImplementedError
end