views:

117

answers:

3

I'm writing a Conway's life game for school. In the program I am having trouble with the arrays taking the values I am assigning them. At one point in the program they print out the value assigned to them (1) yet at the end of the program when I need to print the array to show the iterations of the game it shows an incredibly low number. The other trouble was I was encountering difficulties when putting in a loop that would ask if it wants you to run another iteration. So I removed it until the previous errors were fixed. Im writing this with C++

#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;
}
+3  A: 

You are defining your arrays as [12][12].

In your generation loop you walk from i = 0 to i <= 12, which is 13 steps instead of the 12 of the array. Additionally you are trying to access x-1 and y-1, which can be as low as -1. Again not inside your array.

Sometimes you get semi-useful values from within your array, but on some borders you are just accessing random data.

Try to correct your border.

ebo
+2  A: 

You forgot to set neighbors to 0 before counting them.

Since this is C++ (not C), you might as well declare neighbors inside the loop body. Makes these kinds of issues easier to spot, too.

Also, is it me, or is that while loop never going to finish? Your braces are a mess, in general, as is your indentation. You could do yourself and us a favour by cleaning those up.

Thomas
The while loop had some logic removed, as stated in the text. Missed the init stuff. +1
ebo
Who said it's not C? I don't see any C++ features here.
the_drow
The question states C++.
Thomas
A: 

You're also forgetting to set the values of both arrays to zero. This will take care of the ridiculous number issue you're having. you can do that by copying this for loop:

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;
    }
}

and pasting it before the while loop but instead of setting currentarray[x][y] = futurearray[x][y], set it to 0. Also, if the coordinates are viewable locations instead of array co-ordinates, you'll want to change this:

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

to this:

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

I would also recommend putting a printf with a newline (\n) after each row has been printed and a tab (\t) after each item so that the formatting looks cleaner.

indyK1ng