Skip to content

Instantly share code, notes, and snippets.

@JohnMorales
Created December 10, 2013 03:22
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save JohnMorales/7885279 to your computer and use it in GitHub Desktop.
Save JohnMorales/7885279 to your computer and use it in GitHub Desktop.
class Board
BLACK = :b
RED = :r
WIDTH = 7
HEIGHT = 6
def initialize()
@board = []
@current_player = BLACK
WIDTH.times do |x|
@board[x] = []
end
end
def render()
HEIGHT.times do |y|
WIDTH.times do |x|
print(@board[x][HEIGHT-y-1] || '.')
end
puts
end
end
def y_value()
@board[@last_move].size - 1
end
def won?
def template(func)
[].tap do |vector|
(1..3).each do |i|
vector.push *func.call(i)
end
end
end
def horizontal(i)
[ [@last_move-i, y_value], [@last_move+i, y_value] ]
end
def vertical(i)
[ [@last_move, y_value-i], [@last_move, y_value+i] ]
end
def backslash(i)
[ [@last_move-i, y_value+i], [@last_move+i, y_value-i] ]
end
def forwardslash(i)
[ [@last_move-i, y_value-i], [@last_move+i, y_value+i] ]
end
[:horizontal, :vertical, :backslash, :forwardslash].any? do |x|
check_winnig_vector(template(method(x)))
end
end
def check_winnig_vector(vector_positions)
current_color = @board[@last_move].last
vector_length = 1
vector_positions.each do |x, y|
if (@board[x][y] == current_color && x >= 0 && x < WIDTH)
vector_length += 1
end
return true if vector_length >= 4
end
return false
end
def moves
(0...WIDTH).reject { |x| @board[x].size >= HEIGHT}
end
def move(position)
@board[position].push(player_to_move)
@current_player = @current_player == BLACK ? RED : BLACK
@last_move = position
end
def player_to_move
@current_player
end
def self.starting_board
end
end
describe Board do
it "it should return all possible moves on an empty board " do
board = Board.new()
board.moves.should be == [0, 1, 2, 3, 4, 5, 6]
end
it "it should exclude a column if that column is full" do
board = Board.new()
6.times do |x|
board.move(0)
end
board.moves.should be == [1, 2, 3, 4, 5, 6]
end
it "it should not have any moves if all columns are full" do
board = Board.new()
7.times do |y|
6.times do |x|
board.move(y)
end
end
board.moves.should be == []
end
it "should cycle between black and red" do
board = Board.new
board.player_to_move.should be Board::BLACK
board.move(0)
board.player_to_move.should be Board::RED
end
it "should return false on an empty board" do
end
it "should return true if black wins horizontally" do
board = Board.new
board.move(0)
board.move(6) # red
board.move(1)
board.move(5) # red
board.move(2)
board.move(6) # red
board.move(3)
board.won?.should be == true
end
it "should return true if black wins vertically" do
board = Board.new
board.move(0)
board.move(6) # red
board.move(0)
board.move(6) # red
board.move(0)
board.move(6) # red
board.move(0)
board.won?.should be == true
end
it "should return true if black wins via blackslash vector" do
board = Board.new
board.move(6)
board.move(5) # red
board.move(5)
board.move(4) # red
board.move(3)
board.move(4) # red
board.move(4)
board.move(3) # red
board.move(2)
board.move(3) # red
board.move(3)
board.won?.should be == true
end
it "should return true if black wins via forwardslash vector" do
board = Board.new
board.move(0)
board.move(1) # red
board.move(1)
board.move(2) # red
board.move(3)
board.move(2) # red
board.move(2)
board.move(3) # red
board.move(4)
board.move(3) # red
board.move(3)
board.won?.should be == true
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment