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

 更新时间:2014年07月04日 15:34:14   投稿:shichen2014  
这篇文章主要介绍了C语言借助EasyX实现的生命游戏的方法,需要的朋友可以参考下

本文讲述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语言实现的统计php代码行数功能源码(支持文件夹、多目录)

    C语言实现的统计php代码行数功能源码(支持文件夹、多目录)

    这篇文章主要介绍了C语言实现的统计php代码行数功能源码,支持文件夹、多级目录的统计,在一些环境中会用到这个功能,需要的朋友可以参考下
    2014-08-08
  • C语言 解决不用+、-、×、÷数字运算符做加法的实现方法

    C语言 解决不用+、-、×、÷数字运算符做加法的实现方法

    本篇文章是对在C语言中解决不用+、-、×、÷数字运算符做加法的方法进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C语言图书管理系统课程设计

    C语言图书管理系统课程设计

    这篇文章主要为大家详细介绍了C语言图书管理系统课程设计,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • C语言编程中从密码文件获取数据的函数总结

    C语言编程中从密码文件获取数据的函数总结

    这篇文章主要介绍了C语言编程中从密码文件获取数据的函数总结,包括getpw()函数和getpwnam()函数以及getpwuid()函数,需要的朋友可以参考下
    2015-08-08
  • 一道超经典的C++结构体的题目

    一道超经典的C++结构体的题目

    以下小编就为大家介绍一道超经典的关于C++结构体的题目。需要的朋友可以过来参考下
    2013-09-09
  • VC中BASE64编码和解码使用详解

    VC中BASE64编码和解码使用详解

    Base64是一种很常用的编码方式,利用它可以将任何二进制的字符编码到可打印的64个字符之中, 这样,不管是图片,中文文本等都可以编码成只有ASCII的纯文本。
    2015-11-11
  • C语言数据结构之串插入操作

    C语言数据结构之串插入操作

    这篇文章主要介绍了C语言数据结构之串插入操作的相关资料,希望通过本文能帮助到大家,让大家实现这样的功能,需要的朋友可以参考下
    2017-10-10
  • 华为笔试算法题汇总

    华为笔试算法题汇总

    这篇文章主要为大家汇总了华为笔试算法题,每一题都给出了详细代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-09-09
  • STL各个容器性能详细比较

    STL各个容器性能详细比较

    从下面表中的数据来看写入用时vector和deque很快,因为他们内存分配次数少,关联容器和list都是一个一个分配的,一个一个分配也会造成内存碎片,内存利用率低
    2013-09-09
  • C语言中的奇技淫巧

    C语言中的奇技淫巧

    学习C语言的过程中,总会遇到很多令人眼前一亮的代码,尤其是你写了几十行的代码,别人只用了简单几行的递归就实现的功能。下面我就总结几个C语言中 比较新手向的代码。让你有一种woc!还能这么写的想法
    2018-08-08

最新评论