2016-10-01 102 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

謝謝你花時間幫我用我的雜亂的代碼:)我現在工作了。但是,我知道這可能看起來很奇怪,但即使它正在移動的單元格處於活動狀態,但我希望它移動到該單元格,但我希望單元格在雙重活動狀態下可以更改顏色。你現在可能怎麼做? 謝謝;) –