lib/alex_codebreaker/game.rb in alex_codebreaker-0.1.13 vs lib/alex_codebreaker/game.rb in alex_codebreaker-0.2.0

- old
+ new

@@ -1,52 +1,71 @@ module AlexCodebreaker class Game include AlexCodebreaker::Modules::ArgumentsValidation FILENAME_EXTENSION = '.yml'.freeze + STATUS = { in_game: :in_game, win: :win, lose: :lose }.freeze - attr_reader :secret_code, :session, :game_id + attr_reader :secret_code, :session, :game_id, :status, :used_hints, :current_comparison 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 + @used_hints = [] + @status = STATUS[:in_game] save_game end + def add_name(name) + save_game if @session.add_name(name) + end + + def add_difficulty(difficulty) + save_game if @session.add_difficulty(difficulty) + end + def hint return unless @session.check_hints process_hint + save_game end def guess(user_input) - return unless guess_validation(user_input) && @session.check_attempts + return unless guess_validation(user_input) - save_game compare_codes(user_input) + check_win_lose + save_game 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 + @used_hints << hint end def compare_codes(user_input) user_input = format_user_input(user_input) comparison = Comparison.new(user_input, @secret_code.clone) - comparison.response + @current_comparison = comparison.response end def format_user_input(user_input) user_input.chars.map(&:to_i) + end + + def check_win_lose + checking_result = @session.check_attempts + return @status = STATUS[:win] if @current_comparison == AlexCodebreaker::Modules::Settings::WIN_COMPARISON + + @status = STATUS[:lose] unless checking_result end def save_game @game_id ||= AlexCodebreaker::IDGenerator.new.unique_id unless File.directory?(AlexCodebreaker.configuration.games_folder_path)