Class: TypingTrainer::LevelGenerator

Inherits:
Object
  • Object
show all
Defined in:
lib/typing_trainer/level_generator.rb

Constant Summary collapse

SENCENCES_PER_LEVEL =
3
WORDS_PER_SENTENCE =
8

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(letters) ⇒ LevelGenerator

Returns a new instance of LevelGenerator.



25
26
27
28
29
# File 'lib/typing_trainer/level_generator.rb', line 25

def initialize(letters)
  @letters = letters.split(//)
  @level_pattern = /^[#{letters}]+$/
  @words = initialize_words
end

Class Method Details

.generate(level: nil, letters: nil, layout: nil) ⇒ Object



10
11
12
13
14
15
16
17
18
19
20
21
22
23
# File 'lib/typing_trainer/level_generator.rb', line 10

def self.generate(level: nil, letters: nil, layout: nil)
  throw "You need to specify a layout" unless layout
  throw "No level or letters were provided to generate a Game level :(" unless level || letters
  
  layouts = TypingTrainer::KeyboardLayout::LAYOUTS

  layout_letters = layouts[layout]::LETTER_PROGRESSION
  if letters
    letters = letters.join('').downcase
  end
  letters ||= layout_letters.slice(0, level)
  sentences = self.new(letters).generate_sentences(SENCENCES_PER_LEVEL)
  TypingTrainer::Level.new(number: level, letters: letters, sentences: sentences, layout: layout)
end

Instance Method Details

#generate_sentences(count) ⇒ Object



39
40
41
42
43
44
45
# File 'lib/typing_trainer/level_generator.rb', line 39

def generate_sentences(count)
  sentences = []
  count.times {
    sentences << @words.sample(WORDS_PER_SENTENCE).join(' ') + ' '
  }
  sentences
end

#generate_wordObject



47
48
49
# File 'lib/typing_trainer/level_generator.rb', line 47

def generate_word
  (@letters * 10).sample(rand(5) + 1).join('')
end

#initialize_wordsObject



31
32
33
34
35
36
37
# File 'lib/typing_trainer/level_generator.rb', line 31

def initialize_words
  words = ContemporaryWords.all.filter { |word| @level_pattern.match?(word) }
  while words.size < WORDS_PER_SENTENCE
    words << self.generate_word
  end
  words
end