C语言借助EasyX实现的生命游戏源码

所属分类: 软件编程 / C 语言 阅读数: 66
收藏 0 赞 0 分享

本文讲述C语言借助EasyX实现的生命游戏,具体操作流程如下:

1.生命游戏内容:

该游戏包括一个二维矩形世界,这个世界中的每个方格居住着一个活着的或死了的细胞。一个细胞在下一个时刻生死取决于相邻八个方格中活着的细胞的数量。如果一个细胞周围的活细胞数量多于 3 个,这个细胞会因为资源匮乏而在下一个时刻死去;如果一个位置周围有 3 个活细胞,则该位置在下一个时刻将诞生一个新的细胞;如果一个位置周围有 2 个活细胞,则该位置的细胞生死状态保持不变;如果一个细胞周围的活细胞少于 2 个,那么这个细胞会因太孤单而死去。这样整个生命世界才不至于太过荒凉或拥挤,而是一种动态的平衡。

2.实现代码如下:

///////////////////////////////////////////////////
// 程序名称:生命游戏
// 编译环境:Visual C++ 6.0,EasyX
//
#include 
#include 
#include 
// 定义全局变量
__int8 world[102][102] = {0}; // 定义二维世界
IMAGE imgLive, imgEmpty; // 定义活细胞和无细胞区域的图案
// 函数声明
void Init();   // 初始化
void SquareWorld();  // 创建一个细胞以方形分布的世界
void RandWorld();  // 创建一个细胞随机分布的世界
void PaintWorld();  // 绘制世界
void Evolution();  // 进化
// 主函数
int main()
{
 Init();
 int Speed = 500;  // 游戏速度(毫秒)
 while(true)
 {
 if (kbhit() || Speed == 900)
 {
  char c = getch();
  if (c == ' ' && Speed != 900)
  c = getch();
  if (c >= '0' && c <= '9')
  Speed = ('9' - c) * 100;
  switch(c)
  {
  case 's':
  case 'S':
   SquareWorld(); // 产生默认的细胞以方形分布的世界
   break;
  case 'r':
  case 'R':
   RandWorld(); // 产生默认的细胞以方形分布的世界
   break;
  case VK_ESCAPE:
   goto END;
  }
 }
 Evolution();  // 进化
 PaintWorld();  // 绘制世界
 if (Speed != 900) // 速度为 900 时,为按任意键单步执行
  Sleep(Speed);
 }
END:
 closegraph();
 return 0;
}
///////////////////////////////////////////////////
// 函数定义
// 初始化
void Init()
{
 // 创建绘图窗口
 initgraph(640,480);
 // 设置随机种子
 srand((unsigned)time(NULL));
 // 调整世界图案的大小
 Resize(&imgLive, 4, 4);
 Resize(&imgEmpty, 4, 4);
 // 绘制有生命世界的图案
 SetWorkingImage(&imgLive);
 setcolor(GREEN);
 setfillstyle(GREEN);
 fillellipse(0, 0, 3, 3);
 // 绘制无生命世界的图案
 SetWorkingImage(&imgEmpty);
 setcolor(DARKGRAY);
 rectangle(1, 1, 2, 2);
 // 恢复对默认窗口的绘图
 SetWorkingImage(NULL);
 // 输出简单说明
 setfont(24, 0, "黑体");
 outtextxy(254, 18, "生 命 游 戏");
 RECT r = {440, 60, 620, 460};
 setfont(12, 0, "宋体");
 drawtext("生命游戏简介:\n  生命游戏包括一个二维矩形世界,这个世界中的每个方格居住\n着一个活着的或死了的细胞。一个细胞在下一个时刻生死取决于相邻八个方格中活着的细胞\n的数量。如果一个细胞周围的活细胞数量多于 3 个,这个细胞会因为资源匮乏而在下一个时\n刻死去;如果一个位置周围有 3 个活细胞,则该位置在下一个时刻将诞生一个新的细胞;如\n果一个位置周围有 2 个活细胞,则该位置的细胞生死状态保持不变;如果一个细胞周围的活\n细胞少于 2 个,那么这个细胞会因太孤单而死去。这样整个生命世界才不至于太过荒凉或拥\n挤,而是一种动态的平衡。\n\n游戏控制:\n 0-9: 调节速度(慢--快)\n ESC: 退出\n空格: \n暂停|继续\n  S: 创建细胞以方形分布的世界\n  R: 创建细胞随机分布的世界",&r, DT_WORDBREAK);
 // 产生默认的细胞以方形分布的世界
 SquareWorld();
}
// 创建一个细胞以方形分布的世界
void SquareWorld()
{
 memset(world, 0, 102 * 102 * sizeof(__int8));
 for(int x = 1; x <= 100; x++)
 world[x][1] = world[x][100] = 1;
 for(int y = 1; y <= 100; y++)
 world[1][y] = world[100][y] = 1;
}
// 创建一个细胞随机分布的世界
void RandWorld()
{
 for(int x = 1; x <= 100; x++)
 for(int y = 1; y <= 100; y++)
  world[x][y] = rand() % 2;
}
// 绘制世界
void PaintWorld()
{
 for(int x = 1; x <= 100; x++)
 for(int y = 1; y <= 100; y++)
  putimage(16 + x * 4, 56 + y * 4, world[x][y] ? &imgLive : &imgEmpty);
}
// 进化
void Evolution()
{
 __int8 tmp[102][102] = {0}; // 临时数组
 int sum;
 for(int x = 1; x <= 100; x++)
 {
 for(int y = 1; y <= 100; y++)
 {
  // 计算周围活着的生命数量
  sum = world[x+1][y] + world[x+1][y-1] + world[x][y-1] + world[x-1][y-1]
  + world[x-1][y] + world[x-1][y+1] + world[x][y+1] + world[x+1][y+1];
  // 计算当前位置的生命状态
  switch(sum)
  {
  case 3: tmp[x][y] = 1;  break;
  case 2: tmp[x][y] = world[x][y]; break;
  default: tmp[x][y] = 0;  break;
  }
 }
 }
 // 将临时数组恢复为世界
 memcpy(world, tmp, 102 * 102 * sizeof(__int8));
}

