我写了一种常见的实现算法,和另一种新算法,即不是每次循环计算每个细胞的周围细胞数来产生下一时刻,而是每次每个产生状态变化的细胞主动通知周围的邻居,因此每个细胞增加一个用来记录邻居数的字段。由邻居数决定每个细胞的出生和死亡,然后影响周围邻居的邻居数。并且为了不影响后续细胞的判断,需要新旧邻居数两个状态,用旧邻居数决定自己生死,而自己的生死变化影响周围邻居的新邻居数。另外如果某个格子的新旧邻居数不变则状态不变,增加一个changed字段来表示。
下面分别是旧、新两种算法。

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3
 4 #define ROW 20
 5 #define COL 60
 6 #define FILEPATH "1.txt"
 7
 8
 9 int countNbor(char data[][COL],int i,int j);
10 void world(void);
11
12
13 int main(void)
14 {
15     world();
16     return 0;
17 }
18
19 void world(void)
20 {
21     int i,j;
22     char data[ROW][COL];
23     char temp[ROW][COL];
24     int time=0;
25
26
27     FILE *fp=fopen(FILEPATH,"r");
28
29     for(i=0;i<ROW;i++)
30     {
31         for(j=0;j<COL;j++)
32         {
33             if(fgetc(fp)=='*')  //表示细胞的字符
34                 temp[i][j]=data[i][j]='*';
35             else temp[i][j]=data[i][j]=' ';
36         }
37         fgetc(fp);
38     }
39     fclose(fp);
40
41     while(1)
42     {
43         time++;
44
45         system("CLS");
46         for(i=0;i<ROW;i++)
47         {
48             for(j=0;j<COL;j++)
49                 printf("%c",data[i][j]);
50             printf("\n");
51         }
52         printf("次数:%d\n",time);
53
54         system("PAUSE>NUL");
55
56         for(i=0;i<ROW;i++)
57             for(j=0;j<COL;j++)
58                 switch(countNbor(temp,i,j))
59                 {
60                 case 3:
61                     data[i][j]='*';
62                     break;
63                 case 2:
64                     break;
65                 default:
66                     data[i][j]=' ';
67                     break;
68                 }
69
70         for(i=0;i<ROW;i++)
71             for(j=0;j<COL;j++)
72                 temp[i][j]=data[i][j];
73     }
74
75 }
76
77 int countNbor(char data[][COL],int i,int j)
78 {
79     int m,n;
80     int count=0;
81
82     for(m=i-1;m<=i+1;m++)
83         for(n=j-1;n<=j+1;n++)
84             if( (m==i&&n==j) ||m<0||n<0||m==ROW||n==COL)
85                 continue;
86             else if(data[m][n]=='*') count++;
87
88     return count;
89 }

