2010-11-15 9 views
0

Je crée ce programme en utilisant la bibliothèque reni2D trouvée sur involuntaryexercise.com J'ai créé une grille composée d'un tableau 2D de lignes et de colonnes dans lequel chaque carré est cliqué être allumé et éteint. Maintenant, j'essaie de faire des algorithmes de travail qui respectent les règles, mais lors de l'exécution du programme, ils disparaissent tous après que le programme passe par les boucles liées. Je ne vois rien de fondamentalement mauvais ici, alors je compte sur les yeux des programmeurs qualifiés pour me guider sur le bon chemin. [UPDATE]: Le programme fonctionne maintenant mieux, sauf qu'il ne suit pas les règles de Game Of Life pour quelque raison que ce soit.Problème lors de la tentative de coder le jeu de vie de Conway en C++

if(raGetKey(VK_RETURN)) 
     {        
      //occupied cells 
      for(int i=0; i<ROWS; i++){ //768/24 = 32      
        for(int j=0; j<COLS; j++){ //768/32 = 24       
         //Occupied cells 
         if(sq[i][j].isOn == true && sq[i][j].neighbors < 4) 
         { 
          //UDLR 
           if((j+1)<COLS && sq[i][j+1].isOn == true){ 
            sq[i][j].neighbors += 1; 
            printf("The occupied sq[%d][%d] gains a neighbor\n", i, j); 
           } 
           if((j-1)>(-1) && sq[i][j-1].isOn == true){ 
            sq[i][j].neighbors += 1; 
            printf("The occupied sq[%d][%d] gains a neighbor\n", i, j); 
           } 
           if((i+1)<ROWS && sq[i+1][j].isOn == true){ 
            sq[i][j].neighbors += 1; 
            printf("The occupied sq[%d][%d] gains a neighbor\n", i, j); 
           } 
           if((i-1)>(-1) && sq[i-1][j].isOn == true){ 
            sq[i][j].neighbors += 1; 
            printf("The occupied sq[%d][%d] gains a neighbor\n", i, j); 
           } 

           if(sq[i][j].neighbors >= 4) 
            break; 
          //Diagonal 
           if((i+1)<ROWS && (j+1)<COLS && sq[i+1][j+1].isOn == true){ 
            sq[i][j].neighbors += 1; 
            printf("The occupied sq[%d][%d] gains a neighbor\n", i, j); 
           } 
           if((i-1)>(-1) && (j-1)> (-1) && sq[i-1][j-1].isOn == true){ 
            sq[i][j].neighbors += 1; 
            printf("The occupied sq[%d][%d] gains a neighbor\n", i, j); 
           } 
           if((i-1)>(-1) && (j+1)<COLS && sq[i-1][j+1].isOn == true){ 
            sq[i][j].neighbors += 1; 
            printf("The occupied sq[%d][%d] gains a neighbor\n", i, j); 
           } 
           if((i+1)<ROWS && (j-1)> (-1) && sq[i+1][j-1].isOn == true){ 
            sq[i][j].neighbors += 1; 
            printf("The occupied sq[%d][%d] gains a neighbor\n", i, j); 
           } 
         } 

         //Empty cells 
         if(sq[i][j].isOn == false && sq[i][j].neighbors < 4) 
         { 
         //UDLR 
          /*if((i+1)<ROWS && (j+1)<COLS && (i-1)>0 && (j-1)>0) 
          {*/ 
           if((j+1)<COLS && sq[i][j+1].isOn == true){ 
            sq[i][j].neighbors += 1; 
            printf("The empty sq[%d][%d] gains a neighbor\n", i, j); 
           } 
           if((j-1)>0 && sq[i][j-1].isOn == true){ 
            sq[i][j].neighbors += 1; 
            printf("The empty sq[%d][%d] gains a neighbor\n", i, j); 
           } 
           if((i+1)<ROWS && sq[i+1][j].isOn == true){ 
            sq[i][j].neighbors += 1; 
            printf("The empty sq[%d][%d] gains a neighbor\n", i, j); 
           } 
           if((i-1)>-1 && sq[i-1][j].isOn == true){ 
            sq[i][j].neighbors += 1; 
            printf("The empty sq[%d][%d] gains a neighbor\n", i, j); 
           } 

           if(sq[i][j].neighbors >= 4) 
            break; 
         //Diagonal 
           if((i+1)<ROWS && (j+1)<COLS && sq[i+1][j+1].isOn == true){ 
            sq[i][j].neighbors += 1; 
            printf("The empty sq[%d][%d] gains a neighbor\n", i, j); 
           } 
           if((i-1)>(-1) && (j-1)> (-1) && sq[i-1][j-1].isOn == true){ 
            sq[i][j].neighbors += 1; 
            printf("The empty sq[%d][%d] gains a neighbor\n", i, j); 
           } 
           if((i-1)>(-1) && (j+1)<COLS && sq[i-1][j+1].isOn == true){ 
            sq[i][j].neighbors += 1; 
            printf("The empty sq[%d][%d] gains a neighbor\n", i, j); 
           } 
           if((i+1)<ROWS && (j-1)> (-1) && sq[i+1][j-1].isOn == true){ 
            sq[i][j].neighbors += 1; 
            printf("The empty sq[%d][%d] gains a neighbor\n", i, j); 
           } 
          //} 
         } 
        } 
       } 
       for(int i=0; i<ROWS; i++) //768/24 = 32 
       {     
        for(int j=0; j<COLS; j++) //768/32 = 24 
        { 

         if(sq[i][j].isOn == true) 
         { 
          if(sq[i][j].neighbors <= 1){ 
           sq[i][j].isOn = false; 
           sq[i][j].neighbors = 0; 
           printf("sq[%d][%d] is ON and has less than 1 neighbors ... Died from lonliness\n", i, j); 
          } 
          if(sq[i][j].neighbors >= 4){ 
           sq[i][j].isOn = false; 
           sq[i][j].neighbors = 0; 
           printf("sq[%d][%d] is ON and has neighbors is greater than or equal to 4... Died from overpopulation\n", i, j); 
          } 
          if(sq[i][j].neighbors > 1 && sq[i][j].neighbors < 4){ 
           sq[i][j].isOn = true; 
           printf("sq[%d][%d] is ON has 2 or 3 neighbors... Lives\n", i, j); 
           sq[i][j].neighbors = 0; 
          } 
         } 
         if(/*sq[i][j].isOn == false && */sq[i][j].neighbors == 3){ 
           printf("sq[%d][%d] is OFF has 3 neighbors... Reproduce\n", i, j);      
           sq[i][j].isOn = true; 
           sq[i][j].neighbors = 0; 
         } 
        } 
       } 
     } 
