class Board

Constants

COLS
ROWS

Attributes

pieces[RW]

Public Class Methods

new() click to toggle source
# File lib/connect-four.rb, line 9
def initialize
  @pieces = ([nil] * COLS).map { [nil] * ROWS }
end

Public Instance Methods

column(id) click to toggle source
# File lib/connect-four.rb, line 78
def column(id)
  pieces[id]
end
current_color() click to toggle source
# File lib/connect-four.rb, line 56
def current_color
  red? ? :red : :yellow
end
current_player() click to toggle source
# File lib/connect-four.rb, line 60
def current_player
  current_color.to_s.colorize(current_color)
end
draw() click to toggle source
# File lib/connect-four.rb, line 13
def draw
  ROWS.times do |i|
    row(ROWS - 1 - i).each do |char|
      print "\u25A0 ".colorize(char || :light_black)
    end
    print "\n"
  end
end
moves() click to toggle source
# File lib/connect-four.rb, line 22
def moves
  pieces.flatten.compact.length
end
place(col) click to toggle source
# File lib/connect-four.rb, line 64
def place(col)
  if col.match(/\A[^\d]/)
    false
  else
    col = col.to_i
    id = column(col).each_with_index.find { |el, i| el.nil? }[1]
    column(col)[id] = current_color
  end
end
point_won?(row, column) click to toggle source
# File lib/connect-four.rb, line 34
def point_won?(row, column)
  possible_wins(row, column).find do |items|
    items.compact.size == 4 and items.uniq.length == 1
  end
end
possible_wins(row, column) click to toggle source
# File lib/connect-four.rb, line 40
def possible_wins(row, column)
  directions = {n: [-1, 0], w: [0, -1], nw: [-1, -1], ne: [-1, 1]}
  directions.keys.map do |direction|
    relative_direction = directions[direction]
    (0..3).map do |i|
      x = row + (relative_direction[0] * i)
      y = column + (relative_direction[1] * i)
      pieces[x][y] if x >= 0 and y >= 0
    end
  end
end
red?() click to toggle source
# File lib/connect-four.rb, line 52
def red?
  moves % 2 == 0
end
row(id) click to toggle source
# File lib/connect-four.rb, line 74
def row(id)
  pieces.collect { |el| el[id] }
end
won?() click to toggle source
# File lib/connect-four.rb, line 26
def won?
  ROWS.times.find do |r|
    COLS.times.find do |c|
      point_won?(r, c)
    end
  end
end