class Gomasio::Board

Constants

Offset

Attributes

order[RW]
size[R]

Public Class Methods

new(board_size = DEFAULT_BOARD_SIZE) click to toggle source
# File lib/gomasio/board.rb, line 27
def initialize(board_size = DEFAULT_BOARD_SIZE)
  @size  = board_size
  @range = 0..(@size - 1)
  clear
end

Public Instance Methods

[](row, col) click to toggle source
# File lib/gomasio/board.rb, line 64
def [](row, col)
  row, col = cleansing(row, col)
  fail OutOfRangeError.new unless include?(row, col)
  @board[encode(row, col)]
end
clear() click to toggle source
# File lib/gomasio/board.rb, line 41
def clear
  @board = Array.new(@size**2, Gomasio::Disk.empty)
end
clone() click to toggle source
# File lib/gomasio/board.rb, line 34
def clone
  instance = Board.new(@size)
  instance.load(@board.clone)
  instance
end
count() click to toggle source
# File lib/gomasio/board.rb, line 46
def count
  black = white = 0
  (@size**2).times do |index|
    next if @board[index].empty?
    @board[index].black? ? black += 1 : white += 1
  end
  [black, white]
end
full?() click to toggle source
# File lib/gomasio/board.rb, line 56
def full?
  (@size**2).times do |index|
    return false if @board[index].empty?
  end
  true
end
include?(row, col) click to toggle source
# File lib/gomasio/board.rb, line 92
def include?(row, col)
  row, col = cleansing(row, col)
  @range.include?(row) && @range.include?(col)
end
mount(row: nil, col: nil, disk: nil) click to toggle source
# File lib/gomasio/board.rb, line 71
def mount(row: nil, col: nil, disk: nil)
  row, col = cleansing(row, col)
  fail OutOfRangeError.new unless include?(row, col)
  fail InSamePlaceError.new unless self[row, col].empty?

  @board[encode(row, col)] = disk

  point = Struct.new(:row, :col)
  directions = Board.instance_variable_get(:@directions)
  location = directions.each_with_object(Hash.new(0)) do |diff, item|
    (1..4).each do |index|
      dict = point.new(row + diff.down * index, col + diff.right * index)
      break unless include?(dict.row, dict.col)
      break if self[dict.row, dict.col] != disk
      item[diff] = index
    end
  end
  [location, win?(location)]
end
to_matrix() click to toggle source
# File lib/gomasio/board.rb, line 98
def to_matrix
  Array.new(@size).map{[]}.each_with_index do |item, row|
    @size.times do |col|
      item << @board[encode(row,col)]
    end
  end
end

Protected Instance Methods

load(board) click to toggle source
# File lib/gomasio/board.rb, line 109
def load(board)
  @board = board if board.kind_of?(Array)
end

Private Instance Methods

cleansing(row, col) click to toggle source
# File lib/gomasio/board.rb, line 116
def cleansing(row, col)
  [row.to_i, col.to_i]
end
decode(index) click to toggle source
# File lib/gomasio/board.rb, line 135
def decode(index)
  index.divmod(@size)
end
encode(row, col) click to toggle source
# File lib/gomasio/board.rb, line 130
def encode(row, col)
  row * @size + col
end
win?(location) click to toggle source
# File lib/gomasio/board.rb, line 121
def win?(location)
  [[1, 0], [0, 1], [1, 1], [1, -1]].each do |diff|
    offset = Offset.new(diff[0], diff[1])
    return true if (location[offset] + location[offset.reverse] >= 4)
  end
  false
end