Sha256: 250049ed59a066d589f4d11d085fda422f0fc806778a4a346daf1ce5d20866ee

Contents?: true

Size: 1.63 KB

Versions: 1

Compression:

Stored size: 1.63 KB

Contents

module AlexCodebreaker
  class Game
    include AlexCodebreaker::Modules::ArgumentsValidation
    FILENAME_EXTENSION = '.yml'.freeze

    attr_reader :secret_code, :session, :game_id

    def initialize(outer_id: nil)
      @game_id = outer_id if outer_id
      @secret_code = AlexCodebreaker::SecretCodeGenerator.new.secret_code
      @secret_code_for_hint = @secret_code.clone.uniq
      @session = Session.new
      save_game
    end

    def hint
      return unless @session.check_hints

      process_hint
    end

    def guess(user_input)
      return unless guess_validation(user_input) && @session.check_attempts

      save_game
      compare_codes(user_input)
    end

    private

    def process_hint
      hint = if @secret_code_for_hint.one?
               @secret_code_for_hint.first
             else
               @secret_code_for_hint.delete(@secret_code_for_hint.sample)
             end
      save_game
      hint
    end

    def compare_codes(user_input)
      user_input = format_user_input(user_input)
      comparison = Comparison.new(user_input, @secret_code.clone)
      comparison.response
    end

    def format_user_input(user_input)
      user_input.chars.map(&:to_i)
    end

    def save_game
      @game_id ||= AlexCodebreaker::IDGenerator.new.unique_id
      unless File.directory?(AlexCodebreaker.configuration.games_folder_path)
        FileUtils.mkdir_p(AlexCodebreaker.configuration.games_folder_path)
      end
      File.open(save_game_path, 'w') { |file| file.write(to_yaml) }
    end

    def save_game_path
      "#{AlexCodebreaker.configuration.games_folder_path}#{@game_id}#{FILENAME_EXTENSION}"
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
alex_codebreaker-0.1.13 lib/alex_codebreaker/game.rb