2010-01-16 15 views
1

J'écris un jeu de la vie de Conway pour l'école. Dans le programme, j'ai des problèmes avec les tableaux qui prennent les valeurs que je leur assigne. À un moment dans le programme, ils impriment la valeur qui leur est assignée (1) mais à la fin du programme quand j'ai besoin d'imprimer le tableau pour montrer les itérations du jeu, il montre un nombre incroyablement bas. L'autre problème était que je rencontrais des difficultés en mettant dans une boucle qui demanderait si elle veut que vous exécutez une autre itération. Je l'ai donc supprimé jusqu'à ce que les erreurs précédentes aient été corrigées. Im écrit cela avec C++Les problèmes de jeu de la vie de Conway

#include <stdio.h> 

int main (void) 
{ 
int currentarray [12][12]; 
int futurearray [12][12]; 

char c; 
char check = 'y'; 
int neighbors = 0; 

int x = 0; // row 
int y = 0; //column 

printf("Birth an organism will be born in each empty location that has exactly three neighbors.\n"); 
printf("Death an organism with four or more organisms as neighbors will die from overcrowding.\n"); 
printf("An organism with fewer than two neighbors will die from loneliness.\n"); 
printf("Survival an organism with two or three neighbors will survive to the next generation.\n"); 
printf("To create life input x, y coordinates.\n"); 

while (check == 'y') 
{ 
    printf("Enter x coordinate.\n"); 
    scanf("%d", &x); while((c = getchar()) != '\n' && c != EOF); 
    printf("Enter y coordinate.\n"); 
    scanf("%d", &y); while((c = getchar()) != '\n' && c != EOF); 
    currentarray [x][y] = 1; 
    printf ("%d\n", currentarray[x][y]); 
    printf("Do you wish to enter more input? y/n.\n"); 
    scanf("%c", &check); while((c = getchar()) != '\n' && c != EOF); 
} 

// Note - Need to add a printf statement showing the array before changes are made after input added. 

// check for neighbors 
while(check == 'y') 
{ 
for(y = 0; y <= 12; y++) 
{ 
    for(x = 0; x <= 12; x++) 
    { 
     //Begin counting number of neighbors: 
     if(currentarray[x-1][y-1] == 1) neighbors += 1; 
     if(currentarray[x-1][y] == 1) neighbors += 1; 
     if(currentarray[x-1][y+1] == 1) neighbors += 1; 
     if(currentarray[x][y-1] == 1) neighbors += 1; 
     if(currentarray[x][y+1] == 1) neighbors += 1; 
     if(currentarray[x+1][y-1] == 1) neighbors += 1; 
     if(currentarray[x+1][y] == 1) neighbors += 1; 
     if(currentarray[x+1][y+1] == 1) neighbors += 1; 

     //Apply rules to the cell: 
     if(currentarray[x][y] == 1 && neighbors < 2) 
      futurearray[x][y] = 0; 
     else if(currentarray[x][y] == 1 && neighbors > 3) 
      futurearray[x][y] = 0; 
     else if(currentarray[x][y] == 1 && (neighbors == 2 || neighbors == 3)) 
      futurearray[x][y] = 1; 
     else if(currentarray[x][y] == 0 && neighbors == 3) 
      futurearray[x][y] = 1; 
    } 
} 
} 

// Set the current array to the future and change the future to 0 

{ 
for(y = 0; y < 12; y++) 
{ 
    for(x = 0; x < 12; x++) 

    { 
    //Begin the process 
    currentarray [x][y] = futurearray [x][y]; 
    futurearray [x][y] = 0; 
} 
} 
} 
{ 
for(y = 0; y < 12; y++) 
{ 
    for(x = 0; x < 12; x++) 

    { 
//print the current life board 
     printf("%d ", currentarray[x][y]); 
} 
} 
} 


// Have gone through one iteration of Life 
//Ask to do another iteration 
printf("Do you wish to continue y/n?\n"); 
scanf("%c", &check); while((c = getchar()) != '\n' && c != EOF); 

return 0; 
} 
+2

Si vous rencontrez des problèmes avec les boucles, essayez d'indenter votre code correctement. Cela aide beaucoup à repérer les problèmes. – Thomas

+0

Je suggère également de diviser le problème en fonctions, si vous avez déjà appris à leur sujet. – Nixuz

Répondre

3

Vous définissez vos tableaux comme [12] [12].

Dans votre boucle de génération, vous passez de i = 0 à i < = 12, soit 13 étapes au lieu des 12 du tableau. De plus, vous essayez d'accéder à x-1 et y-1, qui peuvent être aussi bas que -1. Encore une fois pas à l'intérieur de votre tableau.

Parfois, vous obtenez des valeurs semi-utiles à l'intérieur de votre tableau, mais sur certaines bordures, vous accédez simplement à des données aléatoires.

Essayez de corriger votre bordure.

2

Vous avez oublié de définir neighbors sur 0 avant de les compter.

Puisque c'est C++ (pas C), vous pouvez aussi bien déclarer neighbors à l'intérieur du corps de la boucle. Ce type de problèmes est également plus facile à repérer.

Aussi, est-ce moi, ou est-ce que la boucle while ne va jamais finir? Vos accolades sont un gâchis, en général, tout comme votre indentation. Vous pourriez faire vous-même et nous une faveur en nettoyant les.

+0

La boucle while avait une logique supprimée, comme indiqué dans le texte.Manqué le truc d'init. +1 – ebo

+0

Qui a dit que ce n'était pas C? Je ne vois aucune fonctionnalité C++ ici. –

+0

La question indique C++. – Thomas

0

Vous oubliez également de définir les valeurs des deux tableaux sur zéro. Cela prendra soin de la question du nombre ridicule que vous rencontrez. vous pouvez le faire en copiant ce boucle:

for(y = 0; y < 12; y++) 
{ 
    for(x = 0; x < 12; x++) 
    { 
     //Begin the process 
     currentarray [x][y] = futurearray [x][y]; 
     futurearray [x][y] = 0; 
    } 
} 

et de le coller avant la boucle while, mais au lieu de mettre en currentarray [x] [y] = futurearray [x] [y], réglez à 0. Aussi , si les coordonnées sont des endroits visibles au lieu de coordonnées de tableau, vous aurez envie de changer cela:

printf ("%d\n", currentarray[x][y]); 

à ceci:

printf ("%d\n", currentarray[x-1][y-1]); 

je recommande également de mettre un printf avec un saut de ligne (\ n) après chaque ligne a été pri et un onglet (\ t) après chaque élément afin que la mise en forme semble plus propre.

1

De toute évidence d'accord avec toutes les suggestions ci-dessus. Une bonne astuce que vous pourriez vouloir mettre en œuvre avec Life est de créer une bordure supplémentaire autour de votre zone. Donc, si l'utilisateur veut une grille de 12x12 (et que vous devez spécifier largeur/hauteur et allouer dynamiquement la mémoire), vous disposez d'une grille 14x14 correspondant à une bordure autour de la grille réelle. Avant d'exécuter le calcul, copiez la ligne du haut vers la bordure inférieure, la ligne du bas vers la bordure supérieure, etc. Vous pouvez maintenant exécuter l'algorithme principal sur la grille interne 12x12 sans vous soucier des cas de bords. Cela permettra à vos motifs de réapparaître de l'autre côté s'ils tombent du bord.

+0

Plus pratique, puis inutile de vérifier les cas de bord. – devsaw