class Mastermind::GameRound

Attributes

command[RW]
guesses[RW]
instream[RW]
interact[RW]
max_guesses[RW]
outstream[RW]
players[RW]
round_over[RW]
secret[RW]
start_time[RW]
valid_colors[RW]

Public Class Methods

new(instream, outstream, interact, players) click to toggle source
# File lib/mastermind/game_round.rb, line 19
def initialize(instream, outstream, interact, players)
  @instream     = instream
  @outstream    = outstream
  @interact     = interact
  @valid_colors = Mastermind::Processor.colors(6)
  @max_guesses  = 12 
  @command      = ""
  @guesses      = []
  @round_over   = false
  @start_time   = Time.now
  @players      = players
end

Public Instance Methods

color_string() click to toggle source
# File lib/mastermind/game_round.rb, line 103
def color_string
  Mastermind.color_option_string(6)
end
correct_color(player) click to toggle source
# File lib/mastermind/game_round.rb, line 160
def correct_color(player)
  Mastermind::Processor.num_correct_colors(player.command, player.secret)
end
correct_guess?(player) click to toggle source
# File lib/mastermind/game_round.rb, line 127
def correct_guess?(player)
  player.command.chars == player.secret
end
correct_pos(player) click to toggle source
# File lib/mastermind/game_round.rb, line 156
def correct_pos(player)
  Mastermind::Processor.num_correct_pos(player.command, player.secret)
end
game_round_over?() click to toggle source
# File lib/mastermind/game_round.rb, line 116
def game_round_over?
  round_over
end
get_secret(player) click to toggle source
# File lib/mastermind/game_round.rb, line 75
def get_secret(player)
  outstream.puts interact.print_player_secret_intro(player.name)
  code = "yyyy"
  until valid_guess?(code, player.secret, valid_colors)
    outstream.print interact.secret_guess_prompt
    code = instream.noecho(&:gets).strip.upcase
    outstream.puts
  end
  code.chars
end
guess(player) click to toggle source
# File lib/mastermind/game_round.rb, line 144
def guess(player)
  player.guesses << player.command
  if    correct_guess?(player)      then win!(player)
  elsif !guesses_remaining?(player) then out_of_guesses(player)
  else  outstream.puts interact.print_guess_stats(num_guesses(player), correct_pos(player), correct_color(player), player.command, max_guesses, player)
  end
end
guesses_remaining?(player) click to toggle source
# File lib/mastermind/game_round.rb, line 131
def guesses_remaining?(player)
  num_guesses(player) < max_guesses
end
num_guesses(player) click to toggle source
# File lib/mastermind/game_round.rb, line 152
def num_guesses(player)
  player.guesses.length
end
out_of_guesses(player) click to toggle source
# File lib/mastermind/game_round.rb, line 139
def out_of_guesses(player)
  outstream.puts interact.print_out_of_guesses(num_guesses(player), correct_pos(player), correct_color(player), player.command, max_guesses, player)
  player_round_over!(player)
end
play() click to toggle source
# File lib/mastermind/game_round.rb, line 32
def play
  player_reset
  outstream.puts interact.print_round_intro(color_string)
  secret_gen
  set_turn_pos
  outstream.puts interact.multi_player_div if !single_player?
  until round_over? || game_round_over?
    player_turn
  end
  @round_over = true
end
player_reset() click to toggle source
# File lib/mastermind/game_round.rb, line 44
def player_reset
  @players.each do |player|
    player.secret = ["X", "X", "X", "X"]
    player.round_over = false
    player.guesses = []
    player.start_time = Time.now
    player.completion_time = nil
    player.turn_pos = nil
  end
end
player_round_over!(player) click to toggle source
# File lib/mastermind/game_round.rb, line 107
def player_round_over!(player)
  player.round_over = true
  outstream.puts interact.print_round_over if round_over?
end
player_turn() click to toggle source
# File lib/mastermind/game_round.rb, line 55
def player_turn
  @players.each do |player|
    if player.round_over == false && !game_round_over?
      outstream.print interact.guess_prompt(player)
      player.command = instream.gets.strip.upcase
      process_command(player)
    end
  end
end
process_command(player) click to toggle source
# File lib/mastermind/game_round.rb, line 91
def process_command(player)
  case
  when quit?(player)                                               then quit_confirm(player)
  when !valid_guess?(player.command, player.secret, valid_colors)  then outstream.puts interact.print_invalid_guess(player)
  when valid_guess?(player.command, player.secret, valid_colors)   then guess(player)
  end
end
quit?(player) click to toggle source
# File lib/mastermind/game_round.rb, line 135
def quit?(player)
  player.command == "Q" || player.command == "QUIT"
end
quit_confirm(player) click to toggle source
# File lib/mastermind/game_round.rb, line 168
def quit_confirm(player)
  outstream.puts interact.print_are_you_sure
  outstream.print interact.command_prompt
  confirmation = instream.gets.strip.upcase
  case confirmation
  when "Y", "YES" 
    self.round_over = true
    player.command = "Q"
  else                 player.command = ""
  end
end
round_over?() click to toggle source
# File lib/mastermind/game_round.rb, line 112
def round_over?
  !@players.any? {|player| player.round_over == false}
end
secret_gen() click to toggle source
# File lib/mastermind/game_round.rb, line 65
def secret_gen
  if single_player? then @players.first.secret = Mastermind::Processor.secret(4, 6)
  else
    @players.shuffle
    outstream.puts interact.print_get_secret
    @players.last.secret  = get_secret(@players.first)
    @players.first.secret = get_secret(@players.last)
  end
end
set_turn_pos() click to toggle source
# File lib/mastermind/game_round.rb, line 86
def set_turn_pos
  @players[0].turn_pos = 0
  @players[1].turn_pos = 1 if @players[1]
end
single_player?() click to toggle source
# File lib/mastermind/game_round.rb, line 99
def single_player?
  @players.length == 1
end
valid_guess?(command, secret, valid_colors) click to toggle source
# File lib/mastermind/game_round.rb, line 164
def valid_guess?(command, secret, valid_colors)
  Mastermind::Processor.validate(command, secret, valid_colors)
end
win!(player) click to toggle source
# File lib/mastermind/game_round.rb, line 120
def win!(player)
  time = Time.now - player.start_time
  player.completion_time = time
  outstream.puts interact.print_win(num_guesses(player), time.round, player.secret, player)
  player_round_over!(player)
end