2014-02-05 49 views
0

我在基於康威的生命遊戲的Ubuntu中使用GCC創建了一個簡單的C應用程序。我基本上擁有所有我需要的代碼,但是我在代碼的一小部分方面遇到了麻煩。爲什麼我的輸出不會隨着每次循環迭代而改變?

我的C源文件:

#include <stdio.h> 
#include <stdlib.h> 

#define HEIGHT 32 
#define WIDTH 32 
#define COMPASS 8 
#define SPACE '.' 

unsigned long mask = 0x80000000; 
unsigned long row[WIDTH] = { 0 }; 
unsigned long copy[WIDTH] = { 0 }; 

int northWest(int rowNum) { 
    copy[rowNum - 1] = row[rowNum - 1] >>= 1; 
    return copy[rowNum - 1] & row[rowNum]; 
} 

int north(int rowNum) { 
    copy[rowNum - 1] = row[rowNum - 1]; 
    return copy[rowNum - 1] & row[rowNum]; 
} 

int northEast(int rowNum) { 
    copy[rowNum - 1] = row[rowNum - 1] <<= 1; 
    return copy[rowNum - 1] & row[rowNum]; 
} 

int west(int rowNum) { 
    copy[rowNum] = row[rowNum] >>= 1; 
    return copy[rowNum] & row[rowNum]; 
} 

int east(int rowNum) { 
    copy[rowNum] = row[rowNum] <<= 1; 
    return copy[rowNum] & row[rowNum]; 
} 

int southWest(int rowNum) { 
    copy[rowNum + 1] = row[rowNum + 1] >>= 1; 
    return copy[rowNum + 1] & row[rowNum]; 
} 

int south(int rowNum) { 
    copy[rowNum + 1] = row[rowNum]; 
    return copy[rowNum + 1] & row[rowNum]; 
} 

int southEast(int rowNum) { 
    copy[rowNum + 1] = row[rowNum + 1] <<= 1; 
    return copy[rowNum + 1] & row[rowNum]; 
} 

void clearRows(unsigned long row[]) { 
    int i; 
    system("clear"); 
    for (i = 0; i < HEIGHT; ++i) { 
     row[i] = 0; 
    } 
} 

void displayBinary(unsigned long x) { 
    int bit; 
    /*int mask;*/ 
    for (bit = 0; bit < HEIGHT; ++bit) 
    { 
     mask = 1 << bit; 
     printf("%c", (x & mask) ? 'X' : SPACE); 
    } 
    printf("\n"); 
} 

int main(void) { 
    int i, j, alive; 
    char ch; 
    unsigned long init32; 
    srand(time(NULL)); 

    for (i = 0; i < HEIGHT; ++i) { 
     init32 = ((double)rand()/RAND_MAX) * 0xFFFFFFFF; 
     row[i] = init32; 
     displayBinary(row[i]); 
    } 

    do { 
     system("clear"); 
     for (i = 0; i < WIDTH; ++i) { 
      unsigned long neighbours[COMPASS] = { 
       north(i), 
       south(i), 
       west(i), 
       east(i), 
       northEast(i), 
       northWest(i), 
       southEast(i), 
       southWest(i) 
      }; 

      for (j = 0; j < COMPASS; ++j) { 
       alive += ((mask & neighbours[j]) ? 1 : 0); 
      } 

      displayBinary(row[i]); 
     } 
    } while ((ch = getchar()) != 'n'); 

    return EXIT_SUCCESS; 
} 

當應用程序第一次啓動時,輸出的是什麼,我希望(隨機「X」和一個32×32格字符「」),但之後每次迭代, 沒有什麼變化。我希望每個循環根據我有的方法(north(),west()等)重新計算鄰居,並打印新的'X'和'。'。 32x32網格上的值。

任何人都可以提供某種幫助,如何獲得新的值到陣列中打印在屏幕上?順便說一句,我是C編程的新手。謝謝。

+0

支持'系統(「清除」)嗎? –

+0

您是否嘗試過調試您的程序?編寫代碼只是軟件開發的一小部分。讓代碼正常工作是一個非常重要的部分,它不涉及立即發佈到堆棧溢出。 –

+0

@FiddlingBits這是我的實驗室教授給出的這個任務使用的,所以我會這麼認爲的,是的。 –

回答

2

我沒有看到你在哪裏更新你的行數組在代碼中的任何地方。你不應該在你的while while循環中更新它嗎?

好的,我在你的函數中看到像下面這樣複製的函數,你正在使用行>> = 1來更改行。但是由於您正在使用按值傳遞而不是按引用傳遞,因此原始行值保持不變。

int northWest(unsigned long row, int rowNum) { 
    copy[rowNum - 1] = row >>= 1; 
    return copy[rowNum - 1]; 
} 

您可以使用按值傳遞來解決該問題。 或 由於您的行數組是全局的,因此您可以使用您傳遞的rowNum(index)在這些函數中直接更改它。

相關問題