Sha256: 1c90794ff9ebb641dfb268b4ce8ebf7c649a2fe1333c21f25c3a3491c7e039ca

Contents?: true

Size: 1.35 KB

Versions: 1

Compression:

Stored size: 1.35 KB

Contents

require_relative '../constants'
require_relative 'user'
require_relative 'difficulty'
require 'date'
module CodebreakerKarolina
  class Game
    include CodebreakerConstants
    attr_accessor :user, :difficulty
    attr_reader :secret_code, :date

    def start
      @date = DateTime.now
      @secret_code = generate_code.freeze
      @hint = @secret_code.chars.uniq
    end

    def compare_code(guess)
      comparison_result(@secret_code.chars, guess.chars)
    end

    def win?(guess)
      @user.used_attempts += 1
      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

    def valid_code?(code)
      !!code[/\A[1-6]{4}\z/]
    end

    private

    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

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
codebreaker_karolina-0.1.9 lib/modules/game.rb