class Minesweeper::Core::Minefield

Constants

OFFSETS

Attributes

row_count[R]

Public Class Methods

new(row_count) click to toggle source
# 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

Public Instance Methods

flag_at(row_index, col_index) click to toggle source
# 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) click to toggle source
# 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) click to toggle source
# 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) click to toggle source
# 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_s() click to toggle source
# File lib/minesweeper/core/minefield.rb, line 25
def to_s
  @cells.flatten.join
end
unflag_at(row_index, col_index) click to toggle source
# 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) click to toggle source
# 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

Private Instance Methods

all_mines_flagged?() click to toggle source
# File lib/minesweeper/core/minefield.rb, line 91
def all_mines_flagged?
  mined_cells = @all_mine_coords.map { |coords| cell_at(*coords) }
  mined_cells.all?(&:flagged?)
end
cell_at(row_index, col_index) click to toggle source
# File lib/minesweeper/core/minefield.rb, line 70
def cell_at(row_index, col_index)
  @cells[row_index][col_index]
end
cell_exists_at?(row_index, col_index) click to toggle source
# File lib/minesweeper/core/minefield.rb, line 54
def cell_exists_at?(row_index, col_index)
  (0...@row_count).include?(row_index) && (0...@row_count).include?(col_index)
end
cells_around(row_index, col_index) click to toggle source
# File lib/minesweeper/core/minefield.rb, line 66
def cells_around(row_index, col_index)
  cells_coords_around(row_index, col_index).map { |coords| cell_at(coords[0], coords[1])}
end
cells_coords_around(row_index, col_index) click to toggle source
# File lib/minesweeper/core/minefield.rb, line 49
def cells_coords_around(row_index, col_index)
  coords_around = OFFSETS.map { |coords| [row_index + coords[0], col_index + coords[1]] }
  coords_around.select { |coords| cell_exists_at?(coords[0], coords[1]) }
end
create_explosive_cell_at(row_index, col_index) click to toggle source
# File lib/minesweeper/core/minefield.rb, line 40
def create_explosive_cell_at(row_index, col_index)
  mines_around = mines_adjacent_to(row_index, col_index)
  @cells[row_index][col_index] = Elements::Cell.new(Explosives::Mine.new, mines_around)
end
create_non_explosive_cell() click to toggle source
# File lib/minesweeper/core/minefield.rb, line 21
def create_non_explosive_cell
  Elements::Cell.new(Explosives::NullMine.new)
end
increase_mine_counters_around(row_index, col_index) click to toggle source
# File lib/minesweeper/core/minefield.rb, line 62
def increase_mine_counters_around(row_index, col_index)
  cells_around(row_index, col_index).each { |cell| cell.mines_around += 1 }
end
mines_adjacent_to(row_index, col_index) click to toggle source
# File lib/minesweeper/core/minefield.rb, line 45
def mines_adjacent_to(row_index, col_index)
  cells_coords_around(row_index, col_index).count { |coords| @all_mine_coords.include?(coords) }
end
register_mine_at(row_index, col_index) click to toggle source
# File lib/minesweeper/core/minefield.rb, line 58
def register_mine_at(row_index, col_index)
  @all_mine_coords << [row_index, col_index]
end