3.效果如下图所示:

更多精彩内容其他人还在看

利用C语言来求最大连续子序列乘积的方法

这篇文章主要介绍了利用C语言来求最大连续子序列乘积的方法,基本的思路以外文中还附有相关ACM题目,需要的朋友可以参考下
收藏 0 赞 0 分享

用C语言判断一个二叉树是否为另一个的子结构

这篇文章主要介绍了用C语言判断一个二叉树是否为另一个的子结构,是数据结构学习当中的基础知识,需要的朋友可以参考下
收藏 0 赞 0 分享

C语言实现的阶乘,排列和组合实例

这篇文章主要介绍了C语言实现的阶乘,排列和组合的方法,涉及C语言数学运算的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

C语言查找数组里数字重复次数的方法

这篇文章主要介绍了C语言查找数组里数字重复次数的方法,涉及C语言针对数组的遍历与判断技巧,具有一定参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

C语言简单实现计算字符个数的方法

这篇文章主要介绍了C语言简单实现计算字符个数的方法,涉及C语言针对字符串的简单遍历与判定技巧,具有一定参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

c实现linux下的数据库备份

本文给大家简单介绍下c实现linux下的数据库备份的方法和具体的源码,十分的实用,有需要的小伙伴可以参考下。
收藏 0 赞 0 分享

C++获得文件状态信息的方法

这篇文章主要介绍了C++获得文件状态信息的方法,包括文件状态信息、文件所在磁盘盘符、文件创建时间、访问时间及修改日期等,需要的朋友可以参考下
收藏 0 赞 0 分享

C语言按关键字搜索文件夹中文件的方法

这篇文章主要介绍了C语言按关键字搜索文件夹中文件的方法,涉及C语言文件操作及字符串查找的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

C语言之字符串模糊查询方法的实现

本篇文章主要为大家介绍字符串模糊查询的C语言程序编写方法,有需要的朋友可以参考下
收藏 0 赞 0 分享

C语言实现BMP转换JPG的方法

这篇文章主要介绍了C语言实现BMP转换JPG的方法,涉及C#图片格式转换的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多