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

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

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>
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
1
280
2

Ответы 2

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

Запустите цикл с 0: for (var i = 0; i < 100; i++)

you have to change 2 things:

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

2. когда вы делаете красную коробку, то

заменять

if (playerOne.indexOf(randomIndex)

с участием

if (playerOne.indexOf(randomIndex) === -1 && 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 && obstacles.indexOf(randomIndex) === -1) { // second change
     playerOne.push(randomIndex);
     document.getElementById('square' + randomIndex).style.backgroundColor = 'red';
  }
}

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

Другие вопросы по теме