2016-10-26 1 views
3

Nous devons programmer une version JavaScript du jeu de la vie de Conway pour un projet d'école, mais nous sommes bloqués sur la boucle des bords. Le tout fonctionne bien, mais la fonction qui calcule le nombre de voisins ne fonctionne pas sur les cellules qui sont sur les bords (car il doit évaluer les valeurs en dehors du tableau, qui ne sont pas définies). Nous avons essayé plusieurs options, mais elles modifient toutes les fonctionnalités du reste du programme. Que faut-il ajouter pour travailler sur les bords de la grille?Programmation bloquée «Jeu ​​de la vie» de Conway dans 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; 
 
};

Merci!

+0

Vérifiez si vous faites un bloc sur le bord. Si oui, n'essayez pas d'accéder à ceux que vous ne pouvez pas. Je pense que tous ces 'if's peuvent être refactorisés. Faire cela rendra l'application du point un plus facile. (Si vous devez boucler des accès de bord autour du zéro, souvenez-vous que le module, '%', est votre ami.) –

+0

Qu'entendez-vous par "bloc sur le bord"? Toute suggestion sur la façon de refactoriser le 'if's? Nous l'avons essayé et il s'est avéré être encore plus long haha. – Dat8StringGuy

+0

Ce que je veux dire par "bloquer sur le bord" est une cellule qui n'a pas de cellules sur un ou plusieurs côtés (c'est-à-dire qu'il n'y a pas de cellules au dessus et/ou en dessous). épicerie, je peux revenir et essayer de la refactoriser. (Il pourrait se retrouver dans une solution plus longue * ligne * sage, mais cela devrait être une solution * plus propre.) –

Répondre

3

je partirais avec quelque chose comme ceci:
Comme vous pouvez le voir, je un peu remaniée avec.

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: Votre exemple de code d'origine est de 37 lignes sans commentaires. Mon échantillon de code est 52 lignes avec commentaires et 33 lignes sans commentaires. Aussi près que je peux comprendre, de cette façon est plus propre et plus courte. ;)