2016-10-01 181 views
0

我想创建一个模拟150个鼠标在p5.js(像库里处理)20x20网格内移动。首先我随机产生150个鼠标,一切都很顺利。但在我产卵后,我试图让他们搬到邻居家中。而不是移动到其中一个邻居,并使目前的广场是空的它停留在那个已经是一个+它移动到下一个,所以而不是有150个鼠标我突然有300 ...我试图改变代码几个小时,但我无法找到proplem ...这里是我的代码:模拟鼠标移动,不工作

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

我真的不明白到底是什么代码是应该做的,但有几件事对我来说很有代表性:

问题一:我不明白你是怎么回事通过你的grid阵列。你似乎在迭代mouseAmount,由于某种原因,它似乎从网格中持有随机单元格?这对我来说没有多大意义。为什么不直接迭代grid数组?

问题二:然后您将小区随机移动到邻居,但不考虑邻居是否已经激活。我不确定你想要发生什么,但这似乎有点奇怪。

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

最大的问题是,你还没有真正解释你想要你的代码做,或者什么这个代码来替代,或者这两件事有何不同。但如果我是你,我会做出以下更改:

第一步:以更合理的方式对grid数组进行迭代。只需遍历每个索引并针对每个单元采取适当的操作即可。如果我是你,我会使用一个二维数组,并使用嵌套的for循环遍历它。

第二步:请确保您的移动到邻居的逻辑是正确的。你想要细胞移动到已经活动的细胞?

第三步:在修改它之前,请复制grid。这样想一想:当你迭代网格时,假设你将一个单元向下移动一行。然后继续迭代,您将再次到达新激活的单元格。换句话说,你会在同一代中两次触摸同一个活动单元格,这肯定会让你感到困惑。

建议的意见:首先让这个工作为单个活动单元格。由于你一次有很多事情正在进行,所以很难说出发生了什么。退后一步,确保它适用于一个活动单元格,然后再移动到整个网格。

+0

谢谢你花时间帮我用我的杂乱的代码:)我现在工作了。但是,我知道这可能看起来很奇怪,但即使它正在移动的单元格处于活动状态,但我希望它移动到该单元格,但我希望单元格在双重活动状态下可以更改颜色。你现在可能怎么做? 谢谢;) –