Advertisement
Guest User

Untitled

a guest
Jun 10th, 2020
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 2.62 KB | None | 0 0
  1. INF = Float::INFINITY
  2.  
  3. BOARD_ARRAY = [
  4.   [INF, 1, 1, 0, INF,   1,   1],
  5.   [INF, 1, 1, 1, 1,     1,   0],
  6.   [INF, 1, 0, 1, INF, INF, INF],
  7.   [1,   1, 1, 1, INF,   0,   1],
  8.   [1,   0, 1, 1, INF,   0,   1]
  9. ]
  10.  
  11. BOARD_ARRAY_TEST = [
  12.   [INF, 1, 1, 1, 1, 1, 0, INF,   1,   1],
  13.   [INF, 1, 1, 1, 1, 1, 1, 1,     1,   0],
  14.   [INF, 1, 0, 1, INF, INF, 1, 1, 1,  INF],
  15.   [1,   1, 1, 1, 1, 1, 1, INF,   0,   1],
  16.   [1,   0, 1, 1, 1, 1, 1, INF,   0,   1]
  17. ]
  18.  
  19. class Board
  20.   attr_reader :cells, :width, :height
  21.  
  22.   def initialize(array_2d)
  23.     @cells = build_cells(array_2d)
  24.     @height = array_2d.size
  25.     @width = array_2d[0].size
  26.   end
  27.  
  28.   def render
  29.     system("clear")
  30.  
  31.     puts "░" * (width + 2)
  32.     cells.each_slice(width) do |line|
  33.       puts "░" + line.join("") + "░"
  34.     end
  35.     puts "░" * (width + 2)
  36.   end
  37.  
  38.   def find(conditions)
  39.     cells.find do |cell|
  40.       conditions.all? do |key, value|
  41.         cell.send(key) == value
  42.       end
  43.     end
  44.   end
  45.  
  46.   def fill
  47.     render
  48.     queue = cells.select { |cell| cell.type == :flag }
  49.  
  50.     while current_cell = queue.shift
  51.       current_cell.editable_adjacent.each do |empty_cell|
  52.         if empty_cell.value.nil? || empty_cell.value > current_cell.value + 1
  53.           empty_cell.value = current_cell.value + 1
  54.           render
  55.           sleep 0.1
  56.           queue << empty_cell
  57.         end
  58.       end
  59.     end
  60.   end
  61.  
  62.   private
  63.  
  64.   def build_cells(array_2d)
  65.     array_2d.map.with_index do |line, y|
  66.       line.map.with_index do |cell, x|
  67.         Cell.new(board: self, x: x, y: y, value: cell)
  68.       end
  69.     end.flatten
  70.   end
  71. end
  72.  
  73. class Cell
  74.   attr_reader :x, :y, :type
  75.   attr_accessor :value
  76.  
  77.   def initialize(board:, x:, y:, value:)
  78.     @board = board
  79.     @x = x
  80.     @y = y
  81.     @type = infer_type(value)
  82.     @value = value if type == :flag
  83.   end
  84.  
  85.   def editable_adjacent
  86.     adjacent.select { |cell| cell.type == :empty }
  87.   end
  88.  
  89.   def to_s
  90.     case type
  91.     when :empty
  92.       value ? value.to_s : " "
  93.     when :flag
  94.       "*"
  95.     when :wall
  96.       "░"
  97.     end
  98.   end
  99.  
  100.   private
  101.  
  102.   attr_reader :board
  103.  
  104.   def infer_type(value)
  105.     case value
  106.     when Float::INFINITY
  107.       :wall
  108.     when 0
  109.       :flag
  110.     when 1
  111.       :empty
  112.     end
  113.   end
  114.  
  115.   def adjacent
  116.     [
  117.       board.find(x: x - 1, y: y - 1),
  118.       board.find(x: x, y: y - 1),
  119.       board.find(x: x + 1, y: y - 1),
  120.       board.find(x: x - 1, y: y),
  121.       board.find(x: x + 1, y: y),
  122.       board.find(x: x - 1, y: y + 1),
  123.       board.find(x: x, y: y + 1),
  124.       board.find(x: x + 1, y: y + 1)
  125.     ].compact
  126.   end
  127. end
  128.  
  129.  
  130. board = Board.new(BOARD_ARRAY_TEST)
  131. board.fill
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement