class TicTacToe::Board

Constants

DRAW
IN_PROGRESS
WIN

Attributes

game_status[RW]
winning_sign[R]

Public Class Methods

new() click to toggle source
# File lib/glimmer-dsl-opal/samples/elaborate/tic_tac_toe/board.rb, line 11
def initialize
  @sign_state_machine = {nil => "X", "X" => "O", "O" => "X"}
  build_grid
  @winning_sign = Cell::EMPTY
  @game_status = IN_PROGRESS
end

Public Instance Methods

[](row, column) click to toggle source
# File lib/glimmer-dsl-opal/samples/elaborate/tic_tac_toe/board.rb, line 28
def [](row, column)
  @grid[row-1][column-1]
end
current_sign() click to toggle source
# File lib/glimmer-dsl-opal/samples/elaborate/tic_tac_toe/board.rb, line 24
def current_sign
  @current_sign = @sign_state_machine[@current_sign]
end
game_over?() click to toggle source
# File lib/glimmer-dsl-opal/samples/elaborate/tic_tac_toe/board.rb, line 32
def game_over?
   win? or draw?
end
mark(row, column) click to toggle source

row and column numbers are 1-based

# File lib/glimmer-dsl-opal/samples/elaborate/tic_tac_toe/board.rb, line 19
def mark(row, column)
  self[row, column].mark(current_sign)
  game_over? #updates winning sign
end
reset() click to toggle source
# File lib/glimmer-dsl-opal/samples/elaborate/tic_tac_toe/board.rb, line 42
def reset
  (1..3).each do |row|
    (1..3).each do |column|
      self[row, column].reset
    end
  end
  @winning_sign = Cell::EMPTY
  @current_sign = nil
  self.game_status=IN_PROGRESS
end
win?() click to toggle source
# File lib/glimmer-dsl-opal/samples/elaborate/tic_tac_toe/board.rb, line 36
def win?
  win = (row_win? or column_win? or diagonal_win?)
  self.game_status=WIN if win
  win
end

Private Instance Methods

build_grid() click to toggle source
# File lib/glimmer-dsl-opal/samples/elaborate/tic_tac_toe/board.rb, line 55
def build_grid
  @grid = []
  3.times do |row_index| #0-based
    @grid << []
    3.times { @grid[row_index] << Cell.new }
  end
end
column_has_same_sign(number) click to toggle source
# File lib/glimmer-dsl-opal/samples/elaborate/tic_tac_toe/board.rb, line 115
def column_has_same_sign(number)
  column_sign = self[1, number].sign
  [2, 3].each do |row|
    return false unless column_sign == (self[row, number].sign)
  end
  true if self[1, number].marked
end
column_win?() click to toggle source
# File lib/glimmer-dsl-opal/samples/elaborate/tic_tac_toe/board.rb, line 73
def column_win?
  (1..3).each do |column|
    if column_has_same_sign(column)
      @winning_sign = self[1, column].sign
      return true
    end
  end
  false
end
diagonal_win?() click to toggle source

needs refactoring if we ever decide to make the board size dynamic

# File lib/glimmer-dsl-opal/samples/elaborate/tic_tac_toe/board.rb, line 84
def diagonal_win?
  if (self[1, 1].sign == self[2, 2].sign) and (self[2, 2].sign == self[3, 3].sign) and self[1, 1].marked
    @winning_sign = self[1, 1].sign
    return true
  end
  if (self[3, 1].sign == self[2, 2].sign) and (self[2, 2].sign == self[1, 3].sign) and self[3, 1].marked
    @winning_sign = self[3, 1].sign
    return true
  end
  false
end
draw?() click to toggle source
# File lib/glimmer-dsl-opal/samples/elaborate/tic_tac_toe/board.rb, line 96
def draw?
  @board_full = true
  3.times do |x|
    3.times do |y|
      @board_full = false if self[x, y].empty
    end
  end
  self.game_status = DRAW if @board_full
  @board_full
end
row_has_same_sign(number) click to toggle source
# File lib/glimmer-dsl-opal/samples/elaborate/tic_tac_toe/board.rb, line 107
def row_has_same_sign(number)
  row_sign = self[number, 1].sign
  [2, 3].each do |column|
    return false unless row_sign == (self[number, column].sign)
  end
  true if self[number, 1].marked
end
row_win?() click to toggle source
# File lib/glimmer-dsl-opal/samples/elaborate/tic_tac_toe/board.rb, line 63
def row_win?
  (1..3).each do |row|
    if row_has_same_sign(row)
      @winning_sign = self[row, 1].sign
      return true
    end
  end
  false
end