The game of life(生命游戏)新算法
我写了一种常见的实现算法,和另一种新算法,即不是每次循环计算每个细胞的周围细胞数来产生下一时刻,而是每次每个产生状态变化的细胞主动通知周围的邻居,因此每个细胞增加一个用来记录邻居数的字段。由邻居数决定每个细胞的出生和死亡,然后影响周围邻居的邻居数。并且为了不影响后续细胞的判断,需要新旧邻居数两个状态,用旧邻居数决定自己生死,而自己的生死变化影响周围邻居的新邻居数。另外如果某个格子的新旧邻居数不变则状态不变,增加一个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(生命游戏)新算法相关推荐
- 生命游戏的计算机程序,生命游戏,算法与实现
生命游戏,算法与实现 yanlb2000 0 一些关于"生命游戏"的基本概念 "生命游戏"在计算机界不是什么新鲜的事物,也不仅仅属于计算机科学.按我的理解,它大 ...
- 生命游戏,25号宇宙与奋斗者
1970年10月,英国科学家约翰·康威发明了一款生命游戏,游戏的意义在于模拟细胞的生存繁衍.这个游戏发表在<科学美国人>杂志上.感兴趣的同学可以登录网站https://playgameof ...
- Python实现生命游戏(Game of Life)
生命游戏的算法就不多解释了,百度一下介绍随处可见. 因为网上大多数版本都是基于pygame,matlab等外部库实现的,二维数组大多是用numpy,使用起来学习成本比较高,所以闲暇之余写一个不用外部依 ...
- “生命游戏”的多线程算法思考[转]
Intel正在ISN网站上举办一个多线程编程大赛,值得关注.Intel过去几年举办过好几次线程技术大赛,包括与topcoder合作的一些竞赛,质量都不错.题目难度适中,而且具有启发性,对多核编程感兴趣 ...
- “生命游戏”的多线程算法思考
Intel正在ISN网站上举办一个多线程编程大赛,值得关注.Intel过去几年举办过好几次线程技术大赛,包括与topcoder合作的一些竞赛,质量都不错.题目难度适中,而且具有启发性,对多核编程感兴趣 ...
- 伍六七带你学算法 进阶篇-生命游戏
有趣的算法题–生命游戏 难度-中等 根据 百度百科 ,生命游戏,简称为生命,是英国数学家约翰·何顿·康威在 1970 年发明的细胞自动机. 想要体验生命游戏的小伙伴可以到这里-->生命游戏 进入 ...
- 【老生谈算法】matlab实现生命游戏源码——生命游戏
MATLAB实现生命游戏源码 1.文档下载: 本算法已经整理成文档如下,有需要的朋友可以点击进行下载 序号 文档(点击下载) 本项目文档 [老生谈算法]MATLAB实现生命游戏源码.docx 2.算法 ...
- 算法思考--------生命游戏
一. 问题说明 生命游戏其实是一个零玩家游戏,英文名叫Game of Life,也称生命棋.它包括一个二维矩形世界,这个世界中的每个方格居住着一个活着的或死了的细胞.一个细胞在下一个 ...
- 「 生活太重要了,不能太过严肃 」:生命游戏之父、最神奇的数学家John Conway...
点击上方"AI遇见机器学习",选择"星标"公众号 重磅干货,第一时间送达 来自:机器之心 在 82 年的人生中,John Conway 始终保持着狡黠淘气的幽默 ...
- 漫画:生命游戏(头条、Google 面试题)
今天是小浩算法"365刷题计划"第102天.每个人的起点和终点都是一样的,但过程却各不相同.我们无法主宰生死却可以选择如何让生命有意义.我们如何用算法来进行一场生命的游戏呢! 01 ...
最新文章
- 瀑布式开发与敏捷开发的区别是什么
- 机器学习漫谈:深度学习的辉煌
- 配置免密码登录Linux服务器
- windows8专业版安装sql2012
- 敏感词库 php,敏感词过滤的php类库
- 错误 1093 You can't specify target table 'table name' for update in FROM clause
- 学过物理的人才能看懂的笑话,你能看明白几个?
- DIY制作otto机器人
- 硬件电路基础(2)RF 一些概念
- 修改本机域名服务器为Google Public DNS或者OpenDNS
- kafka实现组内广播
- 纯css解决div隐藏浏览器原生滚动条,但保留鼠标滚动效果的问题
- PMP 考试一定要报培训班吗?(PMP备考资料分享)
- 怕被发垃圾邮件?用临时邮箱来注册账号
- 欢迎使用CSDN-markdown编辑器大范甘迪
- 巴黎报纸对拿破仑的描述
- 折腾T480及VMware
- 图形验证码和短信验证码
- 微信小程序瀑布流实现
- 你从未见过的“地狱级”烂项目
热门文章
- 哈工大刘铭:开放式知识图谱的自动构建技术
- 超全必读!NLP 事件抽取综述(下)
- 百度盘搜失效?这款网盘搜索神器万万别错过!
- 2019: 属于BERT预训练语言模型之年
- 学界 | Hinton提出的经典防过拟合方法Dropout,只是SDR的特例
- 什么是迁移学习 (Transfer Learning)?这个领域历史发展前景如何?【文末彩蛋】...
- 中科大软件学院硕士:实习秋招百多轮面试总结(中)
- Mysql/Mariadb本地不可以登录,远程可以登录问题的解决
- Java中equals与==的区别(全面)
- 《linux核心应用命令速查》连载十二:top:显示进程