lib/rav_codebreaker/game.rb in rav_codebreaker-0.1.3 vs lib/rav_codebreaker/game.rb in rav_codebreaker-0.2.0
- old
+ new
@@ -1,83 +1,44 @@
module RavCodebreaker
class Game
TURNS_COUNT = {expert: 10, master: 15, beginner: 20}
HINTS_COUNT = {expert: 0, master: 1, beginner: 2}
- SCORES_FILE_NAME = './score.dat'
- attr_reader :turns_left, :hints_left, :offer
+ attr_reader :turns_left, :hints_left, :secret_code, :level
+ attr_accessor :offer
def initialize(level = :expert)
@secret_code = ''
@turns_left = 0
TURNS_COUNT.keys.include?(level) ? @level = level : @level = :expert
- @score = []
end
def start
@secret_code = Array.new(4){rand(1..6)}*''
@turns_left = TURNS_COUNT[@level]
@hints_left = HINTS_COUNT[@level]
@offer = '6666'
end
- def play
- start
- welcome_message
- loop do
- puts format_error? ? incorrect_message : invitation_message
- get_offer
- exit if exit?
- next if show_hint? || format_error?
- test_offer
- show_winner_message if win?
- show_game_over_message if game_over?
- break if win? || game_over?
- end
- load_scores_from_file
- save_results
- show_results
- end
-
- def again?
- puts 'Do you want to play again (Y or N)'
- gets =~ /y|Y/
- end
-
- #private
-
- def welcome_message
- puts '='*80
- puts 'Welcome to play the CodeBreaker Game!!!'
- puts '='*80
- end
-
- def invitation_message
- "Try to guess the secret code! You have #{@turns_left} attempts and #{@hints_left} hints. Good luck!" +
- "\nEnter you four numbers code (from 1 to 6), please (or Q - for exit, H - for hint):"
- end
-
- def incorrect_message
- "\nincorrect number format, try again, please..."
- end
-
def decode_offer
code = @secret_code.split('')
offer = @offer.split('')
4.times{|i| code[i] = offer[i] = nil if @secret_code[i] == @offer[i]}
offer.compact!
offer.each{|num| code[code.index(num)] = '-' if code.include? num}
'+' * code.count(nil) + '-' * code.count('-')
end
- def get_offer
- @offer = gets.chomp
+ def get_hint
+ return nil if @hints_left < 1
+ @hints_left -= 1
+ pos = rand(4)
+ [@secret_code[pos], pos]
end
- def test_offer
+ def next_turn
@turns_left -= 1
- puts "You result is \"#{decode_offer}\"!"
end
def win?
decode_offer == '++++'
end
@@ -92,68 +53,10 @@
def game_over?
@turns_left < 1
end
- def show_game_over_message
- puts "Sorry, you lose the game :(\nThe secret code was #{@secret_code}."
- end
-
- def show_winner_message
- puts 'We congratulate you on your victory!!!'
- end
-
def show_hint?
- return false unless @offer =~ /^[hH]$/
- if @hints_left < 1
- puts 'Sorry, but you have not any hints :('
- else
- @hints_left -= 1
- pos = rand(4)
- puts "I exactly know that a number #{@secret_code[pos]} is at position ##{pos} (remember, it starts from 0)."
- end
- true
- end
-
- def load_scores_from_file
- return unless File.exist? SCORES_FILE_NAME
- File.open(SCORES_FILE_NAME) do |file|
- @score = Marshal.load(file)
- end
- end
-
- def save_scores_to_file
- File.open(SCORES_FILE_NAME, 'w+') do |file|
- Marshal.dump(@score, file)
- end
- end
-
- def show_results
- @score.sort_by!{|player| player[:turns]}
- format_str = "| %02s | %12s | %10s | %5s | %5s |"
- format_str_length = 50
- puts '-' * format_str_length
- puts format_str % %w(## player\ name game\ level turns hints)
- puts '-' * format_str_length
- @score.each_with_index do |player, index|
- arr = [index + 1] + player.values
- puts format_str % arr
- end
- puts '-' * format_str_length
- end
-
- def save_results
- puts '"Do you want to save your results (Y/N)?'
- return if gets !~ /y|Y/
- player = {}
- begin
- puts 'Enter your name, please...'
- player[:name] = gets.chomp
- end while player[:name].empty?
- player[:level] = @level
- player[:turns] = TURNS_COUNT[@level] - @turns_left
- player[:hints] = HINTS_COUNT[@level] - @hints_left
- @score << player
- save_scores_to_file
+ @offer =~ /^[hH]$/
end
end
end
\ No newline at end of file