Class: Board

Inherits:
Object
  • Object
show all
Defined in:
lib/board.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeBoard

Returns a new instance of Board.



8
9
10
11
12
13
14
15
16
17
18
19
20
# File 'lib/board.rb', line 8

def initialize
  @columns = {
    "A" => [],
    "B" => [],
    "C" => [],
    "D" => [],
    "E" => [],
    "F" => [],
    "G" => []
  }

  @columns.each { |column, row| 6.times{ row << Cell.new}}
end

Instance Attribute Details

#columnsObject (readonly)

Returns the value of attribute columns.



7
8
9
# File 'lib/board.rb', line 7

def columns
  @columns
end

Instance Method Details

#diagonal_win?Boolean

Returns:

  • (Boolean)


51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
# File 'lib/board.rb', line 51

def diagonal_win?
  consecutive_rows = []
  diag = {}

  diag[1] = columns.values.flatten.select.with_index{|cell, i| i % 7 == 0}
  diag[2] = columns.values.flatten.select.with_index{|_,i| (i + 8) % 7 == 0}
  diag[3] = columns.values.flatten.select.with_index{|_,i| i % 7 == 5}
  diag[3].shift
  diag[4] = columns.values.flatten.select.with_index{|_,i| i % 7 == 4}
  diag[4].shift(2)
  diag[5] = columns.values.flatten.select.with_index{|_,i| i % 7 == 1}
  diag[5].pop
  diag[6] = columns.values.flatten.select.with_index{|_,i| i % 7 == 2}
  diag[6].pop(2)
  diag[7] = columns.values.flatten.select.with_index{|_,i| i % 5 == 4}
  diag[7].pop(3)
  diag[8] = columns.values.flatten.select.with_index{|_,i| i % 5 == 3}
  diag[8].pop(4)
  diag[9] = columns.values.flatten.select.with_index{|_,i| i % 5 == 3}
  diag[9].shift(4)
  diag[10] = columns.values.flatten.select.with_index{|_,i| i % 5 == 2}
  diag[10].shift(3)
  diag[11] = columns.values.flatten.select.with_index{|_,i| i % 5 == 1}
  diag[11].pop
  diag[11].shift(2)
  diag[12] = columns.values.flatten.select.with_index{|_,i| i % 5 == 0}
  diag[12].shift
  diag[12].pop(2)

  diag.values.map { |value| value.map { |cell| cell.piece}.each_cons(4) { |consecutive| consecutive_rows << consecutive}}

  return "X" if consecutive_rows.any?(["X", "X", "X", "X"])
  return "O" if consecutive_rows.any?(["O", "O", "O", "O"])
end

#endgame?Boolean

Returns:

  • (Boolean)


104
105
106
# File 'lib/board.rb', line 104

def endgame?
  columns.map { |header, column| column.last.empty?}.find_all { |cell| cell == false}.length == 7
end

#horizontal_win?Boolean

Returns:

  • (Boolean)


33
34
35
36
37
38
39
40
# File 'lib/board.rb', line 33

def horizontal_win?
  consecutive_rows = []

  columns.values.transpose.reverse.map { |value| value.map { |cell| cell.piece}.each_cons(4) { |consecutive| consecutive_rows << consecutive}}

  return "X" if consecutive_rows.any?(["X", "X", "X", "X"])
  return "O" if consecutive_rows.any?(["O", "O", "O", "O"])
end


22
23
24
25
26
27
28
29
30
31
# File 'lib/board.rb', line 22

def print_board
  puts columns.keys.join(" ")

  columns.values.transpose.reverse.map do |row|
    joined_row = row.map do |cell|
      cell.piece
    end
    puts joined_row.join(" ")
  end
end

#vertical_win?Boolean

Returns:

  • (Boolean)


42
43
44
45
46
47
48
49
# File 'lib/board.rb', line 42

def vertical_win?
  consecutive_rows = []

  columns.values.map { |column| column.map { |cell| cell.piece}.each_cons(4) { |consecutive| consecutive_rows << consecutive}}

  return "X" if consecutive_rows.any?(["X", "X", "X", "X"])
  return "O" if consecutive_rows.any?(["O", "O", "O", "O"])
end

#win_game?Boolean

Returns:

  • (Boolean)


86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
# File 'lib/board.rb', line 86

def win_game?
  if horizontal_win? == "X"
    return "X"
  elsif horizontal_win? == "O"
    return "O"
  elsif vertical_win? == "X"
    return "X"
  elsif vertical_win? == "O"
    return "O"
  elsif diagonal_win? == "X"
    return "X"
  elsif diagonal_win? == "O"
    return "O"
  else
    return false
  end
end