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