Sha256: b2d6566a420c30647a27157fd6e0c88348b129def0e91e032eb1f7dcb7d90dcc

Contents?: true

Size: 1.48 KB

Versions: 1

Compression:

Stored size: 1.48 KB

Contents

  # frozen_string_literal: true
  
module Codebreaker

  class Game
    DIFFICULTIES = {
      easy: { attempts: 30, hints: 3 },
      medium: { attempts: 15, hints: 2 },
      hard: { attempts: 10, hints: 1 }
    }.freeze

    attr_reader :attempts, :hints, :secret_code
    attr_accessor :user_code

    def initialize(difficulty)
      @secret_code = Array.new(4) { rand(1..6) }
      @attempts = DIFFICULTIES.dig(difficulty, :attempts)
      @hints = secret_code.shuffle.take(DIFFICULTIES.dig(difficulty, :hints))
    end

    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

    def valid_answer?(user_answer)
      user_answer =~ /^[1-6]{4}$/
    end

    def take_a_hint!
      @hints.pop
    end

    def equal_codes?(user_answer)
      secret_code.join == user_answer
    end

    private

    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

    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
  end

end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
codebreaker_Bavykin-0.1.1 lib/codebreaker/game.rb