class TicTacToe::Board
Constants
- DRAW
- IN_PROGRESS
- WIN
Attributes
game_status[RW]
winning_sign[R]
Public Class Methods
new()
click to toggle source
# File examples/tic_tac_toe/board.rb, line 32 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 examples/tic_tac_toe/board.rb, line 51 def [](row, column) @grid[row-1][column-1] end
current_sign()
click to toggle source
# File examples/tic_tac_toe/board.rb, line 47 def current_sign @current_sign = @sign_state_machine[@current_sign] end
game_over?()
click to toggle source
# File examples/tic_tac_toe/board.rb, line 55 def game_over? win? or draw? end
mark(row, column)
click to toggle source
row and column numbers are 1-based
# File examples/tic_tac_toe/board.rb, line 40 def mark(row, column) if self[row, column].empty self[row, column].mark(current_sign) game_over? #updates winning sign end end
reset!()
click to toggle source
# File examples/tic_tac_toe/board.rb, line 65 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 examples/tic_tac_toe/board.rb, line 59 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 examples/tic_tac_toe/board.rb, line 78 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 examples/tic_tac_toe/board.rb, line 138 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 examples/tic_tac_toe/board.rb, line 96 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 examples/tic_tac_toe/board.rb, line 107 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 examples/tic_tac_toe/board.rb, line 119 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 examples/tic_tac_toe/board.rb, line 130 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 examples/tic_tac_toe/board.rb, line 86 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