require_relative '../constants' require_relative 'user' require_relative 'difficulty' module CodebreakerKarolina class Game include CodebreakerConstants attr_accessor :user, :difficulty attr_reader :secret_code def start @secret_code = generate_code.freeze @hint = @secret_code.chars.uniq end def compare_code(guess) return unless valid_code?(guess) @user.used_attempts += 1 comparison_result(@secret_code.chars, guess.chars) end def win?(guess) return true if @secret_code == guess false end def lose? return true if @user.used_attempts >= @difficulty.attempts false end def hint return unless hints_left? @user.used_hints += 1 @hint.shuffle!.pop end private def valid_code?(code) !!code[/\A[1-6]{4}\z/] end def generate_code Array.new(CODE_SIZE) { rand(NUM_RANGE) }.join end def comparison_result(secret_code, user_code) result = '' user_code.each_with_index do |num, index| next unless secret_code.include? num result += num == secret_code[index] ? PLUS : MINUS secret_code[secret_code.index(num)] = nil end result.chars.sort.join end def hints_left? return true if @difficulty.hints > @user.used_hints false end end end