class Codebreaker::BLL::GameEngine

Constants

NUMBER_CONFIGURATION
WIN_CONDITION

Attributes

attempts[R]
hints[R]
secret_number[R]

Public Class Methods

new(**diffucult) click to toggle source
# File lib/codebreaker/bll/game_engine.rb, line 16
def initialize(**diffucult)
  @number_of_digits = NUMBER_CONFIGURATION[:length]
  @digits_range     = NUMBER_CONFIGURATION[:range]

  @hints            = diffucult[:hints]
  @attempts         = diffucult[:attempts]
  @diffucult_name   = diffucult[:name]

  @game_state = true

  @secret_number = generate_number(@number_of_digits, @digits_range)
end

Public Instance Methods

input(input) click to toggle source
# File lib/codebreaker/bll/game_engine.rb, line 29
def input(input)
  return unless @game_state
  
  return if hint?(input)

  return unless input_guess?(input.chars.map(&:to_i))

  form_result
end

Private Instance Methods

attemps_counter() click to toggle source
# File lib/codebreaker/bll/game_engine.rb, line 104
def attemps_counter
  if @attempts.zero?
    @game_state = false

    raise(NoAttamptsError, CLI::UI.fmt("{{x}} No atempts left. Secrete number was #{@secret_number.join}"))
  end

  @attempts -= 1
end
form_result() click to toggle source
# File lib/codebreaker/bll/game_engine.rb, line 67
def form_result
  @game_state = false

  { diffucult_name: @diffucult_name, attempts: @attempts, hints: @hints }
end
generate_number(digits, range) click to toggle source
# File lib/codebreaker/bll/game_engine.rb, line 114
def generate_number(digits, range)
  [].tap do |result_array|
    digits.times { result_array << Random.rand(range) }
  end
end
guess_number_valid?(guess_number) click to toggle source
# File lib/codebreaker/bll/game_engine.rb, line 120
def guess_number_valid?(guess_number)
  if guess_number.all? { |digit| @digits_range.include?(digit) } && guess_number.size == @number_of_digits
    true
  else
    p "`Guesse` should be in #{@digits_range} range & should`ve #{@number_of_digits} digits"

    false
  end
end
hint?(input) click to toggle source
# File lib/codebreaker/bll/game_engine.rb, line 53
def hint?(input)
  return false unless input == 'hint'

  if @hints.zero?
    puts CLI::UI.fmt '{{x}}All hints were used' 
  else  
    @hints -= 1

    puts CLI::UI.fmt "{{*}}#{@secret_number.sample}"
  end
  
  true
end
input_guess?(guess_number) click to toggle source
# File lib/codebreaker/bll/game_engine.rb, line 41
def input_guess?(guess_number)
  return unless guess_number_valid? guess_number

  attemps_counter

  metching!(guess_number).tap do |metching_result|
    puts metching_result

    return metching_result == WIN_CONDITION
  end
end
metching!(guess_number) click to toggle source
# File lib/codebreaker/bll/game_engine.rb, line 73
def metching!(guess_number)
  secret_number = @secret_number.clone

  [].tap do |result_array|
    result_array.concat perfect_metching!(guess_number, secret_number)
    result_array.concat partial_metching!(guess_number, secret_number)
  end.join
end
partial_metching!(guess_number, secret_number) click to toggle source
# File lib/codebreaker/bll/game_engine.rb, line 93
def partial_metching!(guess_number, secret_number)
  guess_number.compact!
  secret_number.compact!

  secret_number.each_with_object([]) do |digit, result_array|
    next unless guess_number.any?(digit)

    result_array << '-'
  end
end
perfect_metching!(guess_number, secret_number) click to toggle source
# File lib/codebreaker/bll/game_engine.rb, line 82
def perfect_metching!(guess_number, secret_number)
  @secret_number.each_with_index.each_with_object([]) do |(digit, index), result_array|
    next unless digit == guess_number[index]

    guess_number[index]  = nil
    secret_number[index] = nil

    result_array << '+'
  end
end