old.c

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3
  4
  5 #define ROW 20
  6 #define COL 60
  7 #define FILEPATH "1.txt"
  8
  9
 10 typedef struct{
 11     int live;       //1、0表生死
 12     int nbor_old;   //旧邻居数,用于判断细胞生死
 13     int nbor_new;   //新邻居数,用于下一时刻
 14     int changed;    //邻居数是否变化
 15 }Cell;
 16
 17 typedef struct{
 18     Cell cell[ROW+2][COL+2];    //+2留边
 19     int lives_num;      //细胞数目
 20     int time_count;     //第几轮
 21 }World;
 22
 23 void showWorld(World *world);
 24 void sendNbor(Cell cell[][COL+2],int i,int j,int live);
 25 void processCell(World *world,int i,int j);
 26 void iniWorld(World *world);
 27 void runWorld(void);
 28
 29
 30 int main(void)
 31 {
 32     runWorld();
 33     return 0;
 34 }
 35
 36
 37 void runWorld(void)
 38 {
 39     World world;
 40     Cell (*cell)[COL+2]=world.cell;
 41     int i,j;
 42
 43     //从文件初始化
 44     iniWorld(&world);
 45
 46     while(1)
 47     {
 48
 49         world.time_count++;
 50         showWorld(&world);
 51
 52         //前提 cell[i][j].nbor_old==cell[i][j].nbor_new
 53         //邻居数不变则状态不变,不用处理
 54         for(i=1;i<=ROW;i++)
 55             for(j=1;j<=COL;j++)
 56                 if(cell[i][j].changed)
 57                     processCell(&world,i,j);    //判断自身,影响周围
 58
 59         for(i=1;i<=ROW;i++)
 60             for(j=1;j<=COL;j++)
 61                 if(cell[i][j].nbor_old==cell[i][j].nbor_new)
 62                     cell[i][j].changed=0;
 63                 else
 64                 {
 65                     cell[i][j].changed=1;
 66                     cell[i][j].nbor_old=cell[i][j].nbor_new;
 67                 }
 68
 69     }
 70 }
 71
 72
 73
 74 void iniWorld(World *world)
 75 {
 76     int i,j;
 77     FILE *fp=fopen(FILEPATH,"r");
 78     Cell (*cell)[COL+2]=world->cell;
 79
 80
 81     world->time_count=0;
 82     world->lives_num=0;
 83
 84     for(i=1;i<=ROW;i++)
 85     {
 86         for(j=1;j<=COL;j++)
 87         {
 88             if(fgetc(fp)=='*')  //表示细胞的字符
 89             {
 90                 cell[i][j].live=1;
 91                 world->lives_num++;
 92             }
 93             else
 94                 cell[i][j].live=0;
 95
 96             cell[i][j].nbor_new=cell[i][j].nbor_old=0;
 97             cell[i][j].changed=1;   //为了第一次循环每个细胞都能处理
 98         }
 99         fgetc(fp);  //换行符
100     }
101
102     fclose(fp);
103
104     //填充nbor_old和nbor_new
105     for(i=1;i<=ROW;i++)
106         for(j=1;j<=COL;j++)
107             if(cell[i][j].live)
108             {
109                 cell[i-1][j-1].nbor_old =++cell[i-1][j-1].nbor_new;
110                 cell[i-1][j].nbor_old   =++cell[i-1][j].nbor_new;
111                 cell[i-1][j+1].nbor_old =++cell[i-1][j+1].nbor_new;
112                 cell[i][j-1].nbor_old   =++cell[i][j-1].nbor_new;
113                 cell[i][j+1].nbor_old   =++cell[i][j+1].nbor_new;
114                 cell[i+1][j-1].nbor_old =++cell[i+1][j-1].nbor_new;
115                 cell[i+1][j].nbor_old   =++cell[i+1][j].nbor_new;
116                 cell[i+1][j+1].nbor_old =++cell[i+1][j+1].nbor_new;
117             }
118 }
119
120
121 //由old决定生死,并改变周围细胞的new
122 void processCell(World *world,int i,int j)
123 {
124     Cell (*cell)[COL+2]=world->cell;
125
126     switch(cell[i][j].nbor_old)
127     {
128     case 3:
129         if(!cell[i][j].live)
130         {
131             cell[i][j].live=1;
132             sendNbor(cell,i,j,1);
133             world->lives_num++;
134         }
135         break;
136     case 2: //不变
137         break;
138     default:
139         if(cell[i][j].live)
140         {
141             cell[i][j].live=0;
142             sendNbor(cell,i,j,-1);
143             world->lives_num--;
144         }
145         break;
146     }
147 }
148
149
150
151
152 //细胞状态改变后,影响周围细胞的邻居值,live为-1或1
153 void sendNbor(Cell cell[][COL+2],int i,int j,int live)
154 {
155     cell[i-1][j-1].nbor_new+=live;
156     cell[i-1][j].nbor_new+=live;
157     cell[i-1][j+1].nbor_new+=live;
158     cell[i][j-1].nbor_new+=live;
159     cell[i][j+1].nbor_new+=live;
160     cell[i+1][j-1].nbor_new+=live;
161     cell[i+1][j].nbor_new+=live;
162     cell[i+1][j+1].nbor_new+=live;
163 }
164
165
166 void showWorld(World *world)
167 {
168     int i,j;
169
170     system("CLS");
171
172     for(i=1;i<=ROW;i++)
173     {
174         for(j=1;j<=COL;j++)
175         {
176             if(world->cell[i][j].live)
177                 printf("*");
178             else printf(" ");
179         }
180         printf("\n");
181     }
182     printf("细胞数:%d\n次数:%d\n",world->lives_num,world->time_count);
183
184     system("PAUSE>NUL");
185 }

new.c

转载于:https://www.cnblogs.com/zackcoder/p/3250836.html

