2012-03-07 3 views
0

텍스트 파일을 사용하여 생활의 게임을위한 C 프로그램을 만들려면 공간.는 어떻게에 요청했다

Display the initial generation using the function printf. 

Calculate the next generation using the rules mentioned above and save it in another textfile. 

The filenames of the input and output textfiles should be specified as command-line parameters. 

나는 지금까지 텍스트 파일을 요구하는 코드가 있습니다. 코드는 그것을 인쇄합니다. 나는 Conway의 Game of Life의 규칙을 적용하는 코드가 부족하다. 나는 어디에 넣어야할지 모른다. 그리고 사용할 코드. :(좀 도와주세요 내가 지금 무엇을

here`s :...

#include <stdio.h> 
#include <string.h> 

#define MAX_LINE_LEN 80 
#define N 25 

void display(char [][N+1], size_t); 

int main(int argc, char *argv[]) { 
    FILE *fp; 
    char in[MAX_LINE_LEN]; 
    char grid[N][N+1] = { { '\0' } }; 
    size_t i = 0; 

    printf("Enter filename: "); 
    fgets(in, MAX_LINE_LEN, stdin); 
    *(strchr(in, '\n')) = '\0'; 
    if ((fp = fopen(in, "r")) != NULL) { 
    while ((i < N) && (fgets(in, MAX_LINE_LEN, fp) != NULL)) { 
     *(strchr(in, '\n')) = '\0'; 
     /* should verify only 'x' and space in string before storing */ 
     strncpy(grid[i++], in, N); 
    } 
    /* pad each row with spaces, if necessary, for NxN array */ 
    for (i = 0; i < N; i++) { 
     while (strlen(grid[i]) < N) { 
     strcat(grid[i], " "); 
     } 
    } 
    /* For all generations ... 
      compute next generation */ 
      display(grid, N); 
    /* End for all generations */ 
    } else { 
    printf("%s not found.\n", in); 
    getch(); 
    } 
    getch(); 
} 

void display(char a[][N+1], size_t n) { 
    size_t i; 
    for (i = 0; i < n; puts(a[i++])); 
} 
+0

가능한 [C 언어를 사용하여 게임을 만드는 방법] (http://stackoverflow.com/questions/9589328/how-to-make-a-game-of-life-using-c-language) – AShelly

+0

또한보십시오 http://stackoverflow.com/q/1823/10396 – AShelly

답변

3
*(strchr(in, '\n')) = '\0'; 

나쁜 주주 strchr 반환 null의 경우 나는 당신의 데이터는 항상 줄 바꿈을 알고,이 세그 폴트 것입니다, 그러나 그것은으로 얻을 수있는 나쁜 습관 항상 먼저 NULL 체크를 변수에 strchr의 결과를 할당하고 수행합니다.

char *tmp = strchr(in, '\n'); 
if (tmp) 
    *tmp = 0; 

솔직히, 저는 여러분의 그리드를 문자열 배열로 취급하는 것이 해결할 것보다 더 많은 슬픔을 불러올 것이라고 생각합니다. 다른 유형의 2 차원 배열처럼 취급하십시오. 입력 파일의 각 행 끝에있는 개행 문자를 처리하는 것은 여러분이하는 일에 상관없이 고통이 될 것입니다.

지금까지 높은 수준의 문제에 대해 생각, 코드를 구성하는 방법 등 :

  1. 당신은 부하 당신의 시작 그리드와 같은 파일에 필요한;
  2. 다음 세대의 그리드을 계산해야합니다.
  3. 표시 각 그리드가 필요합니다.
  4. 각 격자를 파일에 작성하십시오.

이미 디스플레이 코드를 자체 기능으로 분리했습니다. 로드, 계산 및 쓰기 기능을 수행해야합니다 ( 파일 로딩 코드를 main에 남겨 둘 수는 있지만 코드를 자체 함수에 넣으면 코드가 더 깨끗해집니다).

void load(const char *filename, char (*grid)[N], size_t rows) {...} 
void calc(char (*grid)[N], size_t rows) {...} 
void save(const char *filename, char (*grid)[N], size_t rows) {...} 

그래서 main의를 통해 때마다, 당신은 단지 display를 호출하기 전에 그리드에 calc 전화 할게, 당신은 파일에 새 그리드를 작성하는 save를 호출 할 수 있습니다. 다음 표를 계산하는 방법을 에 관해서는

는, 음, 그 과제의 일부, 나는 멀리 모든을주고 싶지 않아.