class Codebreaker::Console

Constants

DEMO
EMPTY_INPUT
HINT
YES

Attributes

game[R]
scores[R]

Public Class Methods

new(game = DEMO) click to toggle source
# File lib/codebreaker/console.rb, line 18
def initialize(game = DEMO)
  @locale = Localization.new(:console)
  load_console(game)
  start_game if game == DEMO
end

Public Instance Methods

erase_scores() click to toggle source
# File lib/codebreaker/console.rb, line 30
def erase_scores
  print message['alerts']['erase_scores']
  erase_game_data if input_selector
  exit_console
end
start_game() click to toggle source
# File lib/codebreaker/console.rb, line 24
def start_game
  puts message['alerts']['welcome'].colorize(background: :blue)
  puts message['alerts']['hint_info']
  submit_answer
end

Private Instance Methods

erase_game_data() click to toggle source
# File lib/codebreaker/console.rb, line 144
def erase_game_data
  begin
    erase_data_file
    scores.clear
    puts message['info']['successfully_erased'].green
  rescue
    puts message['errors']['file_not_found'].red
  end
end
exit_console() click to toggle source
# File lib/codebreaker/console.rb, line 132
def exit_console
  exit
end
finish_game() click to toggle source
# File lib/codebreaker/console.rb, line 94
def finish_game
  puts ERB.new(message['info']['results']).result(binding)
  save_game
  new_game
end
input_selector() click to toggle source
# File lib/codebreaker/console.rb, line 100
def input_selector
  input = EMPTY_INPUT
  until %w[y n].include?(input)
    print " (y/n) #{message['alerts']['yes_or_no']}:"
    input = gets.chomp
  end
  input == YES
end
load_console(game) click to toggle source
# File lib/codebreaker/console.rb, line 40
def load_console(game)
  raise ArgumentError, message['errors']['wrong_object'] unless game.is_a?(Game)
  @game = game
  @locale.lang = game.configuration.lang
  @game_config_snapshot = game.configuration.clone
  apply_external_path
  @scores = load_game_data
end
load_new_game() click to toggle source
# File lib/codebreaker/console.rb, line 136
def load_new_game
  @game = Game.new do |config|
    @game_config_snapshot.each_pair do |key, value|
      config[key] = value
    end
  end
end
new_game() click to toggle source
# File lib/codebreaker/console.rb, line 121
def new_game
  print message['alerts']['new_game']
  if input_selector
    load_new_game
    start_game
  else
    puts message['alerts']['shutdown']
    exit_console
  end
end
process(input) click to toggle source
# File lib/codebreaker/console.rb, line 79
def process(input)
  begin
    puts game.to_guess(input)
    puts motivation_message(message['alerts']['motivation'])
  rescue => error
    puts error
    finish_game
  end
  game.won? ? finish_game : submit_answer
end
save_game() click to toggle source
# File lib/codebreaker/console.rb, line 109
def save_game
  print message['alerts']['save_game']
  save_game_data if input_selector
end
save_game_data() click to toggle source
# File lib/codebreaker/console.rb, line 114
def save_game_data
  save_user_score
  prepare_storage_dir
  save_to_yml
  puts message['info']['successfully_saved'].green
end
show_hint() click to toggle source
# File lib/codebreaker/console.rb, line 53
def show_hint
  puts begin
    "#{message['alerts']['hint']}: #{game.hint.to_s.green}"
  rescue => error
    error.to_s.red
  end
end
submit_answer() click to toggle source
# File lib/codebreaker/console.rb, line 49
def submit_answer
  process(user_interaction)
end
summary() click to toggle source
# File lib/codebreaker/console.rb, line 90
def summary
  game.won? ? message['alerts']['won'].green : message['alerts']['lose'].red
end
user_interaction(input = EMPTY_INPUT) click to toggle source
# File lib/codebreaker/console.rb, line 61
def user_interaction(input = EMPTY_INPUT)
  return if game.attempts.zero?
  status, step = false, 0
  until status
    begin
      game.guess_valid?(input)
      status = true
    rescue => error
      puts error.to_s.red unless step.zero? || input == HINT
      puts "#{message['alerts']['guess']}:"
      input = gets.chomp
      step += 1
      show_hint if input == HINT
    end
  end
  input
end