The game of life(生命游戏)新算法相关推荐

  1. 生命游戏的计算机程序,生命游戏,算法与实现

    生命游戏,算法与实现 yanlb2000 0 一些关于"生命游戏"的基本概念 "生命游戏"在计算机界不是什么新鲜的事物,也不仅仅属于计算机科学.按我的理解,它大 ...

  2. 生命游戏,25号宇宙与奋斗者

    1970年10月,英国科学家约翰·康威发明了一款生命游戏,游戏的意义在于模拟细胞的生存繁衍.这个游戏发表在<科学美国人>杂志上.感兴趣的同学可以登录网站https://playgameof ...

  3. Python实现生命游戏(Game of Life)

    生命游戏的算法就不多解释了,百度一下介绍随处可见. 因为网上大多数版本都是基于pygame,matlab等外部库实现的,二维数组大多是用numpy,使用起来学习成本比较高,所以闲暇之余写一个不用外部依 ...

  4. “生命游戏”的多线程算法思考[转]

    Intel正在ISN网站上举办一个多线程编程大赛,值得关注.Intel过去几年举办过好几次线程技术大赛,包括与topcoder合作的一些竞赛,质量都不错.题目难度适中,而且具有启发性,对多核编程感兴趣 ...

  5. “生命游戏”的多线程算法思考

    Intel正在ISN网站上举办一个多线程编程大赛,值得关注.Intel过去几年举办过好几次线程技术大赛,包括与topcoder合作的一些竞赛,质量都不错.题目难度适中,而且具有启发性,对多核编程感兴趣 ...

  6. 伍六七带你学算法 进阶篇-生命游戏

    有趣的算法题–生命游戏 难度-中等 根据 百度百科 ,生命游戏,简称为生命,是英国数学家约翰·何顿·康威在 1970 年发明的细胞自动机. 想要体验生命游戏的小伙伴可以到这里-->生命游戏 进入 ...

  7. 【老生谈算法】matlab实现生命游戏源码——生命游戏

    MATLAB实现生命游戏源码 1.文档下载: 本算法已经整理成文档如下,有需要的朋友可以点击进行下载 序号 文档(点击下载) 本项目文档 [老生谈算法]MATLAB实现生命游戏源码.docx 2.算法 ...

  8. 算法思考--------生命游戏

    一. 问题说明          生命游戏其实是一个零玩家游戏,英文名叫Game of Life,也称生命棋.它包括一个二维矩形世界,这个世界中的每个方格居住着一个活着的或死了的细胞.一个细胞在下一个 ...

  9. 「 生活太重要了,不能太过严肃 」:生命游戏之父、最神奇的数学家John Conway...

    点击上方"AI遇见机器学习",选择"星标"公众号 重磅干货,第一时间送达 来自:机器之心 在 82 年的人生中,John Conway 始终保持着狡黠淘气的幽默 ...

  10. 漫画:生命游戏(头条、Google 面试题)

    今天是小浩算法"365刷题计划"第102天.每个人的起点和终点都是一样的,但过程却各不相同.我们无法主宰生死却可以选择如何让生命有意义.我们如何用算法来进行一场生命的游戏呢! 01 ...

最新文章

  1. 瀑布式开发与敏捷开发的区别是什么
  2. 机器学习漫谈:深度学习的辉煌
  3. 配置免密码登录Linux服务器
  4. windows8专业版安装sql2012
  5. 敏感词库 php,敏感词过滤的php类库
  6. 错误 1093 You can't specify target table 'table name' for update in FROM clause
  7. 学过物理的人才能看懂的笑话,你能看明白几个?
  8. DIY制作otto机器人
  9. 硬件电路基础(2)RF 一些概念
  10. 修改本机域名服务器为Google Public DNS或者OpenDNS
  11. kafka实现组内广播
  12. 纯css解决div隐藏浏览器原生滚动条,但保留鼠标滚动效果的问题
  13. PMP 考试一定要报培训班吗?(PMP备考资料分享)
  14. 怕被发垃圾邮件?用临时邮箱来注册账号
  15. 欢迎使用CSDN-markdown编辑器大范甘迪
  16. 巴黎报纸对拿破仑的描述
  17. 折腾T480及VMware
  18. 图形验证码和短信验证码
  19. 微信小程序瀑布流实现
  20. 你从未见过的“地狱级”烂项目

热门文章

  1. 哈工大刘铭:开放式知识图谱的自动构建技术
  2. 超全必读!NLP 事件抽取综述(下)
  3. 百度盘搜失效?这款网盘搜索神器万万别错过!
  4. 2019: 属于BERT预训练语言模型之年
  5. 学界 | Hinton提出的经典防过拟合方法Dropout,只是SDR的特例
  6. 什么是迁移学习 (Transfer Learning)?这个领域历史发展前景如何?【文末彩蛋】...
  7. 中科大软件学院硕士:实习秋招百多轮面试总结(中)
  8. Mysql/Mariadb本地不可以登录,远程可以登录问题的解决
  9. Java中equals与==的区别(全面)
  10. 《linux核心应用命令速查》连载十二:top:显示进程