模拟鼠标移动,不工作

时间:2016-10-01 11:27:09

标签: javascript oop processing p5.js

我试图创建一个模拟150个鼠标在p5.js中移动20x20网格(像libary这样的处理)。首先,我会随机产生150只老鼠,一切都很顺利。但是在我产生鼠标之后,我试图让它们移动到他们的邻居之一。而不是移动到其中一个邻居并使当前方块为空它保持在已经是一个+它移动到下一个的那个而不是有150个鼠标而我突然有300 ...我试过改变代码几个小时但我无法找到问题...这是我的代码:

var w = 40;
var grid = [];
var mouses = 10;
var mouseAmount = [];
var Mouse;
var current;



function setup() {
  createCanvas(800, 800);
  cols = floor(width/w)
  rows = floor(height/w)
  // frameRate(60);

  for (var j = 0; j < rows; j++) {
    for ( var i = 0; i < cols; i++) {
      var cell = new Cells(i,j);
      grid.push(cell);
    }
  }
  amount = new Amount;
}

function draw() {
  background(51);
  for ( var i = 0; i < grid.length; i++) {
    grid[i].show();
  }

  amount.run();

}

function index(i, j) {
  if (i < 0 || j < 0 ||  i > cols-1 || j > rows-1 ) {
    return -1;
  }
  return i + j * cols;
}


function Cells(i, j) {
  this.i = i;
  this.j = j;
  this.active = false;

  this.moveCell = function() {
    var neighbors = [];



    var top = grid[index(i, j -1)];
    var right = grid[index(i+1, j)];
    var bottom = grid[index(i, j+1)];
    var left = grid[index(i-1, j)];

    if (top) {
      neighbors.push(top)
    }

    if (right) {
      neighbors.push(right)
    }

    if (bottom) {
      neighbors.push(bottom)
    }

    if (left) {
      neighbors.push(left)
    }

    if(neighbors.length > 0) {
      var r = floor(random(0, neighbors.length));
      return neighbors[r];
    } else {
      return undefined;
    }

  }



  this.show = function() {
    var x = this.i*w;
    var y = this.j*w;
    stroke(255);
    noFill();
    rect(x,y,w,w);

    if(this.active == true) {
      fill(155, 0, 255, 100)
      rect(x, y, w, w)
    }

  }
}

function Amount() {
  this.run = function() {
    var r = floor(random(grid.length))
    for (var i = 0; i < mouses; i++) {
      var mouse = grid[r];
      mouseAmount.push(mouse)
    }


    if (mouseAmount.length < 1499) {
      for (var i = 0; i < mouseAmount.length; i++) {
        mouseAmount[i].active = true;
      }
    }
    if (mouseAmount.length > 1499) {
      Next();
    }
  }
}


function Next(i,j) {
  for (var i = 0; i < mouseAmount.length; i++) {
    current = mouseAmount[i];
    var nextCell = current.moveCell();
    if (nextCell) {
      nextCell.active = true;
      current.active = false;
      current = nextCell;
    }
  }
}

提前谢谢你:)

1 个答案:

答案 0 :(得分:1)

我并不完全明白你的代码应该做什么,但有些事情对我的代码很突出:

问题一:我不明白你是如何迭代grid数组的。你好像在迭代mouseAmount,因为某种原因它似乎从网格中保留了随机单元格?这对我来说没有多大意义。你为什么不直接迭代grid数组?

问题二:然后将单元格随机移动到邻居,但不考虑邻居是否已经处于活动状态。我不确定你想要发生什么,但这看起来有点奇怪。

问题三:通常使用这样的模拟,您必须将下一代复制到新的数据结构中,而不是在单步执行时修改数据结构。

最大的问题是你没有真正解释你希望你的代码做什么,或者代码做了什么,或者这两个方面有什么不同。但如果我是你,我会做出以下改变:

第一步:以更合理的方式迭代grid数组。只需迭代每个索引,并为每个单元格采取适当的操作。如果我是你,我会使用2D数组并使用嵌套的for循环迭代它。

第二步:确保您移动到邻居的逻辑是正确的。您是否希望细胞移动到已经活跃的细胞?

第三步:在修改grid前复制一份{{1}}。以这种方式思考:当你在网格上迭代时,假设你将一个单元格向下移动一行。然后你继续迭代,你将再次到达新活动的单元格。换句话说,你将在一代中触摸同一个活动单元两次,这肯定会让你感到困惑。

建议:首先使用单个活动单元。由于你一次有很多事情发生,所以真的很难分清楚是怎么回事。退后一步,确保它适用于一个活动单元格,然后再向上移动整个网格。