Автоматическое заполнение сетки ячеек

353
23 декабря 2017, 07:28

Есть поле пикселей и код для выбора пикселя, который меняет цвет:

$(".pixel").click(function() { 
  $(this).toggleClass("white"); 
  $(this).toggleClass("black"); 
}) 
var delta; 
var isCall = false; 
if (!isCall) { 
  var zoom = 1; 
  isCall = true; 
}
#art { 
  width: 101px; 
  height: 101px; 
  display: table; 
  border-spacing: 1px; 
  background-color: #d8d8d8; 
} 
 
.row { 
  display: table-row; 
} 
 
.pixel { 
  display: table-cell; 
} 
 
.black { 
  background-color: black; 
} 
 
.white { 
  background-color: white; 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
<div id="art"> 
  <div class="row"> 
    <div class="pixel white" id="1-1"></div> 
    <div class="pixel white" id="1-2"></div> 
    <div class="pixel white" id="1-3"></div> 
    <div class="pixel white" id="1-4"></div> 
    <div class="pixel white" id="1-5"></div> 
  </div> 
  <div class="row"> 
    <div class="pixel white" id="2-1"></div> 
    <div class="pixel white" id="2-2"></div> 
    <div class="pixel white" id="2-3"></div> 
    <div class="pixel white" id="2-4"></div> 
    <div class="pixel white" id="2-5"></div> 
  </div> 
  <div class="row"> 
    <div class="pixel white" id="3-1"></div> 
    <div class="pixel white" id="3-2"></div> 
    <div class="pixel white" id="3-3"></div> 
    <div class="pixel white" id="3-4"></div> 
    <div class="pixel white" id="3-5"></div> 
  </div> 
  <div class="row"> 
    <div class="pixel white" id="4-1"></div> 
    <div class="pixel white" id="4-2"></div> 
    <div class="pixel white" id="4-3"></div> 
    <div class="pixel white" id="4-4"></div> 
    <div class="pixel white" id="4-5"></div> 
  </div> 
  <div class="row"> 
    <div class="pixel white" id="5-1"></div> 
    <div class="pixel white" id="5-2"></div> 
    <div class="pixel white" id="5-3"></div> 
    <div class="pixel white" id="5-4"></div> 
    <div class="pixel white" id="5-5"></div> 
  </div> 
</div>

Но возникла необходимость автоматически заполнять все поле, допустим я нажимаю на какую-нибудь клеточку и с небольшими задержками заполняются рандомные соседние клеточки(как домино падает во все стороны) и так пока не будет заполнено все поле. Такое возможно вообще реализовать? Мне намекнули, что похожий алгоритм в игре KAMI, но я пока не придумал, как такое можно сделать, поэтому надеюсь на ваши советы.

Answer 1

var size = 20; 
for (var i = 0; i < size; i++) { 
  var row = $('<div class="row"></div>'); 
  $("#art").append(row); 
  for (var j = 0; j < size; j++) { 
    row.append('<div class="pixel white"></div>'); 
  } 
} 
 
 
var timerFind = null; 
var convert = []; 
$(".pixel").click(function() { 
  $(this).removeClass("white"); 
  $(this).addClass("black"); 
  if (timerFind) 
    return;       
 
  function FindPixels() { 
    var matrix = []; 
    $(".row").each(function(iRow, row){ 
      matrix[iRow] = []; 
      $(row).find(".pixel").each(function(iPix, pix){ 
        matrix[iRow].push($(pix)); 
      }); 
    }); 
   
    var blacks = []; 
    for (var iRow = 0; iRow < matrix.length; iRow++) { 
      for (var iPix = 0; iPix < matrix[iRow].length; iPix++) { 
        if (matrix[iRow][iPix].hasClass("black")) 
          blacks.push({ row: iRow, col: iPix }); 
      }   
    } 
 
    for (var iB = 0; iB < blacks.length; iB++) { 
      for (var i = Math.max(0, blacks[iB].row-1);  
          i <= Math.min(matrix.length-1, blacks[iB].row+1); i++) { 
        for (var j = Math.max(0, blacks[iB].col-1);  
            j <= Math.min(matrix[0].length-1, blacks[iB].col+1); j++) { 
          if ((i == blacks[iB].row || j == blacks[iB].col) &&  
              matrix[i][j].hasClass("white") &&  
              convert.indexOf(matrix[i][j]) == -1) { 
            convert.push(matrix[i][j]); 
            $("#convert").text(convert.length); 
          } 
        } 
      } 
    } 
 
    if (convert.length > 0) { 
          var index = Math.floor(Math.random() * convert.length) 
          convert[index].removeClass("white"); 
          convert[index].addClass("black"); 
          convert = []; 
          $("#convert").text(convert.length); 
    } 
 
    if ($(".pixel.white").length == 0) { 
      console.log("done"); 
    } else { 
      timerFind = setTimeout(FindPixels, 100); 
    } 
  } // FindPixels 
 
  timerFind = setTimeout(FindPixels, 100); 
}); 
 
$(".row").last().find(".pixel").last().click();
#art { 
  width: 181px; 
  height: 181px; 
  display: table; 
  border-spacing: 1px; 
  background-color: #d8d8d8; 
} 
 
.row { 
  display: table-row; 
} 
 
.pixel { 
  display: table-cell; 
} 
 
.black { 
  background-color: black; 
} 
 
.white { 
  background-color: white; 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
<span id="convert">0</span> 
<div id="art"> 
</div>

READ ALSO
Как сделать правильный подбор чисел в массиве?

Как сделать правильный подбор чисел в массиве?

Есть два массива - число а, которое может принадлежать числам 6,7,8,9 и сумма а и b, которая может принадлежать числам 11,12,13,14Из массива а наугад...

287
Циклы и Promise

Циклы и Promise

Есть цепочка промисов, первый берет id пользователей из БД, потом по нему нужно достать его группы, и имена конструкторовИ это все может быть...

281
Как правильней использовать mousemove в angular2?

Как правильней использовать mousemove в angular2?

Сделал прокрутку с мышкой налево и направоНо чуть не правильно

229
Видео внутри текста

Видео внутри текста

Нужно в #30 вставить видео (Смотреть Картинку ниже по ссылку) Чтобы в этой цифре с решеткой показывалось видео)))

221