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