2016-10-26 6 views
3

Мы должны запрограммировать версию игры Conway's Life of life для школьного проекта, но мы зацикливаемся на краях. Все это прекрасно работает, но функция, которая вычисляет количество соседей, не работает на ячейках, находящихся на краях (потому что она должна оценивать значения вне массива, которые не определены). Мы пробовали несколько вариантов, но все они меняют функциональность остальной части программы.Застрял программирование «Игры жизни» Конвей в JS

Что нам следует добавить для работы на краях сетки?

var totalNeighbors = function(x, y) { 
 
    var total = 0; 
 

 
    if (x > 0 && cells[(x - 1)][y] == 1) { 
 
     total++; 
 
    } 
 

 
    if (x < (width - 1) && cells[x + 1][y] == 1) { 
 
     total++; 
 
    } 
 

 
    if (y > 0 && cells[x][y - 1] == 1) { 
 
     total++; 
 
    } 
 

 
    if (y < (height - 1) && cells[x][y + 1] == 1) { 
 
     total++; 
 
    } 
 

 
    if (y > 0 && x > 0 && cells[x - 1][y - 1] == 1) { 
 
     total++; 
 
    } 
 

 
    if (y > 0 && x < (width - 1) && cells[x + 1][y - 1] == 1) { 
 
     total++; 
 
    } 
 

 
    if (y < (height - 1) && x > 0 && cells[x - 1][y + 1] == 1) { 
 
     total++; 
 
    } 
 

 
    if (y < (height - 1) && x < (width - 1) && cells[x + 1][y + 1] == 1) { 
 
     total++; 
 
    } 
 

 
    return total; 
 
};

Спасибо!

+0

Проверьте, выполняете ли вы блок по краю. Если да, не пытайтесь получить доступ к тем, которые вы не можете. Я думаю, что все эти 'if's могут быть реорганизованы. Это упростит задачу. (Если вам нужно обращать к краю обращения к нулевому, помните, что модуль, '%', ваш друг.) –

+0

Что вы подразумеваете под «блоком на краю»? Любое предложение о том, как реорганизовать 'if's? Мы попробовали, и оказалось, что он еще длиннее ха-ха. – Dat8StringGuy

+0

То, что я подразумеваю под «block on the edge», является ячейкой, у которой нет ячеек на одной или нескольких сторонах (т. Е. У нее нет ячеек над ней и/или рядом с ней и/или ниже нее.) После быстрого перехода к продуктовый магазин, я могу вернуться и попробовать свои силы при реорганизации. (Это может закончиться в более длинном решении * line * wise, но это должно быть решение * cleaner *.) –

ответ

3

Я бы с чем-то более, как это:
Как вы можете видеть, я реорганизованным немного.

var isvalid = function(x, y) { 
     /* 
     * This returns 1 if cells[x][y] == 1. 
     * Otherwise, we return 0. 
     * NOTE: If cells[x, y] is out of bounds, we return 0. 
     * GLOBALS USED: cells, width, and height. 
     */ 

     //This returns true if (index < size && index >= 0) 
     //Used to check that index is not an invalid index. 
     var inbounds = function (size, index) { 
       return (index >= 0 && index < size); 
     }; 

     //given point is out of bounds 
     if (!inbounds(width, x) || !inbounds(height, y)) { 
       return 0; 
     } 

     //everything is good 
     return (cells[x][y] === 1) ? 1 : 0; 
    }; 

var totalNeighbors = function(x, y) { 
    var total = 0; 

    //cells[x-1][y] 
    total += isvalid(x-1, y); 

    //cells[x + 1][y] 
    total += isvalid(x+1, y); 

    //cells[x][y - 1] 
    total += isvalid(x, y-1); 

    //cells[x][y + 1] 
    total += isvalid(x, y+1); 

    //cells[x - 1][y - 1] 
    total += isvalid(x-1, y-1); 

    //cells[x + 1][y - 1] 
    total += isvalid(x+1, y-1); 

    //cells[x - 1][y + 1] 
    total += isvalid(x-1, y+1); 

    //cells[x + 1][y + 1] 
    total += isvalid(x+1, y+1); 

    return total; 
}; 

PS: Ваш исходный код образца 37 строк без комментариев. Мой пример кода - 52 строки с комментариями и 33 строками без комментариев.

Как можно ближе, этот способ чище и короче. ;)