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