class MastermindGameCli::Game

Attributes

mark[RW]
sequence[R]

Public Class Methods

new(num_pos) click to toggle source
# File lib/mastermind_game_cli/game.rb, line 13
def initialize(num_pos)
  @mark = nil
  @hints = []
  @num_pos = num_pos
  @finish = false
  @guesses = []
  @sequence = Sequence.new(num_pos)
end

Public Instance Methods

add_hint() click to toggle source
# File lib/mastermind_game_cli/game.rb, line 47
def add_hint
  hint = new_hint
  raise 'not enough info to give a hint' if hint.nil?
  @hints << hint
end
finished?() click to toggle source
# File lib/mastermind_game_cli/game.rb, line 22
def finished?
  @finish
end
guess(guess) click to toggle source
# File lib/mastermind_game_cli/game.rb, line 26
def guess(guess)
  raise "Bad try, I expect a combination of #{@num_pos} digits" unless guess.length.equal? @num_pos
  raise 'Bad try, I expect only digits' unless Checker.only_digits? guess
  raise 'Bad try, I expect a combination without repetitions' if Checker.repeated? guess
  raise 'Bad try, you already tried that one' if @guesses.include? guess
  result = Checker.check(@sequence.value, guess)
  @guesses << Guess.new(guess, result)
  @finish = (result == '1' * @num_pos)
end
pretty_print() click to toggle source
# File lib/mastermind_game_cli/game.rb, line 36
def pretty_print
  printf "| %02s | %-#{@num_pos}s | %-#{@num_pos}s |\r\n", '#', 'try', 'res'
  printf "|%04s|%-#{@num_pos+2}s|%-#{@num_pos+2}s|\r\n", '-' * 4, '-'*(@num_pos+2), '-'*(@num_pos+2)
  line = 1
  @guesses.each do |guess|
    printf "| %02d | %-#{@num_pos}s | %-#{@num_pos}s |\r\n", line, pretty_print_string(guess.value, @mark), guess.response
    line += 1
  end
  printf "|%04s|%-#{@num_pos+2}s|%-#{@num_pos+2}s|\r\n", '-' * 4, '-'*(@num_pos+2), '-'*(@num_pos+2)
end

Private Instance Methods

new_hint() click to toggle source
# File lib/mastermind_game_cli/game.rb, line 54
def new_hint
  raise 'Hints are limited to 2' if @hints.length >= 2
  candidates = []
  @guesses.each do |guess|
    matches = Checker.get_matches(@sequence.value, guess.value)
    matches.each do |match|
      candidates << match unless candidates.include? match
    end
  end
  @hints.each do |hint|
    candidates.delete(hint)
  end
  candidates.length > 0 ? candidates[0] : nil
end
pretty_print_string(st, nb) click to toggle source
# File lib/mastermind_game_cli/game.rb, line 70
def pretty_print_string(st, nb)
  result = ''
  nb = nb.to_i unless nb.nil?
  (0..st.length-1).each do |i|
    ch = st[i]
    if @hints.include? ch
      if @sequence.value[i].to_i.equal? ch.to_i
        result += ch.red
      else
        result += ch.yellow
      end
    else
      if ch.to_i.equal? nb
        result += ch.underline
      else
        result += ch
      end
    end
  end
  result
end