2016-10-26 3 views
3

Wir müssen eine JavaScript-Version von Conways Spiel des Lebens für ein Schulprojekt programmieren, aber wir stecken fest auf die Kanten. Die ganze Sache funktioniert gut, aber die Funktion, die die Anzahl der Nachbarn berechnet, funktioniert nicht auf den Zellen, die sich an den Kanten befinden (weil es Werte außerhalb des Arrays auswerten muss, die undefiniert sind). Wir haben verschiedene Optionen ausprobiert, aber alle ändern die Funktionalität des restlichen Programms.Stuck Programmierung Conways "Game of Life" in JS

Was sollten wir hinzufügen, um an den Rändern des Gitters zu arbeiten?

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; 
 
};

Dank!

+0

Überprüfen Sie, ob Sie einen Block am Rand machen. Wenn ja, versuche nicht auf die zuzugreifen, die du nicht kannst. Ich denke, all diese 'if's können refaktoriert werden. Das macht das Anwenden von Punkt eins einfacher. (Wenn Sie Kantenzugriffe auf die nullte Schleife umschlingen müssen, denken Sie daran, dass der Modulus '%' Ihr Freund ist.) –

+0

Was meinen Sie mit einem "Block am Rand"? Irgendwelche Vorschläge, wie man die 'if's umgestaltet? Wir haben es ausprobiert und es stellte sich heraus, dass es noch länger war, haha. – Dat8StringGuy

+0

Was ich mit "Block am Rand" meine, ist eine Zelle, die keine Zellen auf einer oder mehreren Seiten hat (dh keine Zellen darüber und/oder daneben und/oder darunter.) Nach einem kurzen Lauf zum Gemischtwarenladen, ich kann zurückkommen und versuchen, es zu refaktorisieren. (Es könnte in einer längeren Lösung * Linie * weise enden, aber es sollte eine * reinere * Lösung sein.) –

Antwort

3

ich mit etwas mehr wie das gehen würde:
Wie Sie sehen können, habe ich ein wenig Refactoring.

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: Ihr ursprüngliches Codebeispiel ist 37 Zeilen ohne Kommentare. Mein Codebeispiel ist 52 Zeilen mit Kommentare und 33 Zeilen ohne Kommentare.

So nah wie ich kann, ist dieser Weg sauberer und kürzer. ;)