| 查看: 1995 | 回复: 3 | ||
| 当前只显示满足指定条件的回帖,点击这里查看本话题的所有回帖 | ||
[求助]
修改一个C语言生命游戏程序
|
||
|
学校的project,一个生命游戏的程序: ------------------------------------------------------------------------------------------------------ #include #include #define ARRAYSIZE1 3 /* array size, predefined by the user */ #define ARRAYSIZE2 7 #define NSTEPS 2 /* number of steps take */ int main(int argc, char *argv[]) { int i, j, n, im, ip, jm, jp, ni, nj, nsum, isum; int **old, **new; float x; FILE *outFile; ni = ARRAYSIZE1 + 2; /* add 2 for left and right ghost cells */ // nj = ARRAYSIZE2 + 2; old = malloc(ni*sizeof(int*)); new = malloc(ni*sizeof(int*)); for(i=0; i new = malloc(nj*sizeof(int)); } /* initialize elements of old to 0 or 1 */ for(i=1; i<=ARRAYSIZE1; i++){ for(j=1; j<=ARRAYSIZE2; j++){ x = rand()/((float)RAND_MAX + 1); if(x<0.5){ old[j] = 0; } else { old[j] = 1; } } } /* time steps */ for(n=0; n /* corner boundary conditions */ old[0][0] = old[ARRAYSIZE1][ARRAYSIZE2]; old[0][ARRAYSIZE2+1] = old[ARRAYSIZE1][1]; old[ARRAYSIZE1+1][ARRAYSIZE2+1] = old[1][1]; old[ARRAYSIZE1+1][0] = old[1][ARRAYSIZE2]; /* left-right boundary conditions */ for(i=1; i<=ARRAYSIZE1; i++){ old[0] = old[ARRAYSIZE2]; old[ARRAYSIZE2+1] = old[1]; } /* top-bottom boundary conditions */ for(j=1; j<=ARRAYSIZE2; j++){ old[0][j] = old[ARRAYSIZE1][j]; old[ARRAYSIZE1+1][j] = old[1][j]; } for(i=1; i<=ARRAYSIZE1; i++){ for(j=1; j<=ARRAYSIZE2; j++){ im = i-1; ip = i+1; jm = j-1; jp = j+1; nsum = old[im][jp] + old[jp] + old[ip][jp] + old[im][j ] + old[ip][j ] + old[im][jm] + old[jm] + old[ip][jm]; switch(nsum){ case 3: new[j] = 1; break; case 2: new[j] = old[j]; break; default: new[j] = 0; } } } for(i=1; i<=ARRAYSIZE1; i++){ for(j=1; j<=ARRAYSIZE2; j++){ old[j] = new[j]; } } } /* sum the number of living cells */ isum = 0; for(i=1; i<=ARRAYSIZE1; i++){ for(j=1; j<=ARRAYSIZE2; j++){ isum = isum + new[j]; } } printf("\nNumber of living cells = %d\n", isum); return 0; } ------------------------------------------------------------------------------------------------------ 现在的程序直接定义了生命游戏中的初始条件,如下 #define ARRAYSIZE1 3 /* array size, predefined by the user */ #define ARRAYSIZE2 7 #define NSTEPS 2 /* number of steps take */ 直接运行可以输出存活细胞数,如下 printf("\nNumber of living cells = %d\n", isum); return 0; 想把程序改成满足以下条件的新程序: 运行程序的时候接受输入,格式为: [first argument: 演化次数steps] [second argument:调用的文件名] 其中调用的文件包含了初始的grid,格式为 m 行数 n 列数 举例: 5 6 01100 01110 01000 00000 00000 00000 输出格式不变,输出存活细胞数。 请问这个程序要怎么修改呢?请熟悉c语言的前辈多多指教,在线等回复。拜谢! [ Last edited by MajorMei on 2012-11-28 at 12:06 ] |
» 猜你喜欢
上海工程技术大学【激光智能制造】课题组招收硕士
已经有6人回复
带资进组求博导收留
已经有11人回复
自荐读博
已经有5人回复
求个博导看看
已经有16人回复
上海工程技术大学张培磊教授团队招收博士生
已经有4人回复
求助院士们,这个如何合成呀
已经有4人回复
临港实验室与上科大联培博士招生1名
已经有9人回复
写了一篇“相变储能技术在冷库中应用”的论文,论文内容以实验为主,投什么期刊合适?
已经有6人回复
最近几年招的学生写论文不引自己组发的文章
已经有11人回复
中科院杭州医学所招收博士生一名(生物分析化学、药物递送)
已经有3人回复
3楼2012-11-28 13:57:43

2楼2012-11-28 13:38:25
libralibra
至尊木虫 (著名写手)
骠骑将军
- 程序强帖: 40
- 应助: 817 (博后)
- 金币: 12914.1
- 红花: 64
- 帖子: 2238
- 在线: 287.3小时
- 虫号: 696514
- 注册: 2009-02-05
- 专业: 计算机软件
【答案】应助回帖
★
感谢参与,应助指数 +1
xzhdty: 金币+1, 谢谢骠骑将军 2012-11-29 23:34:19
感谢参与,应助指数 +1
xzhdty: 金币+1, 谢谢骠骑将军 2012-11-29 23:34:19
|
读取参数得到执行步数和文件名 读取文件是通用的,先读到行列数,动态分配内存生成矩阵,然后读取内容作为初始状态. 你只需要写一个函数Run(int **mat, int m, int n),这个函数里面就是根据生命游戏的规则,判断邻域来设置当前元素的值.唯一复杂的就是判断4个角点和4条边界,其他内部元素的邻域都是3*3方块中的其他8个.然后求和,根据设定好的规则来设置当前的值. 仔细分析一下不难的.用循环控制运行次数等于指定的执行步数,每次都去调用Run()就行了 Run的伪代码实现,分情况可以有其他分法,例如把左右上角的情况写进第一行里面当做特殊情况处理,不过对于if...else...没有什么简化的空间,写出来看着清楚一些. |

4楼2012-11-28 19:07:45







回复此楼