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

所属分类: 软件编程 / C 语言 阅读数: 86
收藏 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++中四种对象生存期和作用域以及static的用法总结分析

以下是对C++中四种对象生存期和作用域以及static的用法进行了详细的介绍,需要的朋友可以过来参考下
收藏 0 赞 0 分享

C++嵌套类与局部类详细解析

从作用域的角度看,嵌套类被隐藏在外围类之中,该类名只能在外围类中使用。如果在外围类之外的作用域使用该类名时,需要加名字限定
收藏 0 赞 0 分享

C++空类详解

以下是对C++中的空类进行了详细的介绍,需要的朋友可以过来参考下
收藏 0 赞 0 分享

C++之友元:友元函数和友元类详解

友元是一种允许非类成员函数访问类的非公有成员的一种机制。可以把一个函数指定为类的友元,也可以把整个类指定为另一个类的友元
收藏 0 赞 0 分享

C++中返回指向函数的指针示例

int (*ff(int)) (int *,int);表示:ff(int)是一个函数,带有一个int型的形参,该函数返回int (*) (int *,int),它是一个指向函数的指针,所指向的函数返回int型并带有两个分别是Int*和int型的形参
收藏 0 赞 0 分享

C数据结构之单链表详细示例分析

以下是对C语言中的单链表进行了详细的分析介绍,需要的朋友可以过来参考下
收藏 0 赞 0 分享

C数据结构之双链表详细示例分析

以下是对c语言中的双链表进行了详细的分析介绍,需要的朋友可以过来参考下
收藏 0 赞 0 分享

浅析如何在c语言中调用Linux脚本

如何在c语言中调用Linux脚本呢?下面小编就为大家详细的介绍一下吧!需要的朋友可以过来参考下
收藏 0 赞 0 分享

深入解析unsigned int 和 int

以下是对unsigned int和int进行了详细的分析介绍,需要的朋友可以过来参考下
收藏 0 赞 0 分享

浅谈C++中的string 类型占几个字节

本篇文章小编并不是为大家讲解string类型的用法,而是讲解我个人比较好奇的问题,就是string 类型占几个字节
收藏 0 赞 0 分享
查看更多