0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

C语言零基础项目:生命游戏!详细思路+源码分享

C语言编程学习基地 来源:C语言编程学习基地 2022-12-22 11:17 次阅读

每天一个C语言小项目,提升你的编程能力!

程序简介

生命游戏也叫康威生命游戏、细胞自动机、元胞自动机等。

生命游戏不需要任何玩家,它是一个二维矩形世界,这个世界中的每个方格居住着一个活细胞或为空。

一个细胞在下一个时刻的生死取决于相邻八个方格中的活细胞数量,使整个生命世界不至于太过荒凉或拥挤,达成一种动态的平衡。

当一个方格没有活细胞时:

若周围有 3 个活细胞,则该方格产生一个活细胞(模拟繁殖)。

当一个方格存在活细胞时:

若周围少于 2 个活细胞,则该方格的细胞死亡(模拟人口稀疏)。

若周围有 2 个或 3 个活细胞,保持原样。

若周围多于 3 个活细胞,则该方格的细胞死亡(模拟极度拥挤)。

程序执行效果

1bd8455a-8106-11ed-8abf-dac502259ad0.png

多的也不说啦!聪明的人已经动手实践去了~

本项目编译环境:Visual Studio 2019/2022,EasyX插件

代码展示:

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

游戏控制:
 0-9: 调节速度(慢--快)
 ESC: 退出
空格:     暂停|继续
   S: 创建细胞以方形分布的世界
   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));
}

大家赶紧去动手试试吧!

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 游戏
    +关注

    关注

    2

    文章

    727

    浏览量

    26257
  • C语言
    +关注

    关注

    180

    文章

    7591

    浏览量

    135770
  • 源码
    +关注

    关注

    8

    文章

    632

    浏览量

    29100

原文标题:C语言零基础项目:生命游戏!详细思路+源码分享

文章出处:【微信号:cyuyanxuexi,微信公众号:C语言编程学习基地】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    C语言零基项目:涂格子(点灯)游戏详细思路+源码分享

    点灯游戏是一个十分有趣的智力游戏:有一行N行N列的灯,开始时全部是灭的,当你点击其中一盏灯时他的上下左右(若存在的话)状态全部改变,现在要求你在限定的时间内以最少地步数,将全部的灯点亮。
    发表于 12-16 09:47 805次阅读

    C语言零基项目:贪吃蛇!详细思路+源码分享

    每天一个C语言项目,提升你的编程能力!
    发表于 12-19 11:04 614次阅读

    零基础怎样学习C语言呢?

    零基础学c语言如何开始
    发表于 05-15 10:23

    C语言游戏源码分享

    C语言游戏源码24点火柴人俄罗斯等等等35个游戏源码网盘分享链接:https://pan.ba
    发表于 04-12 17:11

    C语言零基础入门教学资料汇总下载

    C语言零基础入门教学资料汇总下载
    发表于 05-29 10:41 132次下载

    C语言零基项目:打字母游戏详细思路+源码分享

    今天就用C语言写了这么个打字母的小程序,就是以前学习机上那种字母往下掉,然后按相应键字母消失的游戏
    发表于 12-15 15:02 594次阅读

    C语言零基项目:俄罗斯方块游戏详细思路+源码分享

    由小方块组成的不同形状的板块陆续从屏幕上方落下来,玩家通过调整板块的位置和方向,使它们在屏幕底部拼出完整的一条或几条。这些完整的横条会随即消失,给新落下来的板块腾出空间,与此同时,玩家得到分数奖励。没有被消除掉的方块不断堆积起来,一旦堆到屏幕顶端,玩家便告输,游戏结束。
    的头像 发表于 12-19 14:52 1814次阅读

    C语言零基项目:迷宫游戏详细思路+源码分享

    每天一个C语言项目,提升你的编程能力!
    的头像 发表于 12-21 10:08 893次阅读

    C语言零基项目:推箱子游戏详细思路+源码分享

    推箱子是一个来自日本的古老游戏,目的是在训练你的逻辑思考能力。在一个狭小的仓库中,要求把木箱放到指定的位置,稍不小心就会出现箱子无法移动或者通道被堵住的情况,所以需要巧妙的利用有限的空间和通道,合理安排移动的次序和位置,才能顺利的完成任务。
    的头像 发表于 12-27 10:38 798次阅读

    C语言零基项目:黑白棋游戏详细思路+源码分享

    《黑白棋》也叫翻转棋或者奥赛罗,其游戏过程是相互翻转对方的棋子,最后以棋盘上谁的棋子多来判断胜负。虽然规则简单,但是变化复杂,是典型的易学难精,奥妙无穷,不信您就试试看吧!
    的头像 发表于 12-29 11:12 912次阅读

    C语言零基项目:自制军棋游戏详细思路+源码分享

    每天一个C语言项目,提升你的编程能力!
    的头像 发表于 12-29 17:14 8372次阅读

    C语言零基项目:对对碰(消除类)游戏详细思路+源码分享

    游戏中消除的对象为各种各样的头像,包括树、小车、草莓和酒瓶等一些头像。玩家通关移动这些头像位置凑够一定数量的相同图标即可消除。
    的头像 发表于 01-03 11:13 693次阅读

    C语言零基项目:吃豆人小游戏详细思路+源码分享

    《吃豆游戏》是一款休闲小游戏,和贪吃蛇,球球大作战吃食物都是有差不多的游戏逻辑。
    的头像 发表于 01-03 11:38 1341次阅读

    C语言项目:矿井逃生游戏(密室)!详细思路+源码分享

    密室逃脱相信大部分都玩过了吧?本游戏就是一种用C语言写的类似的游戏,因为用手电筒照明找路,所以有点像矿工的样子,还是叫它矿井逃生吧!(以下是游戏
    的头像 发表于 01-07 09:41 1330次阅读

    C语言零基项目:打飞机游戏!300行源码分享+详细思路

    游戏中,你操控你的防空车尽可能的多击落飞机,躲避飞机扔的炸弹。
    的头像 发表于 01-11 09:31 971次阅读