簡體   English   中英

試圖用C ++編寫Conway的生命游戲的問題

[英]Problem trying to code Conway's Game of Life in C++

我正在使用involuntaryexercise.com上的reni2D庫構建該程序。我創建了一個由2D行和列組成的網格,其中單擊每個正方形即可打開和關閉一個網格。 現在,我正在嘗試制作一些符合規則的工作算法,但是在運行程序時,程序通過相關循環后它們都會消失。 我在這里看不到任何內在的錯誤,因此我依靠熟練的程序員的眼光引導我走上正確的道路。

[更新]:該程序現在效果更好,但由於某些原因它不遵循生命游戲規則。

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

這里可能存在幾個問題,但其中至少一個可能是花括號放置不正確:您是說要在第一個for循環中包含第3個和第4個for循環?

順便說一句,許多程序員喜歡使用具有自動縮進的文本編輯器,這可以幫助捕獲這些類型的錯誤。

很清楚這里出了什么問題(提示:你的細胞死了,因為你的程序認為他們的社區人口過多,實際上他們不是)。 更有趣的問題是:為什么會出錯? 在我看來,這是因為你使用一個名為“鄰居”的標識符來完成不計算鄰居的東西,而是使用你內置到代碼中的一些“優化”來部分地修復它們。

(如果您想知道確切原因,請繼續閱讀:

如果單元格存在,則不會重置“鄰居”,但是當您完成循環的下一次迭代時,會再次添加到“鄰居”。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM