gpt4 book ai didi

c - C语言的生命游戏问题

转载 作者:太空宇宙 更新时间:2023-11-03 23:29:44 40 4
gpt4 key购买 nike

<分区>

我正在创建 Game of Life 程序,我创建了它的工作副本,但我在制作它时遇到了问题,因此当我尝试更改我的代码来执行它时,用户可以输入网格的 x 和 y(行和列)它得到凌乱并导致很多错误。我还尝试使用 malloc()free() 开始使用堆,但我没有运气。下面的代码只是一个有效的硬编码解决方案。 (我也注释掉了测试数据和用户输入部分)。预先感谢您提供的任何帮助。

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

测试数据第一个实例的输出:[3][4]、[3][5]、[3][6] 上的 X。

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

更新:

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

计算()

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

40 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com