class Codebreaker::Game

Constants

DIFFICULTIES

Attributes

attempts[R]
hints[R]
secret_code[R]
user_code[RW]

Public Class Methods

generate_game_data(difficulty = :easy) click to toggle source
# File lib/codebreaker/game.rb, line 21
def self.generate_game_data(difficulty = :easy)
  data = Hash.new(Array.new(4) { rand(1..6) })
  data[:attempts] = DIFFICULTIES.dig(difficulty, :attempts)
  data[:hints] = data.default.shuffle.take(DIFFICULTIES.dig(difficulty, :hints))
  data
end
new(secret_code, attempts, hints) click to toggle source
# File lib/codebreaker/game.rb, line 15
def initialize(secret_code, attempts, hints)
  @secret_code = secret_code
  @attempts = attempts
  @hints = hints
end

Public Instance Methods

equal_codes?(user_answer) click to toggle source
# File lib/codebreaker/game.rb, line 43
def equal_codes?(user_answer)
  secret_code.join == user_answer
end
handle_guess(user_answer) click to toggle source
# File lib/codebreaker/game.rb, line 28
def handle_guess(user_answer)
  @user_code = user_answer.each_char.map(&:to_i)
  handle_numbers
  @attempts -= 1
  @round_result.empty? ? 'No matches' : @round_result
end
take_a_hint!() click to toggle source
# File lib/codebreaker/game.rb, line 39
def take_a_hint!
  @hints.pop
end
valid_answer?(user_answer) click to toggle source
# File lib/codebreaker/game.rb, line 35
def valid_answer?(user_answer)
  user_answer =~ /^[1-6]{4}$/
end

Private Instance Methods

check_numbers_for_correct_position() click to toggle source
# File lib/codebreaker/game.rb, line 49
def check_numbers_for_correct_position
  secret_code.map.with_index do |element, index|
    next element unless element == user_code[index]
    user_code[index] = nil
  end
end
handle_numbers() click to toggle source
# File lib/codebreaker/game.rb, line 56
def handle_numbers
  uncatched_numbers = check_numbers_for_correct_position
  @round_result = '+' * uncatched_numbers.select(&:nil?).size
  user_code.compact.map do |number|
    next unless uncatched_numbers.compact.include?(number)
    @round_result += '-'
    uncatched_numbers[uncatched_numbers.index(number)] = nil
  end
end