class Codebreaker::Game

Attributes

count_of_try[R]
game_status[R]
is_hint_used[R]
num_of_try[R]

Public Class Methods

load_results() click to toggle source
# File lib/codebreaker.rb, line 60
def self.load_results
  res = []
  Psych.load_stream(File.read('../../data/results.yml')) do |item|
    res << item
  end
  return res.map do |item|
    "#{item[:user_name]}:\
    \n\tgame status:  #{item[:game_status]}\
    \n\tcount of try: #{item[:count_of_try]}\
    \n\tis hint used: #{item[:is_hint_used]}\n\n"
  end.join if res
  res
end
new() click to toggle source
# File lib/codebreaker.rb, line 8
def initialize
  @secret_code = nil
  @count_of_try = nil
  @game_status = nil
  @num_of_try = nil
  @game_status = nil
end

Public Instance Methods

hint() click to toggle source
# File lib/codebreaker.rb, line 42
def hint
  unless (@is_hint_used) 
    @is_hint_used = true
    return @secret_code.sample
  end
  'hint already used'
end
match_secret_code(user_code) click to toggle source
# File lib/codebreaker.rb, line 24
def match_secret_code user_code
  return 'Game Over' if @game_status == 'lose'
  return 'You win!' if @game_status == 'win'
  return 'Wrong format (input 4 digit without spaces). Try again' unless is_right_code? user_code
  user_code = user_code.chars.map(&:to_i)
  @num_of_try += 1
  if user_code == @secret_code
    @game_status = "win"
    return "++++ You win!!!" 
  end
  res = match_codes user_code
  if @num_of_try == @count_of_try
    @game_status = "lose"
    res += ' Game Over'
  end
  res
end
save_result(name) click to toggle source
# File lib/codebreaker.rb, line 50
def save_result(name)
  res = {}
  res[:user_name] = name
  res[:game_status] = @game_status
  res[:count_of_try] = @num_of_try
  res[:is_hint_used] = @is_hint_used

  File.open('../../data/results.yml', 'a') {|f| f.write(res.to_yaml) }
end
start() click to toggle source
# File lib/codebreaker.rb, line 16
def start
  @secret_code = (1..4).map { rand(1..6) }
  @num_of_try = 0
  @count_of_try = rand(10..20)
  @is_hint_used = false
  @game_status = nil
end

Private Instance Methods

is_right_code?(code) click to toggle source
# File lib/codebreaker.rb, line 86
def is_right_code? code
  code.length == 4 && code[/[1-6]+/].length == 4 
end
match_codes(user_code) click to toggle source
# File lib/codebreaker.rb, line 75
def match_codes user_code
  res = ''
  plus = @secret_code.zip(user_code).delete_if{ |item| item[0] == item[1]}.transpose
  res += (0..(3 - plus[0].length)).map{'+'}.join
  plus[0].length.times do 
    item = plus[0].pop
    plus[1].delete_at(plus[1].index(item)) if plus[1].include? item
  end
  res += (0...(4 - res.length - plus[1].length)).map{'-'}.join
end