2

Im, создающая программу Жизни Жизни, в которой я создал рабочую копию, но у меня возникли проблемы, из-за чего пользователь может ввести x и y (строки и столбцы) сетки, когда я пытаюсь изменить свой код, чтобы сделать это, он становится беспорядочным и вызывает много ошибок. Также я пытаюсь использовать malloc() и free(), чтобы начать использовать кучи, и им не повезло. Код ниже - это просто работающее жестко закодированное решение. (Я также прокомментировал тестовые данные и пользовательскую часть ввода). Заранее благодарю вас за предоставленную помощь.Игра жизненных проблем в C

#include <stdio.h> 
#define HEIGHT 12 
#define WIDTH 12 
#define LIFE_YES 'X' 
#define LIFE_NO 'O' 

typedef int TableType[HEIGHT][WIDTH]; 

void printTable(TableType table) { 
    int height, width; 

     for (height = 0; height < HEIGHT; height++) { 
      for (width = 0; width < WIDTH; width++) { 
        if (table[height][width] == LIFE_YES) { 
         printf("X"); 
        } 
      else { 
         printf("-"); 
        } 
      } 
      printf("\n"); 
     } 
     printf("\n"); 
} 

void clearTable(TableType table) { 
    int height, width; 

     for (height = 0; height < HEIGHT; height++) { 
      for (width = 0; width < WIDTH; width++) { 
        table[height][width] = LIFE_NO; 
      } 
     } 
} 

void askUser(TableType tableA) { 
    int i; 
     int n; 
     int height, width; 

     printf("Enter the amount of initial organisms: "); 
     scanf("%d", &n); 

     for (i = 0; i < n; i++) { 
      printf("Enter dimensions (x y) where organism %d will live: ", i + 1); 
      scanf("%d %d", &height, &width); 

      tableA[height][width] = LIFE_YES; 
     } 

     printTable(tableA); 
     printf("Generation 0"); 
} 

int getNeighborValue(TableType table, int row, int col) { 
     if (row < 0 || row >= HEIGHT || col < 0 || col >= WIDTH || table[row][col] != LIFE_YES) { 
      return 0; 
     } 
    else { 
      return 1; 
     } 
} 

int getNeighborCount(TableType table, int row, int col) { 
     int neighbor = 0; 

     neighbor += getNeighborValue(table, row - 1, col - 1); 
     neighbor += getNeighborValue(table, row - 1, col); 
     neighbor += getNeighborValue(table, row - 1, col + 1); 
     neighbor += getNeighborValue(table, row, col - 1); 
     neighbor += getNeighborValue(table, row, col + 1); 
     neighbor += getNeighborValue(table, row + 1, col - 1); 
     neighbor += getNeighborValue(table, row + 1, col); 
     neighbor += getNeighborValue(table, row + 1, col + 1); 

     return neighbor; 
} 

void calculate(TableType tableA) { 
     TableType tableB; 
     int neighbor, height, width; 

     for (height = 0; height < HEIGHT; height++) { 
      for (width = 0; width < WIDTH; width++) { 
        neighbor = getNeighborCount(tableA, height, width); 
        if (neighbor==3) { 
         tableB[height][width] = LIFE_YES; 
        } 
      else if (neighbor == 2 && tableA[height][width] == LIFE_YES) { 
         tableB[height][width] = LIFE_YES; 
        } 
      else { 
         tableB[height][width] = LIFE_NO; 
        } 
      } 
     } 

     for (height = 0; height < HEIGHT; height++) { 
      for (width = 0; width < WIDTH; width++) { 
        tableA[height][width] = tableB[height][width]; 
      } 
    } 
} 

/* test data 
void loadTestData(TableType table) { 
     table[3][4] = LIFE_YES; 
     table[3][5] = LIFE_YES; 
     table[3][6] = LIFE_YES; 

     table[10][4] = LIFE_YES; 
     table[10][5] = LIFE_YES; 
     table[10][6] = LIFE_YES; 
     table[11][6] = LIFE_YES; 
     table[12][5] = LIFE_YES; 
} 
*/ 

int main(void) { 
     TableType table; 
     char end; 
     int generation = 0; 

     clearTable(table); 
     /*askUser(table);*/ 
     /*loadTestData(table);*/ 
     printTable(table); 

     while (end != 'q') { 
      calculate(table); 
      printTable(table); 
      printf("Generation %d\n", ++generation); 
      printf("Press q to quit or 1 to continue: "); 
      scanf(" %c", &end); 
     } 
     return 0; 
} 

Выход для первого экземпляра данных испытаний: X на [3] [4], [3] [5], [3] [6].

------------ 
------------ 
------------ 
----XXX----- 
------------ 
------------ 
------------ 
------------ 
------------ 
------------ 
------------ 
------------ 

Update:

#include <stdio.h> 
#define LIFE_YES 'X' 
#define LIFE_NO 'O' 

extern int HEIGHT, WIDTH; 
typedef int **TableType; 

void printTable(TableType table) { 
    int height, width; 

     for (height = 0; height < HEIGHT; height++) { 
      for (width = 0; width < WIDTH; width++) { 
        if (table[height][width] == LIFE_YES) { 
         printf("X"); 
        } 
      else { 
         printf("-"); 
        } 
      } 
      printf("\n"); 
     } 
     printf("\n"); 
} 

void clearTable(TableType table) { 
    int height, width; 

     for (height = 0; height < HEIGHT; height++) { 
      for (width = 0; width < WIDTH; width++) { 
        table[height][width] = LIFE_NO; 
      } 
     } 
} 

