Class: Minesweeper::Core::Minefield

Inherits:
Object
  • Object
show all
Defined in:
lib/minesweeper/core/minefield.rb

Constant Summary collapse

OFFSETS =
[[-1, -1], [-1, 0], [-1, 1], [0, 1], [0, -1], [1, 1], [1, 0], [1, -1]]

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(row_count) ⇒ Minefield

Returns a new instance of Minefield.

Raises:

  • (ArgumentError)


14
15
16
17
18
19
# File 'lib/minesweeper/core/minefield.rb', line 14

def initialize(row_count)
  raise ArgumentError unless row_count > 0
  @row_count = row_count
  @cells = Array.new(row_count) { Array.new(row_count) { create_non_explosive_cell } }
  @all_mine_coords = []
end

Instance Attribute Details

#row_countObject (readonly)

Returns the value of attribute row_count.



10
11
12
# File 'lib/minesweeper/core/minefield.rb', line 10

def row_count
  @row_count
end

Instance Method Details

#flag_at(row_index, col_index) ⇒ Object



85
86
87
88
89
# File 'lib/minesweeper/core/minefield.rb', line 85

def flag_at(row_index, col_index)
  verify_coordinates_existance(row_index, col_index)
  cell_at(row_index, col_index).flag
  raise MinefieldSolvedError if !@all_mine_coords.empty? && all_mines_flagged?
end

#hide_mine_at(row_index, col_index) ⇒ Object



29
30
31
32
33
34
# File 'lib/minesweeper/core/minefield.rb', line 29

def hide_mine_at(row_index, col_index)
  verify_coordinates_existance(row_index, col_index)
  create_explosive_cell_at(row_index, col_index)
  register_mine_at(row_index, col_index)
  increase_mine_counters_around(row_index, col_index)
end

#mines_around(row_index, col_index) ⇒ Object



101
102
103
# File 'lib/minesweeper/core/minefield.rb', line 101

def mines_around(row_index, col_index)
  cell_at(row_index, col_index).mines_around
end

#reveal_at(row_index, col_index) ⇒ Object



74
75
76
77
78
79
80
81
82
83
# File 'lib/minesweeper/core/minefield.rb', line 74

def reveal_at(row_index, col_index)
  verify_coordinates_existance(row_index, col_index)
  return if cell_at(row_index, col_index).revealed?
  cell_at(row_index, col_index).reveal
  if cell_at(row_index, col_index).mines_around.zero?
    cells_coords_around(row_index, col_index).each do |coords|
      reveal_at(coords[0], coords[1]) unless cell_at(coords[0], coords[1]).revealed?
    end
  end
end

#to_sObject



25
26
27
# File 'lib/minesweeper/core/minefield.rb', line 25

def to_s
  @cells.flatten.join
end

#unflag_at(row_index, col_index) ⇒ Object



96
97
98
99
# File 'lib/minesweeper/core/minefield.rb', line 96

def unflag_at(row_index, col_index)
  verify_coordinates_existance(row_index, col_index)
  cell_at(row_index, col_index).unflag
end

#verify_coordinates_existance(row_index, col_index) ⇒ Object

Raises:

  • (RangeError)


36
37
38
# File 'lib/minesweeper/core/minefield.rb', line 36

def verify_coordinates_existance(row_index, col_index)
  raise RangeError unless cell_exists_at?(row_index, col_index)
end