lib/codebreaker_first.rb in codebreaker_first-0.3.0 vs lib/codebreaker_first.rb in codebreaker_first-0.4.0

- old
+ new

@@ -1,89 +1,94 @@ -require 'json' -require_relative 'codebreaker_first/version' - -module Codebreaker - MAX_TRIES = 6 - - # Rubocop - class Game - attr_accessor :code, :user_tries, :game_result - - def initialize - @code = '' - @user_tries = 0 - end - - def start - 4.times do - @code << rand(1...6).to_s - end - end - - def check_code(input_code) - @user_tries += 1 - return loose if @user_tries >= MAX_TRIES - return win if input_code == @code - - validate_code input_code - - result = '' - - @code.chars.each.with_index do |char, index| - result << '+' if char == input_code[index] - - result << '-' unless char == input_code[index] - end - - result - end - - def win - @game_result = true - end - - def loose - @game_result = false - end - - def save_result(name) - raise Exception, 'To save, you must finish the game!' if @game_result.nil? - - Result.save name, @user_tries, @game_result - end - - def results - Result.results - end - - private - - def validate_code(code) - raise Exception unless code.is_a?(Numeric) || code.is_a?(String) - - code = code.to_s - - raise Exception, 'Code must contains 4 numbers from 1 to 6' unless code =~ /^[1-6]{4}$/ - end - end - - # Rubocop - class Result - SCORES_FILE = File.expand_path('scores.json', __dir__) - - def self.save(name, tries, result) - scores = results.to_a - - scores << { name: name, tries: tries, result: result } - - File.write SCORES_FILE, scores.to_json - - scores - end - - def self.results - file = File.read SCORES_FILE - - JSON.parse file - end - end -end +require 'json' +require_relative 'codebreaker_first/version' + +module Codebreaker + MAX_TRIES = 6 + + # Rubocop + class Game + attr_accessor :code, :user_tries, :game_result + + def initialize(code = '', user_tries = 0, game_result = nil) + @code = code + @user_tries = user_tries + @game_result = game_result + end + + def from_hash(data) + Game.new data['code'], data['user_tries'], data['game_result'] + end + + def start + 4.times do + @code << rand(1...6).to_s + end + end + + def check_code(input_code) + @user_tries += 1 + return loose if @user_tries >= MAX_TRIES + return win if input_code == @code + + validate_code input_code + + result = '' + + @code.chars.each.with_index do |char, index| + result << '+' if char == input_code[index] + + result << '-' unless char == input_code[index] + end + + result + end + + def win + @game_result = true + end + + def loose + @game_result = false + end + + def save_result(name) + raise Exception, 'To save, you must finish the game!' if @game_result.nil? + + Result.save name, @user_tries, @game_result + end + + def results + Result.results + end + + private + + def validate_code(code) + raise Exception unless code.is_a?(Numeric) || code.is_a?(String) + + code = code.to_s + + raise Exception, 'Code must contains 4 numbers from 1 to 6' unless code =~ /^[1-6]{4}$/ + end + end + + # Rubocop + class Result + SCORES_FILE = File.expand_path('scores.json', __dir__) + + def self.save(name, tries, result) + scores = results.to_a + + scores << { name: name, tries: tries, result: result } + + File.write SCORES_FILE, scores.to_json + + scores + end + + def self.results + file = File.read SCORES_FILE + + JSON.parse file + end + end +end