Проблема при попытке кодирования игры жизни Конвея в C ++ - PullRequest
0 голосов
/ 15 ноября 2010

Я строю эту программу, используя библиотеку reni2D, найденную на involuunteexercise.com. Я создал сетку, состоящую из двухмерного массива строк и столбцов, в котором каждый квадрат нажимается для включения и выключения.Сейчас я пытаюсь создать несколько работающих алгоритмов, которые соответствуют правилам, но при запуске программы все они исчезают после прохождения программой соответствующих циклов.Я не вижу в этом ничего плохого, поэтому я полагаюсь на опытных программистов, которые направят меня по правильному пути.

[ОБНОВЛЕНИЕ]: Программа теперь работает лучше, за исключением того, что она непо какой-то причине не следует правилам Game of Life.

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

Ответы [ 2 ]

1 голос
/ 15 ноября 2010

Совершенно ясно, что здесь пошло не так (подсказка: ваши клетки умирают, потому что ваша программа считает, что их окрестности перенаселены, хотя на самом деле это не так).Более интересный вопрос: почему это пошло не так?На мой взгляд, это потому, что вы используете идентификатор, называемый «соседями», для чего-то, что вообще не считает соседей, а скорее делает это частично и искажено некоторыми «оптимизациями», которые вы встроили в свой код.(Продолжайте читать, если хотите узнать точную причину:

Вы не сбрасываете «соседей», если ячейка живет, но затем добавляете к «соседям» снова, когда проходите следующую итерацию цикла.)

1 голос
/ 15 ноября 2010

Здесь может быть несколько проблем, но, по крайней мере, одна из них может быть неуместными фигурными скобками : вы хотели, чтобы ваши 3-й и 4-й циклы for были в вашем 1-м цикле for?

Кроме того, многим программистам нравится использовать текстовые редакторы с автоматическим отступом, которые могут помочь в обнаружении ошибок такого типа.

...