2010-10-23 7 views
1

Cela compile et fonctionne bien, mais les résultats sont totalement différents de ce qu'ils devraient être.Pourquoi mon jeu C++ de vie ne fonctionne pas correctement?

Je suis Snipped Code hors de propos:

bool grid[1280][1024]; // hardcoded to my screen res for now 

for (int x = 0; x<1280; x++)  //init grid to false 
{ 
    for (int y = 0; y<1024; y++) 
    { 
     grid[x][y] = false; 
    } 
} 

grid[320][120] = true; // add a simple pattern 
grid[320][121] = true; 
grid[320][122] = true; 
grid[320][123] = true; 
grid[320][124] = true; 
grid[320][125] = true; 
grid[320][126] = true; 
grid[320][127] = true; 
grid[320][128] = true; 

// [snipped] 

for (int x = 1; x< (1280 - 1); x++) 
{ 
    for (int y = 1; y< (1024 - 1); y++) 
    { 
     int n = 0; // neighbours 
     if (grid[x-1][y-1]) n++; // top left 
     if (grid[x][y-1]) n++; // top middle 
     if (grid[x+1][y-1]) n++; // top right 

     if (grid[x-1][y]) n++; // left 
     if (grid[x+1][y]) n++; // right 

     if (grid[x-1][y+1]) n++; // bottom left 
     if (grid[x][y+1]) n++; // bottom middle 
     if (grid[x+1][y+1]) n++; // bottom right 


     if (grid[x][y]) // current cell is on 
     { 
      SetPixel(screen, x, y, on); // drawing function 

      if (n < 2) grid[x][y] = false; // die. :(
      if (n > 3) grid[x][y] = false; // die. :(
      // otherwise (2 or 3), survive. :) 

     } 
     else // current cell is off 
     { 
      SetPixel(screen, x, y, off); // drawing function 

      if (n == 3) grid[x][y] = true; // IT'S ALIVE!!! 
     } 



    } 
} 

Répondre

4

Tout d'abord, il ne fonctionne pas parce que vous n'êtes pas séparés les résultats de chaque cellule, par exemple, si la grille [0] [0] meurt, ce sera être immédiatement reflété sur la vie ou la mort de la grille [1] [0], ce qui n'est pas le mode de fonctionnement de Game of Life. Deuxièmement, cela ne fonctionne pas parce que vous ne semblez pas avoir exécuté le jeu plus d'une itération.

+0

oooh damn. Je pense que je dois alors créer une copie du tableau à chaque tour, et écrire les résultats dans le doublon, et écraser l'original avec le doublon au début de chaque tour. Ai-je raison? Je ne comprends pas votre deuxième commentaire, comment l'ai-je exécuté plus d'une fois? – Dataflashsabot

+0

Il n'est pas nécessaire d'écraser le tableau d'origine à chaque fois. Il suffit de basculer le tableau actuel dans chaque itération. Le tableau "other" est toujours le tableau courant suivant. – Dialecticus

+0

@Dataflashsabot: Vous n'avez pas exécuté plus d'une itération. C'est le problème. Le jeu de la vie fonctionne pour toujours, pas seulement une fois. – Puppy

Questions connexes