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