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)