2016-10-01 6 views
0

Я пытаюсь создать симуляцию 150 мышей, перемещающихся внутри сетки 20x20 в p5.js (обработка как libary). Во-первых, я роняю 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?

Проблема вторая: Затем вы произвольно перемещаете ячейки в соседний, но вы не принимаете во внимание, активен ли сосед или нет. Я не уверен, что вы хотите, но это кажется немного странным.

Задача 3: Обычно с такими симуляциями вам необходимо скопировать следующее поколение в новую структуру данных, а не изменять структуру данных при ее прохождении.

Самая большая проблема заключается в том, что вы на самом деле не объяснили, что хотите, чтобы ваш код делал, или что этот код делает, или как эти две вещи разные. Но если бы я был вами, я внес бы следующие изменения:

Шаг первый: Итерации над вашим grid массивом более разумным способом. Просто перебирайте каждый индекс и выполняйте соответствующие действия для каждой ячейки. Если бы я был вами, я бы просто использовал 2D-массив и использовал вложенный цикл for, чтобы перебирать его.

Шаг второй: Убедитесь, что ваша логика для перехода к соседству правильная. Вы хотите, чтобы ячейки переместились в уже активные ячейки?

Шаг третий: Сделайте копию grid, прежде чем изменять ее. Подумайте об этом так: когда вы перебираете сетку, допустим, вы перемещаете ячейку на одну строку. Затем вы продолжите повторение, вы снова попадете в новую активную ячейку. Другими словами, вы будете касаться одной и той же активной ячейки дважды в одном поколении, что определенно собирается вас повредить.

Одно из рекомендаций: получите эту работу за одну активную ячейку. Трудно сказать, что происходит, поскольку у вас так много всего происходит. Сделайте шаг назад и убедитесь, что он работает для одной активной ячейки, прежде чем перейти к созданию всей сетки.

+0

Спасибо, что нашли время, чтобы помочь мне с моим грязным кодом :) Я получил его сейчас. Но да, я знаю, что это может показаться странным, но даже если ячейка, в которую он перемещается, активна, я хочу, чтобы она переместилась на нее, я просто хочу, чтобы ячейка меняла цвет, если она двойная. Возможно, теперь, как я могу это сделать? Спасибо;) –