收藏 分享(赏)

生命游戏.doc

上传人:hskm5268 文档编号:9084945 上传时间:2019-07-23 格式:DOC 页数:10 大小:53.50KB
下载 相关 举报
生命游戏.doc_第1页
第1页 / 共10页
生命游戏.doc_第2页
第2页 / 共10页
生命游戏.doc_第3页
第3页 / 共10页
生命游戏.doc_第4页
第4页 / 共10页
生命游戏.doc_第5页
第5页 / 共10页
点击查看更多>>
资源描述

1、/* 此程序在 TC2.0 下调试通过 按任意键显示下一个状态 按 ESC 键退出程序 */ * * 生命游戏 * * /英国数学家 J.H.Conway 在 1970 年提出一种被称作“ 生命游戏”的小游戏。Life 游戏实际上是一种模拟,并不是游戏者之间的游戏。它在一个无边界的矩形网格上进行,这个矩形网格中的每个单元可被一个有机体占据,或者不被占据。被占据的单元称为活的,未被占据的单元称位死的。哪个单元是活的要根据其周围活的邻居单元数目而一代代地发生变化。游戏规则如下:1. 给定单元的邻居是与它在垂直,水平或对角上相界的 8 个单元。2. 如果 1 个单元为活的,但没有邻居单元是活的,或者

2、仅有一个邻居单元是活的,则在下一代,此单元会因为孤独而死亡。3. 如果 1 个单元周围有 2 个或者 3 个邻居单元为生,则该单元在下一代也是活的。4. 如果 1 个单元是死的,则在下一代,如果它刚好有 3 个邻居单元是活的,则此单元变成活的。所有其它死的单元在下一代仍然是死的。5. 如果 1 个单元为活的,且有 4 个或者 4 个以上邻居单元是活的,则在下一代,此单元会因为拥塞而死亡。6. 所有出生和死亡都刚好在同一时间发生,则此单元的死亡有助于另一个单元的出生,但它不能通过减少拥塞而阻止其他单元的死亡;正在出生的单元也不能保护或者杀死上一代中活的单元。依此规则进行迭代变化,使单元生生死死,

3、会得到一些有趣的结果。该游戏之所以被称为“生命游戏”,是因为其简单的游戏规则,反映了自然界中的生存规律:如果一个生命,其周围的同类生命太少的话,会因为得不到帮助而死亡;如果太多,则会因为得不到足够的资源而死亡。用计算机模拟这个“生命游戏” 设定图像中的初始配置后依据上述的游戏规则演绎生命的变化,由于初始状态和迭代次数不同,将会得到各种的优美图案。/*/#include #include #include #define ESC 0x11b#define forever 1/*/int now_life1+50+11+50+1; /* 当前单元 并加两行两列作为监视哨 */int next_li

