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

所属分类: 软件编程 / C 语言 阅读数: 50
收藏 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++实现广播通信的方法,实例讲述了C++ socket广播通信的原理与实现方法,需要的朋友可以参考下
收藏 0 赞 0 分享

C++计算ICMP头的校验和实例

这篇文章主要介绍了C++计算ICMP头的校验和的方法,代码简单实用,对于校验ICMP报文来说有不错的实用价值,需要的朋友可以参考下
收藏 0 赞 0 分享

C++设置超时时间的简单实现方法

这篇文章主要介绍了C++设置超时时间的简单实现方法,涉及系统函数setsockopt对套接口的操作,具有一定的实用价值,需要的朋友可以参考下
收藏 0 赞 0 分享

C++实现ping程序实例

这篇文章主要介绍了C++实现ping程序实例,涉及C++对于ICMP数据包的发送与回显处理,具有一定的实用价值,需要的朋友可以参考下
收藏 0 赞 0 分享

C++之boost::array的用法

这篇文章主要介绍了C++之boost::array的用法,以实例的形式简单讲述了静态数组的容器boost::array的使用技巧,具有一定的参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

C++之Boost::array用法简介

这篇文章主要介绍了C++之Boost::array用法简介,较为详细的分析了Boost::array中的常见用法,并用实例的形式予以总结归纳,需要的朋友可以参考下
收藏 0 赞 0 分享

VC文件目录常见操作实例汇总

这篇文章主要介绍了VC文件目录常见操作实例汇总,总结了VC针对文件目录的各种常用操作,非常具有实用价值,需要的朋友可以参考下
收藏 0 赞 0 分享

VC打印word,excel文本文件的方法

这篇文章主要介绍了VC打印word,excel文本文件的方法,是VC操作文本文件中非常实用的技巧,需要的朋友可以参考下
收藏 0 赞 0 分享

VC++获得当前进程运行目录的方法

这篇文章主要介绍了VC++获得当前进程运行目录的方法,可通过系统函数实现该功能,是非常实用的技巧,需要的朋友可以参考下
收藏 0 赞 0 分享

VC中SendMessage和PostMessage的区别

这篇文章主要介绍了VC中SendMessage和PostMessage的区别,较为全面的分析了SendMessage和PostMessage运行原理及用法上的不同之处,非常具有实用价值,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多