Почему эта функция (которая помещает объекты в массив) приводит к сбою p5.js? - PullRequest
3 голосов
/ 16 мая 2019

Я создаю приложение для симуляции эволюции, в котором, если у определенного организма здоровье выше 75%, оно размножается, тогда здоровье вычитается наполовину.Чтобы сделать это, я создаю новый экземпляр класса, которому принадлежит объект, а затем помещаю указанный объект в массив, где хранятся другие организмы.Это приводит к сбою p5.js по причине, которую я не знаю.

Я попытался уменьшить количество организмов (3) и записать его как функцию класса.

var organisms = []; // array where organisms instances go

function reproduce(){
  for (let i = 0; i < organisms.length; i++){
     if(organisms[i].life > 0.75){
        // create a genetically similar size
        let size = organisms[i].size + (random() > 0.5 ? 1 : -1 * random() * 2);   
        // declare instance
        let org = new Organism(width, height, size)
        organisms.push(org);
        // prevent infinite reproduction
        organisms[i].life -= 0.5;
        }
    }
}

Я ожидаю, что это просто создаст новые экземпляры классов, но это приведет к сбою p5.js.

Ответы [ 2 ]

2 голосов
/ 16 мая 2019

Выполните итерацию по массиву и создайте новые организмы, а затем после цикла добавьте массив вновь созданных организмов в исходный массив.

Вот исполняемый фрагмент, который создает минимальный пример. Вызов метода random из вопроса был заменен вызовом Math.random(), а width и height были объявлены для устранения необходимости в p5.js.

    var organisms = []; // array where organisms instances go
    var width = 100;
	var height = 100;
	
	function Organism(w, h, s){
	this.width = w;
	this.height = h;
	this.size = s;
	this.life = .76;
	}
	organisms.push(new Organism(1,1,1));
    console.log("Organisms length before reproduce: " + organisms.length);
	reproduce();
    console.log("Oganisms length after reproduce:  "+organisms.length);

    function reproduce(){
      var organismsToAdd = [];
      for (let i = 0; i < organisms.length; i++){
         if(organisms[i].life > 0.75){
            // create a genetically similar size
            let size = organisms[i].size + (Math.random() > 0.5 ? 1 : -1 * Math.random() * 2);   
            // declare instance
            let org = new Organism(width, height, size)
            organismsToAdd.push(org);
            // prevent infinite reproduction
            organisms[i].life -= 0.5;
            }
        }
      //organisms = organisms.concat(organismsToAdd);
      // or
	  organisms.push.apply(organisms, organismsToAdd)
    }

Вот исполняемый фрагмент с p5.js

      var organisms = []; // array where organisms instances go

function setup(){
  createCanvas(100,100);
  	organisms.push(new Organism(1,1,1));
  noLoop();
  }
  
  function draw(){
   console.log("Organisms length before reproduce: " + organisms.length);
  	reproduce();
    console.log("Organisms length after reproduce: " + organisms.length);
  }
    function reproduce(){
      var organismsToAdd = [];
      for (let i = 0; i < organisms.length; i++){
         if(organisms[i].life > 0.75){
            // create a genetically similar size
            let size = organisms[i].size + (random() > 0.5 ? 1 : -1 * random() * 2);   
            // declare instance
            let org = new Organism(width, height, size)
            organismsToAdd.push(org);
            // prevent infinite reproduction
            organisms[i].life -= 0.5;
            }
        }
  //    organisms = organisms.concat(organismsToAdd);
	  organisms.push.apply(organisms, organismsToAdd)
    }
	  
	function Organism(w, h, s){
	  this.width = w;
	  this.height = h;
	  this.size = s;
	  this.life = .76;
	}

  
  
<script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/0.8.0/p5.min.js"></script>
0 голосов
/ 16 мая 2019

Вы создали условие цикла, которое может никогда не закончиться.

for (let i = 0; i < organisms.length; i++){

На первой итерации, скажем, организмы имеют 5 элементов.Если условие if на следующей строке выполнено, вы добавите еще один элемент в ваш массив organisms.Следующая итерация изменит следующий элемент в organisms, но, поскольку ваш массив увеличивается на единицу каждый раз, вы никогда не достигнете конца массива!

...