4、fe1+50+11+50+1; /* 下一代单元 1 表示存活 0 表示死亡 */int back_color=15; /* 设置背景颜色 */int rim_color=9; /* 设置边框颜色 */int draw_color=4; /* 设置单元颜色 */int counter=0; /* 计算迭代次数 */char st_counter5=“0“; /* 将迭代次数转变为字符串 */*/void set_life(); /* 游戏初值设置 */void init_game(); /* 初始化游戏界面 */void count_life(int counter); /* 显示迭代次数 *

5、/void draw_life(); /* 画出或者删除游戏单元 */void rule_life(); /* 游戏规则 */void end_life(); /* 显示终结状态 */*/void main()int key,i;int driver=VGA,mode=VGAHI;initgraph(init_game(); /* 初始化游戏 */set_life();draw_life();getch();while(forever) /* 无限循环 */rule_life();draw_life();counter+;count_life(counter);key=bioskey(0);i

6、f(key=ESC) /* 退出游戏 */break;else;closegraph();int next_life1+50+11+50+1; /* 下一代单元 1 表示存活 0 表示死亡 */int back_color=15; /* 设置背景颜色 */int rim_color=9; /* 设置边框颜色 */int draw_color=4; /* 设置单元颜色 */int counter=0; /* 计算迭代次数 */char st_counter5=“0“; /* 将迭代次数转变为字符串 */*/void set_life(); /* 游戏初值设置 */void init_game()

7、; /* 初始化游戏界面 */void count_life(int counter); /* 显示迭代次数 */void draw_life(); /* 画出或者删除游戏单元 */void rule_life(); /* 游戏规则 */void end_life(); /* 显示终结状态 */*/void main()int key,i;int driver=VGA,mode=VGAHI;initgraph(init_game(); /* 初始化游戏 */set_life();draw_life();getch();while(forever) /* 无限循环 */rule_life();d

8、raw_life();counter+;count_life(counter);key=bioskey(0);if(key=ESC) /* 退出游戏 */break;else;closegraph();/*/* 游戏初值配置 */void set_life()int i,j;extern int now_life5252;/*/* 初值设置 1 “回“ 字形 */*for(i=1;i=50;i+)for(j=1;j=50;j+)now_lifeij=1;for(j=11;j40;j+)for(i=11;i40;i+)now_lifeji=0;/*/* 初值设置 2 “ X “ 型 */*for

9、(i=1;i=50;i+)now_lifeii=1;now_lifei50-i=1;*/*/* 初值设置 3 “ I “ 型 */*for(j=1;j=24;j+)for(i=1;i=50;i+)now_lifeji=1;*/*/* 初值设置 4 “ 死亡! 原因:单元密度过大 */*for(i=1;i=50;i+)for(j=1;j=50;j+)now_lifeij=1;*/*/* 初值设置 5 随机取值 */*randomize();for(i=1;i=50;i+)for(j=1;j=50;j+)now_lifeij=rand()%2;*/*/* 初值设置 6 “口“ 字形 周边发展 */

10、*for(i=2;i50;i+)for(j=2;j50;j+)now_lifeij=1;*/*/* 初值设置 7 嬉笑的猫 */* now_life2422=1; now_life2722=1;now_life2423=1; now_life2623=1;now_life2523=1; now_life2723=1; now_life2525=1; now_life2625=1;now_life2324=1;now_life2824=1;now_life2325=1;now_life2825=1;now_life2326=1;now_life2826=1; now_life2427=1; no

11、w_life2627=1;now_life2527=1; now_life2727=1;*/*/* 初值设置 8 破坏 */* for(i=1;i=13;i+)for(j=1;j=12;j+)now_life4*i-24*j-3=1;now_life4*i-24*j-2=1;now_life4*i-24*j-1=1;now_life11=1;/*/* 初值设置 9 病毒 */for(i=1;i=16;i+)for(j=1;j=16;j+)now_life3*i-13*j-1=1;now_life3*i-13*j=1;now_life3*i3*j-1=1;now_life3*i3*j=1;now

12、_life2425=1;/*/* 小窗口初始化显示 */for(i=1;i=50;i+)for(j=1;j=50;j+)if(now_lifeij)setfillstyle(SOLID_FILL,draw_color);elsesetfillstyle(SOLID_FILL,back_color);floodfill(60+(i-1)*8+1,40+(j-1)*8+1,rim_color);putpixel(490+2*i-1,50+2*j-1,getpixel(60+(i-1)*8+1,40+(j-1)*8+1);putpixel(490+2*i-1,50+2*j,getpixel(60+(

13、i-1)*8+1,40+(j-1)*8+1);putpixel(490+2*i,50+2*j-1,getpixel(60+(i-1)*8+1,40+(j-1)*8+1);putpixel(490+2*i,50+2*j,getpixel(60+(i-1)*8+1,40+(j-1)*8+1);end_life(); /* 将初始值传递给 end_life 函数 */*/* 初始化游戏界面 */void init_game()int i,j;setbkcolor(back_color);setcolor(rim_color);rectangle(52,32,468,448);rectangle(60

14、,40,460,440);outtextxy(490,35,“Start“);rectangle(490,50,591,151);outtextxy(490,175,“Counter“);outtextxy(560,175,st_counter);rectangle(490,190,591,291);outtextxy(490,315,“End“);rectangle(490,330,591,431);setfillstyle(SOLID_FILL,rim_color);floodfill(55+1,35+1,rim_color);for(i=0;i50;i+)line(60,40+i*8,4

15、60,40+i*8);for(i=0;i50;i+)line(60+i*8,40,60+i*8,440);for(i=0;i52;i+)for(j=0;j52;j+)now_lifeij=0;setcolor(BLUE);outtextxy(505,15,“Life Game“);setcolor(RED);line(490,25,590,25);/*/* 计算迭代次数 */void count_life(int counter)int i,count=0;int c_counter;setcolor(back_color);outtextxy(560,175,st_counter);c_co

16、unter=counter;for(;) /* 求出当前计数为几位数 */if(c_counter/10)count+;c_counter/=10;elsebreak;c_counter=counter; /* 将出当前计数转换为字符串 */for(i=0;i5;i+)if(c_counter)st_countercount-i=(char)(c_counter%10+(int)(0);c_counter=c_counter/10;elsebreak;st_countercount+1=0;setcolor(rim_color);outtextxy(560,175,st_counter);/*

17、 画出或者删除游戏单元 */void draw_life()int i,j;for(i=1;i=50;i+)for(j=1;j=50;j+)if(now_lifeij)setfillstyle(SOLID_FILL,draw_color);elsesetfillstyle(SOLID_FILL,back_color);floodfill(60+(i-1)*8+1,40+(j-1)*8+1,rim_color);putpixel(490+2*i-1,190+2*j-1,getpixel(60+(i-1)*8+1,40+(j-1)*8+1);putpixel(490+2*i-1,190+2*j,g

18、etpixel(60+(i-1)*8+1,40+(j-1)*8+1);putpixel(490+2*i,190+2*j-1,getpixel(60+(i-1)*8+1,40+(j-1)*8+1);putpixel(490+2*i,190+2*j,getpixel(60+(i-1)*8+1,40+(j-1)*8+1);/*/* 游戏规则 */void rule_life()int i,j;int neighbor;for(i=1;i=50;i+)for(j=1;j=50;j+) /* 规则 1. 给定单元的邻居是与它在垂直,水平或对角上相界的 8 个单元。*/neighbor = 0; neig

19、hbor = now_lifei-1j-1 + now_lifei-1 j + now_lifei-1j+1+ now_life i j-1 + now_life i j+1+ now_lifei+1j-1 + now_lifei+1 j + now_lifei+1j+1;switch(neighbor)case 0: /* 规则 2. 如果 1 个单元为活的,但没有邻居单元是活的, */case 1: /* 或者仅有一个邻居单元是活的 则在下一代,此单元会因为孤独而死亡。 */next_lifeij=0;break;case 2: /* 规则 3. 如果 1 个单元周围有 2 个邻居单元为生

20、,则该单元在下一代也是活的。*/next_lifeij=now_lifeij;break;case 3: /* 规则 4. 如果 1 个单元是死的,则在下一代,如果它刚好有 3 个邻居 */next_lifeij=1; /* 单元是活的 则此单元变成活的 其它死的单元在下一代仍然是死的*/break;case 4:default: /* 规则 5. 如果 1 个单元为活 且有 4 个或者 4 个以上邻居单元是活的*/next_lifeij=0; /* 则在下一代,此单元会因为拥塞而死亡。 */ break; /* 规则 6. 所有出生和死亡都刚好在同一时间发生,则此单元的 */ /* 死亡有助

21、于另一个单元的出生,但它不能通过减少拥塞而阻止 */* 其他单元的死亡;正在出生的单元也不能保护或者杀死上一代中活的单元。*/for(i=1;i=50;i+)for(j=1;j=50;j+)now_lifeij=next_lifeij;/* 小窗口显示终结状态 */void end_life()int counter;int end_life5252;int next_life5252;int i,j;int neighbor;for(i=0;i=52;i+)for(j=0;j=52;j+)end_lifeij=now_lifeij;for(counter=1;counter=999;coun

22、ter+) /* 快速迭代算出终结状态 */for(i=1;i=50;i+)for(j=1;j=50;j+) neighbor = 0; neighbor = end_lifei-1j-1 + end_lifei-1 j + end_lifei-1j+1+ end_life i j-1 + end_life i j+1+ end_lifei+1j-1 + end_lifei+1 j + end_lifei+1j+1;switch(neighbor)case 0: case 1: next_lifeij=0;break;case 2: next_lifeij=end_lifeij;break;c

23、ase 3: next_lifeij=1; break;case 4:default: next_lifeij=0; break; for(i=1;i=50;i+)for(j=1;j=50;j+)end_lifeij=next_lifeij;for(i=1;i=50;i+)for(j=1;j=50;j+)if(end_lifeij) putpixel(490+2*i-1,330+2*j-1,draw_color);putpixel(490+2*i-1,330+2*j,draw_color);putpixel(490+2*i,330+2*j-1,draw_color);putpixel(490+2*i,330+2*j,draw_color);

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报