+1

Avez-vous essayé de passer par un débogueur? –

+0

Je ne sais pas quel est le problème, mais je vois énormément de code pour une fonction, et au moins un bloc entièrement redondant. Je commencerais par le casser en plus petites fonctions. – Ken

Répondre

1

Il pourrait y avoir plusieurs problèmes, mais au moins l'un d'entre eux pourrait être accolades égarées: avez-vous dire que votre 3ème et 4ème pour-boucles dans votre 1er boucle for? En outre, de nombreux programmeurs aiment utiliser des éditeurs de texte qui ont un retrait automatique, ce qui peut aider à attraper ces types de bogues.

+0

Votre conseil a fonctionné. Maintenant, cela fonctionne presque comme il se doit. Presque signifie qu'il n'interprète pas correctement les algorithmes. Est-ce que quelqu'un voit quelque chose qui a besoin d'être réparé? –

+0

Génial. Vous devez maintenant définir ROWS et COLS sur 3 et parcourir le code pour voir ce qui se passe. (Insérez d'autres instructions printf ou placez des points d'arrêt dans votre débogueur.) Ce sera joli et petit, donc vous devriez être capable de voir le point exact quand quelque chose ne va pas. –

1

Il est très clair que ce qui s'est mal passé ici (indice: vos cellules meurent parce que votre programme pense que leurs quartiers sont surpeuplés alors qu'en fait, ils ne le sont pas). La question la plus intéressante est la suivante: Pourquoi cela s'est-il mal passé? À mon avis, c'est parce que vous utilisez un identificateur appelé «voisins» pour quelque chose qui ne compte pas du tout les voisins, mais qui le fait partiellement et avec quelques «optimisations» que vous avez intégrées dans votre code.

(Lire si vous voulez connaître la cause exacte:

Vous n'êtes pas remise à zéro "voisins si la vie de la cellule, mais ajouter à « voisins » à nouveau lorsque vous passez par la prochaine itération de la boucle.)

+0

Après avoir corrigé ce problème en mettant les voisins à 0, les cellules semblent toujours disparaître. –

+0

Il est vraiment difficile de tester mon programme en appuyant sur Entrée (pas en mode débogage) car il calcule et met à jour trop rapidement. –

Questions connexes