Случайные поля в сетке JavaScript

#javascript #jquery

#javascript #jquery

Вопрос:

Я создал сетку со случайными полями, желтыми и одним красным. Проблема в том, что иногда, когда я обновляю страницу, красное поле не появляется, оно где-то спрятано, я думаю, под желтым полем. Кроме того, иногда даже желтые поля отображаются не все. Я предполагаю, что есть проблема в цикле их создания?

 var grid = document.getElementById("grid-box");

for (var i = 1; i <= 100; i  ) {
  var square = document.createElement("div");
  square.className = 'square';
  square.id = 'square'   i;
  grid.appendChild(square);
}

var obstacles = [];

while (obstacles.length < 10) {
  var randomIndex = parseInt(99 * Math.random());

  if (obstacles.indexOf(randomIndex) === -1) {
    obstacles.push(randomIndex);
    document.getElementById('square'   randomIndex).style.backgroundColor = 'yellow';

  }
}

var playerOne = [];

while (playerOne.length < 1) {
  var randomIndex = parseInt(99 * Math.random());

  if (playerOne.indexOf(randomIndex) === -1) {
    playerOne.push(randomIndex);
    document.getElementById('square'   randomIndex).style.backgroundColor = 'red';

  }
}  
 #grid-box {
  width: 400px;
  height: 400px;
  margin: 0 auto;
  font-size: 0;
  position: relative;
}

#grid-box>div.square {
  font-size: 1rem;
  vertical-align: top;
  display: inline-block;
  width: 10%;
  height: 10%;
  box-sizing: border-box;
  border: 1px solid #000;
}  
 <script src="https://code.jquery.com/jquery-1.12.4.js"></script>
<div id="grid-box"></div>  

Комментарии:

1. if (playerOne.indexOf(randomIndex) === -1) похоже, это ошибка, поскольку вы заполнили только препятствия. Вы должны использовать if(playerOne.indexOf(randomIndex) === -1 obstacles.indexOf(randomIndex) === -1) просто чтобы убедиться, что он не используется

Ответ №1:

Вам нужно изменить 2 вещи:

1. начальное значение i должно быть равно 0 при создании квадратов

2. когда вы создадите красное поле, тогда

заменить

 if (playerOne.indexOf(randomIndex)
  

с помощью

 if (playerOne.indexOf(randomIndex) === -1 amp;amp; obstacles.indexOf(randomIndex) === -1) {
  

Вот окончательный код:

 var grid = document.getElementById("grid-box");

// create 100 squares
for (var i = 0; i < 100; i  ) { // first change
 var square = document.createElement("div");
 square.className = 'square';
 square.id = 'square'   i;
 grid.appendChild(square);
}

var obstacles = [];

while (obstacles.length < 10) {
var randomIndex = parseInt(99 * Math.random());
if (obstacles.indexOf(randomIndex) === -1) {        
    obstacles.push(randomIndex);
    document.getElementById('square'   randomIndex).style.backgroundColor = 'yellow';
 }
}

var playerOne = [];
while (playerOne.length < 1) {
 var randomIndex = parseInt(99 * Math.random());    
 if (playerOne.indexOf(randomIndex) === -1 amp;amp; obstacles.indexOf(randomIndex) === -1) { // second change
     playerOne.push(randomIndex);
     document.getElementById('square'   randomIndex).style.backgroundColor = 'red';
  }
}
  

Это потому, что, когда randomIndex будет равен нулю (0), тогда вы ищете элемент с идентификатором «square0», и он недоступен, потому что ваш цикл for запускается с 1 по 100.

Ответ №2:

Math.random() иногда возвращался бы 0 , но ваши идентификаторы начинаются с 1 , например: ‘square1’, нет ‘square0’ div .

Создайте свой цикл, начинающийся с 0 :

 for (var i = 0; i < 100; i  ){
  // Code here
}
  

Комментарии:

1. В дополнение к этому, PlayerOne устанавливается только один раз, PlayerOne. длина < 1, поэтому нет необходимости в массиве PlayerOne. Но его установка не проверяет препятствия. Так что легко случиться, что игрок преодолеет препятствие