class TicTacToe::Game

Attributes

board[R]
interface[R]
player_marks[R]
players[R]

Public Class Methods

new(parameters) click to toggle source
# File lib/game.rb, line 9
def initialize(parameters)
  @player_marks = parameters[:player_marks] || [:x, :o]
  @board = parameters[:board] || create_default_board
  @interface = parameters[:interface] || create_default_interface
  @players = []
end

Public Instance Methods

get_valid_move(player) click to toggle source
# File lib/game.rb, line 44
def get_valid_move(player)
  loop do
    coordinates = player.move(self)
    if @board.out_of_bounds?(coordinates) || @board.marked?(coordinates)
      @interface.report_invalid_move(coordinates)
    else
      return coordinates
    end
  end
end
handle_game_over() click to toggle source
# File lib/game.rb, line 55
def handle_game_over
  @interface.show_game_board(@board)
  winning_player_mark = @board.has_winning_line? ? @board.last_mark_made : :none
  @interface.report_game_over(winning_player_mark)
end
handle_one_turn(current_player) click to toggle source
# File lib/game.rb, line 37
def handle_one_turn(current_player)
  @interface.show_game_board(@board)
  coordinates = get_valid_move(current_player)
  @board = @board.mark_space(current_player.player_mark, coordinates)
  @interface.report_move(current_player.player_mark, coordinates)
end
handle_turns() click to toggle source
# File lib/game.rb, line 28
def handle_turns
  catch(:game_over) do
    @players.cycle do |current_player|
      handle_one_turn(current_player)
      throw :game_over if over?
    end
  end
end
over?() click to toggle source
# File lib/game.rb, line 61
def over?
  @board.has_winning_line? || @board.all_marked?
end
run() click to toggle source
# File lib/game.rb, line 16
def run
  set_up
  handle_turns
  handle_game_over
end
set_up() click to toggle source
# File lib/game.rb, line 22
def set_up
  player_types = @interface.game_setup_interaction(@player_marks)

  @players = @player_marks.zip(player_types).map { |mark, type| create_player(mark, type) }
end

Private Instance Methods

create_default_board() click to toggle source
# File lib/game.rb, line 67
def create_default_board
  Board.new(size: 3)
end
create_default_interface() click to toggle source
# File lib/game.rb, line 71
def create_default_interface
  parameters = {
    input: $stdin,
    output: $stdout
  }
  CommandLineInterface.new(parameters)
end
create_player(mark, type) click to toggle source
# File lib/game.rb, line 79
def create_player(mark, type)
  player_parameters = {
    type: type,
    game: self,
    player_mark: mark
  }
  PlayerFactory.build(player_parameters)
end