Je crée donc un programme qui simule des automates cellulaires de type Life, mais j'ai des problèmes avec la méthode utilisée pour compter les voisins vivants d'une cellule. Le problème est que je veux être en mesure de changer la façon dont la grille s'enroule autour - à savoir, si elle s'enroule autour de gauche à droite (c.-à-cylindrique), de haut en bas et gauche à droite (c'est-à-dire, toroïdal), ou pas du tout (c'est à dire, plat) - et je ne peux pas comprendre comment rendre ma méthode compte pour cela. Voici ce que j'ai jusqu'à présent:Comment compter les voisins d'une cellule dans un automate cellulaire avec wraparound
public int getLiveNeighbors(int row, int col)
{
int count = 0;
// "topology" is an int that represents wraparound:
// 0 = flat; 1 = cylindrical; 2 = toroidal
int top = topology != 2 ? row - 1 : (row + ROWS - 1) % ROWS;
int bottom = topology != 2 ? row + 1 : (row + 1) % ROWS;
int left = topology != 0 ? (col + COLS - 1) % COLS : col - 1;
int right = topology != 0 ? (col + 1) % COLS : col + 1;
for (int r = top; r < bottom + 1; r++)
for (int c = left; c < right + 1; c++)
if (!(r == row && c == col) && getCell(r, c).equals(LIVE))
count++;
}
La clé, je pense, est le if
-Déclaration dans le for
-loop - il doit y avoir un moyen de vérifier si r
et c
sont dans les limites de la grille, tout en gardant à l'esprit que la définition de "bounds" variera en fonction de l'enroulement de la grille. Dans le passé, j'ai contourné cela en ayant trois ensembles différents (un pour chaque paramètre enveloppant) de huit états différents if
pour vérifier individuellement chacune des huit cellules composant le voisinage de la cellule d'origine; Comme vous pouvez l'imaginer, ce n'était pas très joli, mais au moins cela a fonctionné. Je ne suis pas très douée pour expliquer mon propre code, alors j'espère que ce n'était pas trop déroutant - je me sens un peu bouclé moi-même (ha). Si vous avez des questions, n'hésitez pas à demander!
OK, je suis allé trop vite ici à cause du cas des indices négatifs pour x et y (la grille commence à 0,0). En outre, il s'avère que l'opérateur Java% renvoie un reste plutôt qu'un module approprié. Cela compte avec des nombres négatifs (par exemple -1% 4 = -1 et non 3). Math.floorMod produit le comportement correct. Voir la déclaration de remplacement ci-dessus. – stegzzz