void askUser(TableType tableA) { 
    int i; 
     int n; 
     int height, width; 

     printf("Enter the amount of initial organisms: "); 
     scanf("%d", &n); 

     for (i = 0; i < n; i++) { 
      printf("Enter dimensions (x y) where organism %d will live: ", i + 1); 
      scanf("%d %d", &height, &width); 

      tableA[height][width] = LIFE_YES; 
     } 

     printTable(tableA); 
     printf("Generation 0"); 
} 

int getNeighborValue(TableType table, int row, int col) { 
     if (row < 0 || row >= HEIGHT || col < 0 || col >= WIDTH || table[row][col] != LIFE_YES) { 
      return 0; 
     } 
    else { 
      return 1; 
     } 
} 

int getNeighborCount(TableType table, int row, int col) { 
     int neighbor = 0; 

     neighbor += getNeighborValue(table, row - 1, col - 1); 
     neighbor += getNeighborValue(table, row - 1, col); 
     neighbor += getNeighborValue(table, row - 1, col + 1); 
     neighbor += getNeighborValue(table, row, col - 1); 
     neighbor += getNeighborValue(table, row, col + 1); 
     neighbor += getNeighborValue(table, row + 1, col - 1); 
     neighbor += getNeighborValue(table, row + 1, col); 
     neighbor += getNeighborValue(table, row + 1, col + 1); 

     return neighbor; 
} 

void calculate(TableType tableA) { 
     TableType tableB; 
     int neighbor, height, width; 

     for (height = 0; height < HEIGHT; height++) { 
      for (width = 0; width < WIDTH; width++) { 
        neighbor = getNeighborCount(tableA, height, width); 
        if (neighbor==3) { 
         tableB[height][width] = LIFE_YES; 
        } 
      else if (neighbor == 2 && tableA[height][width] == LIFE_YES) { 
         tableB[height][width] = LIFE_YES; 
        } 
      else { 
         tableB[height][width] = LIFE_NO; 
        } 
      } 
     } 

     for (height = 0; height < HEIGHT; height++) { 
      for (width = 0; width < WIDTH; width++) { 
        tableA[height][width] = tableB[height][width]; 
      } 
    } 
} 

/* test data 
void loadTestData(TableType table) { 
     table[3][4] = LIFE_YES; 
     table[3][5] = LIFE_YES; 
     table[3][6] = LIFE_YES; 

     table[10][4] = LIFE_YES; 
     table[10][5] = LIFE_YES; 
     table[10][6] = LIFE_YES; 
     table[11][6] = LIFE_YES; 
     table[12][5] = LIFE_YES; 
} 
*/ 

int main(void) { 
     char end; 
     int generation = 0; 

     printf("Enter the amount of rows and columns you want in the grid: "); 
     scanf("%i%i\n" &HEIGHT, &WIDTH); 

     TableType table = malloc(HEIGHT * sizeof(int*)); 
     for (int i = 0; i < HEIGHT; i++) { 
      table[i] = malloc(WIDTH * sizeof(int)); 
    } 

     clearTable(table); 
     /*askUser(table);*/ 
     /*loadTestData(table);*/ 
     printTable(table); 

     while (end != 'q') { 
      calculate(table); 
      printTable(table); 
      printf("Generation %d\n", ++generation); 
      printf("Press q to quit or 1 to continue: "); 
      scanf(" %c", &end); 
     } 
     return 0; 
} 

Calculate()

void calculate(TableType tableA) { 
     TableType tableB; 
     int neighbor, height, width, i; 
    **tableB= malloc(HEIGHT * sizeof(int*)); 

    for (i = 0; i < HEIGHT; i++) { 
      tableB[i] = malloc(WIDTH * sizeof(int)); 
    } 

     for (height = 0; height < HEIGHT; height++) { 
      for (width = 0; width < WIDTH; width++) { 
        neighbor = getNeighborCount(tableA, height, width); 
        if (neighbor==3) { 
         tableB[height][width] = LIFE_YES; 
        } 
      else if (neighbor == 2 && tableA[height][width] == LIFE_YES) { 
         tableB[height][width] = LIFE_YES; 
        } 
      else { 
         tableB[height][width] = LIFE_NO; 
        } 
      } 
     } 

     for (height = 0; height < HEIGHT; height++) { 
      for (width = 0; width < WIDTH; width++) { 
        tableA[height][width] = tableB[height][width]; 
      } 
    } 
    free(tableB); 
} 
+2

«он становится грязным и вызывает много ошибок.» <- Это не описание проблемы, не так ли? – us2012

+0

Было бы полезно, если можно объяснить, каков ожидаемый результат и насколько близок ваш вывод. Кстати, спасибо за предоставление входных данных hte (loadTestData)! –

+0

Я отлично работаю над тем, чтобы попытаться отредактировать, чтобы получить спецификацию пользователей по размеру сетки и сколько поколений они хотят видеть. Его с тех пор, как я жестко закодировал все, у меня возникли проблемы с попыткой его жесткого кодирования. –

ответ

2

Изменить ваше определение типа для:

typedef int **TableType; 

и изменить HEIGHT и WIDTH от макросов до глобального ва riables (или локальные переменные, которые вы передаете каждой функции, получающей таблицу в качестве аргумента).

После получения HEIGHT и WIDTH от пользователя, вы можете инициализировать таблицу с:

table = malloc(HEIGHT * sizeof(int*)); 
for (int i = 0; i < HEIGHT; i++) { 
    table[i] = malloc(WIDTH * sizeof(int)); 
} 
+0

Были ли это единственными изменениями, которые мне нужно внести, чтобы получить сетку, используя вход пользователя? Также будет элемент table = в моем основном методе. –

+0

Да, назначение таблицы происходит в 'main()'. Я думаю, это должно быть все, что вам нужно изменить. – Barmar

+0

Я обновил свой код, теперь он выглядит хорошо? –