24小时热门版块排行榜    

查看: 2050  |  回复: 3
当前只显示满足指定条件的回帖,点击这里查看本话题的所有回帖

MajorMei

金虫 (小有名气)

[求助] 修改一个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         old = malloc(nj*sizeof(int));
        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 ]
回复此楼

» 猜你喜欢

已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

MajorMei

金虫 (小有名气)

引用回帖:
2楼: Originally posted by 缘不可解 at 2012-11-28 13:38:25
还需要读文件??请麻烦说的具体点,输入数据的具体格式是什么、

想把程序改成用户自定义某些参数运行的模式,输入的数据分为两部分,比如输入

5    grid.txt

就说明生命游戏要执行五步,初始矩阵是grid.txt这个文件里面的样子

grid.txt由三部分构成:m,n和矩阵

m 为行数
n 为列数

举例:
5
6
01100
01110
01000
00000
00000
00000

例子中是grid.txt这个文件的内容

通过命令行中的grid.txt调用此文件中的信息,然后运行程序,输出存活的细胞数。

谢谢您的回复,如果需要更详细的信息我会尽快回复您。请指点!
3楼2012-11-28 13:57:43
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
查看全部 4 个回答

缘不可解

新虫 (初入文坛)

【答案】应助回帖

感谢参与,应助指数 +1
还需要读文件??请麻烦说的具体点,输入数据的具体格式是什么、
坚持奋斗,学会感恩,懂得珍惜
2楼2012-11-28 13:38:25
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

libralibra

至尊木虫 (著名写手)

骠骑将军

【答案】应助回帖


感谢参与,应助指数 +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...没有什么简化的空间,写出来看着清楚一些.
CODE:

void Run(int **mat, int m, int n)
{
        int i,j;
        int sum;
        for (i=0;i         {
                for (j=0;j                 {
                        sum = 0;
                        if (i==0 && j==0) // 左上角
                        {
                                // 设置sum
                        }
                        else if (i==m-1 && j==0) // 左下角
                        {
                                // 设置sum
                        }
                        else if (i==0 && j==n-1) // 右上角
                        {
                                // 设置sum
                        }
                        else if (i==m-1 && j==n-1) // 右下角
                        {
                                // 设置sum
                        }
                        else if (i==0) // 第一行
                        {
                                // 设置sum
                        }
                        else if (i==m-1) // 最后一行
                        {
                                // 设置sum
                        }
                        else if (j==0) // 第一列
                        {
                                // 设置sum
                        }
                        else if (j==n-1) // 最后一列
                        {
                                // 设置sum
                        }
                        else // 其他内部元素
                        {
                                // 设置sum
                        }

                        if (sum==3) // 邻域等于3,当前cell活
                        {
                                mat[m][n] = 1;
                        }
                        else if (sum!=2) // 领域不是3也不是2,当前cell死(根据你上面的规则,看起来2的时候不变)
                        {
                                mat[m][n] = 0;
                        }
                }
        }
}

matlab/VB/python/c++/Java写程序请发QQ邮件:790404545@qq.com
4楼2012-11-28 19:07:45
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[考研] 263求调剂 +4 yqdszhdap- 2026-03-22 4/200 2026-03-22 21:20 by 1144970272
[考研] 石河子大学(211、双一流)硕博研究生长期招生公告 +3 李子目 2026-03-22 3/150 2026-03-22 21:01 by 怎么释怀
[考研] 298求调剂 +6 上岸6666@ 2026-03-20 6/300 2026-03-22 20:21 by edmund7
[考研] 354求调剂 +7 Tyoumou 2026-03-18 10/500 2026-03-22 11:11 by 人来盛
[基金申请] 山东省面上项目限额评审 +4 石瑞0426 2026-03-19 4/200 2026-03-22 08:50 by Wei_ren
[考研] 材料学硕301分求调剂 +7 Liyouyumairs 2026-03-21 7/350 2026-03-21 22:31 by peike
[考研] 材料 271求调剂 +5 展信悦_ 2026-03-21 5/250 2026-03-21 17:29 by 学员8dgXkO
[考研] 299求调剂 +5 shxchem 2026-03-20 7/350 2026-03-21 17:09 by ColorlessPI
[考研] 266求调剂 +3 哇呼哼呼哼 2026-03-20 3/150 2026-03-21 16:46 by barlinike
[考研] 304求调剂 +6 曼殊2266 2026-03-18 6/300 2026-03-21 00:32 by JourneyLucky
[考研] 294求调剂材料与化工专硕 +15 陌の森林 2026-03-18 15/750 2026-03-20 23:28 by JourneyLucky
[考研] 329求调剂 +9 想上学吖吖 2026-03-19 9/450 2026-03-20 22:01 by luoyongfeng
[考研] 一志愿西安交通大学 学硕 354求调剂211或者双一流 +3 我想要读研究生 2026-03-20 3/150 2026-03-20 20:13 by JourneyLucky
[考研] 320求调剂0856 +3 不想起名字112 2026-03-19 3/150 2026-03-19 22:53 by 学员8dgXkO
[考研] 生物学调剂招人!!! +3 山海天岚 2026-03-17 4/200 2026-03-19 21:34 by 怎么释怀
[考研] 材料工程专硕调剂 +5 204818@lcx 2026-03-17 6/300 2026-03-18 22:55 by 204818@lcx
[考研] 301求调剂 +4 A_JiXing 2026-03-16 4/200 2026-03-17 17:32 by ruiyingmiao
[考研] 308求调剂 +4 是Lupa啊 2026-03-16 4/200 2026-03-17 17:12 by ruiyingmiao
[考博] 26申博 +4 八6八68 2026-03-16 4/200 2026-03-17 13:00 by 轻松不少随
[考研] 333求调剂 +3 文思客 2026-03-16 7/350 2026-03-16 18:21 by 文思客
信息提示
请填处理意见