Bonjour, n'ayant jamais codé de Jeu de la Vie auparavant, j'ai voulu m'y essayer. Néamoins je me suis rendu compte qu'après (selon moi) avoir correctement appliqué les règles, mon algorithme n'arrive n'affiche pas les motifs qu'ils devrait.
Sans tarder, le code qui effectue l'évolution :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | void GameCtx_set_status(GameCtx *game, const Uint16 x, const Uint16 y) { Uint16 i, j, neighbours = 0; Uint16 xmin, ymin, xmax, ymax; _Bool status = game->grid[y][x]; !x ? (xmin = 0) : (xmin = x - 1); !y ? (ymin = 0) : (ymin = y - 1); (x < GRID_X - 1) ? (xmax = x + 1) : (xmax = GRID_X - 2); (y < GRID_Y - 1) ? (ymax = y + 1) : (ymax = GRID_Y - 2); for(j = ymin; j <= ymax; j++) { for(i = xmin; i <= xmax; i++) { if(game->grid[j][i]) neighbours++; } } if(status) neighbours--; if(!status && neighbours == 3) status = 1; if(status && (neighbours < 2 || neighbours > 3)) status = 0; game->grid[y][x] = status; } void GameCtx_evolve(GameCtx *game) { Uint16 i, j; for(j = 0; j < GRID_Y; j++) { for(i = 0; i < GRID_X; i++) GameCtx_set_status(game, i, j); } } |
Pourtant en regardant les règles, je trouve son évolution normale. Selon Wikipedia :
devrais donner et à nouveau et se répéter à l'infini.
Ici, ces trois cellules initiales deviennent puis
En sachant que je parcours la grille de gauche à droite et de haut en bas :
Au premier tour : Rien ne change pour la cellule en haut à gauche, la suivante devient vivante car elle a trois voisines, la suivante aussi, ensuite sur la nouvelle ligne celle à gauche ne change pas car elle a deux voisines, la suivante meure car elle a quatre voisines, et rien ne change pour la dernière.
Au second tour : Il n'y a aucun changement pour les deux premières cellules vivantes, la suivante meure car elle n'a qu'une vosine, celle d'après nait, et la dernière ne change pas.
On arrive donc à un motif stable, ce qui m'a l'air normal. Alors comment ce fait-il que selon wikipedia et plein d'autre ce motif devrait revenir à son origine ? Est-ce j'ai loupé quelque chose ? J'aimerais comprendre comment l'évolution devrais normalement se dérouler.