Sha256: cbf5828e5d8fe7fc8f6c86b63502577a24ce94b5cb4d4cc0d2ae72e94c3308e8

Contents?: true

Size: 1.5 KB

Versions: 2

Compression:

Stored size: 1.5 KB

Contents

# frozen_string_literal: true

module Codebreaker
  class Game
    GUESS_PRESENCE = '-'
    GUESS_PLACE = '+'

    attr_reader :secret_code, :attempts_counter, :hinted_numbers, :current_difficulty

    def initialize(difficulty)
      @secret_code = create_secret_code
      @attempts_counter = 0
      @current_difficulty = difficulty.level
      @hinted_numbers = @secret_code.sample(@current_difficulty[:hints])
    end

    def check_number_match(guess)
      @guess = guess
      @attempts_counter += 1
      return win_string if @guess == @secret_code

      number_match(exact_match)
    end

    def take_hint
      @hinted_numbers.pop
    end

    def win?(string)
      string == win_string
    end

    def lose?
      @attempts_counter >= @current_difficulty[:attempts]
    end

    private

    def win_string
      GUESS_PLACE * Guess::VALID_GUESS_LENGTH
    end

    def create_secret_code
      Array.new(4) { rand(0..6) }
    end

    def exact_match
      array = @secret_code.dup
      array.map.with_index do |_char, index|
        next unless array[index] == @guess[index]

        @guess[index] = nil
        GUESS_PLACE
      end.compact
    end

    def number_match(pluses)
      code = @secret_code.map.with_index { |char, index| char if @guess[index] }.compact
      @guess.compact!
      code.map.with_index do |_char, index|
        if code.include? @guess[index]
          code[code.index(@guess[index])] = nil
          pluses << GUESS_PRESENCE
        end
      end
      pluses.join
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
codebreaker_gapdn-0.1.5 lib/codebreaker_gapdn/game.rb
codebreaker_gapdn-0.1.3 lib/codebreaker_gapdn/game.rb