class CodebreakerArtem::Game

Constants

MAX_GUESS_NUMBER

Attributes

guess_count[R]
score[R]
secret_code[R]

Public Class Methods

new() click to toggle source
# File lib/codebreaker_artem/game.rb, line 9
def initialize
  @guess_count = 0
  @score = 0
  @hint_available = true
end

Public Instance Methods

hint() click to toggle source
# File lib/codebreaker_artem/game.rb, line 27
def hint
  return unless hint_available?
  @hint_available = false
  position = rand(0..3)
  [@secret_code[position], position]
end
mark_guess(guess) click to toggle source
# File lib/codebreaker_artem/game.rb, line 19
def mark_guess(guess)
  return false unless Validator.code_valid? guess
  @guess_count += 1
  counts = plus_minus_count(guess)
  score_set(counts[:pluses], counts[:minuses])
  '' << ('+' * counts[:pluses]) << ('-' * counts[:minuses])
end
start() click to toggle source
# File lib/codebreaker_artem/game.rb, line 15
def start
  generate_secret_code
end

Private Instance Methods

generate_secret_code() click to toggle source
# File lib/codebreaker_artem/game.rb, line 36
def generate_secret_code
  @secret_code = Array.new(4) { rand(1..6) }.join
end
hint_available?() click to toggle source
# File lib/codebreaker_artem/game.rb, line 60
def hint_available?
  @hint_available
end
minus_count(not_plus) click to toggle source
# File lib/codebreaker_artem/game.rb, line 48
def minus_count(not_plus)
  code = not_plus.transpose[0]
  guess = not_plus.transpose[1]
  guess.each { |item| code.delete_at(code.index(item) || code.length) }
  not_plus.count - code.size
end
plus_minus_count(guess) click to toggle source
# File lib/codebreaker_artem/game.rb, line 40
def plus_minus_count(guess)
  return { pluses: 4, minuses: 0 } if @secret_code == guess
  zipped = @secret_code.split('').zip(guess.split(''))
  not_plus = zipped.delete_if { |item| item.uniq.one? }
  plus_count = 4 - not_plus.count
  { pluses: plus_count, minuses: minus_count(not_plus) }
end
score_set(plus_count, minus_count) click to toggle source
# File lib/codebreaker_artem/game.rb, line 55
def score_set(plus_count, minus_count)
  @score = (plus_count * 3) + (minus_count * 1) +
           (MAX_GUESS_NUMBER - @guess_count)
end