class Board

Attributes

number_of_rows[R]
spaces[R]
winner[R]

Public Class Methods

new(spaces) click to toggle source
# File lib/board.rb, line 5
def initialize(spaces)
  @spaces = spaces
  @number_of_rows = Math.sqrt(spaces.count)
end

Public Instance Methods

check_available_spaces() click to toggle source
# File lib/board.rb, line 16
def check_available_spaces
  @spaces.each_index.select {|space| space_available?(space)}
end
current_player_marker() click to toggle source
# File lib/board.rb, line 45
def current_player_marker
  string_count = spaces.count { |space| space.is_a? String }
  string_count.even? ? "X" : "O"
end
game_over?() click to toggle source
# File lib/board.rb, line 32
def game_over?
  game_tied? || game_won_by?("X") || game_won_by?("O")
end
game_tied?() click to toggle source
# File lib/board.rb, line 36
def game_tied?
  if check_available_spaces.empty? && !game_won_by?("X") && !game_won_by?("O")
    @winner = nil
    true
  else
    false
  end
end
game_won_by?(marker) click to toggle source
# File lib/board.rb, line 50
def game_won_by?(marker)
  split_into_lines.any? do |line|
    set_winner(marker) if line.all? {|space| space == marker}
  end
end
place_marker(space) click to toggle source
# File lib/board.rb, line 10
def place_marker(space)
  spaces = @spaces.dup
  spaces[space] = current_player_marker if space_available?(space)
  Board.new(spaces)
end
space_available?(space) click to toggle source
# File lib/board.rb, line 20
def space_available?(space)
  @spaces[space].nil?
end
split_into_lines() click to toggle source
# File lib/board.rb, line 24
def split_into_lines
  lines = []
  split_into_rows.each {|row| lines.push(row)}
  split_into_columns.each{|column| lines.push(column)}
  split_into_diagonals.each{|diagonal| lines.push(diagonal)}
  lines
end

Private Instance Methods

set_winner(marker) click to toggle source
# File lib/board.rb, line 79
def set_winner(marker)
  @winner = marker
end
split_into_columns() click to toggle source
# File lib/board.rb, line 62
def split_into_columns
  split_into_rows.transpose
end
split_into_diagonals() click to toggle source
# File lib/board.rb, line 66
def split_into_diagonals
  diagonals = []
  diagonals.push(split_left_diagonal, split_right_diagonal)
end
split_into_rows() click to toggle source
# File lib/board.rb, line 58
def split_into_rows
  @spaces.each_slice(@number_of_rows).to_a
end
split_left_diagonal() click to toggle source
# File lib/board.rb, line 71
def split_left_diagonal
  (0..@number_of_rows - 1).map {|position| split_into_rows[position][position]}
end
split_right_diagonal() click to toggle source
# File lib/board.rb, line 75
def split_right_diagonal
  (0..@number_of_rows - 1).map {|position| split_into_rows.reverse[position][position]}.reverse
end