class TicTacToe::Board

Constants

BLANK_MARK

Attributes

last_move_made[R]
size[R]

Public Class Methods

new(parameters) click to toggle source
# File lib/board.rb, line 7
def initialize(parameters)
  @size = parameters[:size] || infer_size(parameters[:marked_spaces])
  @spaces = parameters[:marked_spaces] || blank_spaces
  @last_move_made = parameters[:last_move_made]
end

Public Instance Methods

all_blank?() click to toggle source
# File lib/board.rb, line 55
def all_blank?
  all_coordinates.all? { |coordinates| blank?(coordinates) }
end
all_coordinates() click to toggle source
# File lib/board.rb, line 35
def all_coordinates
  (0...@size).to_a.repeated_permutation(2).to_a
end
all_marked?() click to toggle source
# File lib/board.rb, line 59
def all_marked?
  all_coordinates.all? { |coordinates| marked?(coordinates) }
end
blank?(coordinates) click to toggle source
# File lib/board.rb, line 47
def blank?(coordinates)
  self.read_space(coordinates) == BLANK_MARK
end
blank_space_coordinates() click to toggle source
# File lib/board.rb, line 39
def blank_space_coordinates
  all_coordinates.reject { |coordinates| marked?(coordinates) }
end
has_winning_line?() click to toggle source
# File lib/board.rb, line 63
def has_winning_line?
  lines.each do |line|
    return true if line.first != BLANK_MARK && line.all? { |mark| mark == line.first }
  end
  false
end
last_mark_made() click to toggle source
# File lib/board.rb, line 24
def last_mark_made
  return if @last_move_made.nil?
  self.read_space(last_move_made)
end
lines() click to toggle source
# File lib/board.rb, line 29
def lines
  (0...@size).each_with_object([left_diag, right_diag]) do |index, lines|
    lines << row_at(index) << col_at(index)
  end
end
mark_space(mark, coordinates) click to toggle source
# File lib/board.rb, line 17
def mark_space(mark, coordinates)
  marked_spaces = @spaces.dup
  marked_spaces[coordinates_to_flat_index(coordinates)] = mark

  Board.new(marked_spaces: marked_spaces, last_move_made: coordinates)
end
marked?(coordinates) click to toggle source
# File lib/board.rb, line 51
def marked?(coordinates)
  !blank?(coordinates)
end
out_of_bounds?(coordinates) click to toggle source
# File lib/board.rb, line 43
def out_of_bounds?(coordinates)
  coordinates.any? { |i| !i.between?(0, @size - 1) }
end
read_space(coordinates) click to toggle source
# File lib/board.rb, line 13
def read_space(coordinates)
  @spaces[coordinates_to_flat_index(coordinates)]
end

Private Instance Methods

blank_spaces() click to toggle source
# File lib/board.rb, line 82
def blank_spaces
  Array.new(@size**2) { BLANK_MARK }
end
col_at(col) click to toggle source
# File lib/board.rb, line 90
def col_at(col)
  (0...@size).map { |row| self.read_space([row, col]) }
end
coordinates_to_flat_index(coordinates) click to toggle source
# File lib/board.rb, line 77
def coordinates_to_flat_index(coordinates)
  row, col = coordinates
  row * @size + col
end
infer_size(marked_spaces) click to toggle source
# File lib/board.rb, line 72
def infer_size(marked_spaces)
  return if marked_spaces.nil?
  Math.sqrt(marked_spaces.count).to_i
end
left_diag() click to toggle source
# File lib/board.rb, line 94
def left_diag
  (0...@size).map { |index| self.read_space([index, index]) }
end
right_diag() click to toggle source
# File lib/board.rb, line 98
def right_diag
  (0...@size).map { |row| self.read_space([row, @size - row - 1]) }
end
row_at(row) click to toggle source
# File lib/board.rb, line 86
def row_at(row)
  (0...@size).map { |col| self.read_space([row, col]) }
end