学完数组的概念后,有一个简单的小游戏特别适合上手---生命游戏,假设有int Cells[30][30],也即有30×30个小格子,每个小格子里面可以有细胞生命,或者细胞死亡。通过把这些状态输出出来,就可以显示出相应的图案。

生命游戏演化的规则:

每个矩阵方格可以包含一个有机体,不在边上的有机体有8个相邻方格。

1. 如果一个细胞周围有3个细胞为生,则该细胞为生(即该细胞若原先为死,则转为生,若原先为生,则保持不变)

2. 如果一个细胞周围有2个细胞为生,则该细胞的生死状态保持不变

3. 在其它情况下,该细胞为死(即该细胞若原先为生,则转为死,若原先为死,则保持不变)

通过这个例子,大家可以体会二维数组在游戏开发中的应用,可以记录画布中的所有数据,并把画面显示、数据更新两块隔离开,便于程序的维护和更新。

第一步,利用上一讲的框架进行游戏的初始化。可以得到类似下面的静止图案。

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>
#include <time.h>

#define High 25  // 游戏画面尺寸
#define Width 50
// 全局变量
int cells[High][Width]; // 所有位置细胞生1或死0
void gotoxy(int x,int y)//类似于清屏函数
{HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);COORD pos;pos.X = x;pos.Y = y;SetConsoleCursorPosition(handle,pos);
}void startup() // 数据初始化
{int i,j;for (i=0;i<High;i++) // 随机初始化
        for (j=0;j<Width;j++){cells[i][j] = rand()%2;}
}void show()  // 显示画面
{gotoxy(0,0);  // 清屏
    int i,j;for (i=0;i<=High;i++){for (j=0;j<=Width;j++){if (cells[i][j]==1)printf("*");  //   输出活的细胞
            elseprintf(" ");  //   输出空格
        }printf("\n");}Sleep(50);
}   void updateWithoutInput()  // 与用户输入无关的更新
{   }void updateWithInput()  // 与用户输入有关的更新
{}void main()
{startup();  // 数据初始化
    while (1) //  游戏循环执行
    {show();  // 显示画面
        updateWithoutInput();  // 与用户输入无关的更新
        updateWithInput();  // 与用户输入有关的更新
    }
}

第二步,依照上面的规则,让细胞进行繁衍或死亡,得到不断变化的图案。

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>
#include <time.h>

#define High 25  // 游戏画面尺寸
#define Width 50
// 全局变量
int cells[High][Width]; // 所有位置细胞生1或死0
void gotoxy(int x,int y)//类似于清屏函数
{HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);COORD pos;pos.X = x;pos.Y = y;SetConsoleCursorPosition(handle,pos);
}void startup() // 数据初始化
{int i,j;for (i=0;i<High;i++) // 初始化
        for (j=0;j<Width;j++){cells[i][j] = 1;}
}void show()  // 显示画面
{gotoxy(0,0);  // 清屏
    int i,j;for (i=1;i<=High-1;i++){for (j=1;j<=Width-1;j++){if (cells[i][j]==1)printf("*");  //   输出活的细胞
            elseprintf(" ");  //   输出空格
        }printf("\n");}Sleep(50);
}   void updateWithoutInput()  // 与用户输入无关的更新
{   int NewCells[High][Width]; // 下一帧的细胞情况
    int NeibourNumber; //统计邻居的个数
    int i,j;for (i=1;i<=High-1;i++){for (j=1;j<=Width-1;j++){NeibourNumber = cells[i-1][j-1] + cells[i-1][j] + cells[i-1][j+1]+ cells[i][j-1] + cells[i][j+1] + cells[i+1][j-1] + cells[i+1][j] + cells[i+1][j+1];if (NeibourNumber==3)NewCells[i][j] = 1;  else if (NeibourNumber==2)NewCells[i][j] = cells[i][j];elseNewCells[i][j] = 0; }}for (i=1;i<=High-1;i++)for (j=1;j<=Width-1;j++)cells[i][j] = NewCells[i][j];}void updateWithInput()  // 与用户输入有关的更新
{}void main()
{startup();  // 数据初始化
    while (1) //  游戏循环执行
    {show();  // 显示画面
        updateWithoutInput();  // 与用户输入无关的更新
        updateWithInput();  // 与用户输入有关的更新
    }
}

思考题:大家可以尝试修改规则,比如初始化不同的数据,或者3,2的时候都增加;增加另一个物种,食肉动物、食草动物,互相抑制;增加不同地形,比如某块区域有水源,生命更容易生存;交互投食,按+加速、按-减速;模拟生态进化、还有模拟大气污染、谣言传播等等。

下一个教程,我们利用数组,进一步改进飞机游戏: 知乎专栏

利用数组的游戏开发,也可以参考同学的游戏总结---是男人就坚持100秒:知乎专栏

做游戏,学编程(C语言) 5 数组之生命游戏相关推荐

  1. 教孩子学编程 python语言版_教孩子学编程 PYTHON语言版 PDF_IT教程网

    资源名称:教孩子学编程 PYTHON语言版 PDF 资源目录: 第1章Python基础--认识环境1 1.1认识Python3 1.2用Python编写程序5 1.3运行Python程序5 1.4本章 ...

  2. python教孩子学编程,教孩子学编程(Python语言版)

    教孩子学编程(Python语言版) 第1 章 Python 基础:认识环境 #NiceHexSpiral.py #运行后,挺奇特,整个作画过程,完全呈现. import turtle colors=[ ...

  3. 但凡原神有二十树脂,我也不会来学编程(c语言)

    但凡原神有二十树脂,我也不会来学编程(c语言)<第一天> 编程小白一只,从今天开始,将在本专栏记录本人学习编程的过程与心得~来自甘肃,普通双非,由于地域影响,想要在计算机方面得到好的出路, ...

  4. 少儿编程python线上课程-少儿编程课堂|python – 用游戏学编程

    学习编程是很快乐的事情.当我们自己开发出一套时下流行的游戏时,这满满的成就感比玩儿游戏本身高出了不知道会有多少倍. 接下来一段时间我们就python从0开始学习怎么开发 flappy brid 游戏. ...

  5. python编程少儿游戏编程_少儿编程课堂|python – 用游戏学编程

    学习编程是很快乐的事情.当我们自己开发出一套时下流行的游戏时,这满满的成就感比玩儿游戏本身高出了不知道会有多少倍. 接下来一段时间我们就python从0开始学习怎么开发 flappy brid 游戏. ...

  6. 优的python少儿编程课_少儿编程课堂|python – 用游戏学编程

    学习编程是很快乐的事情.当我们自己开发出一套时下流行的游戏时,这满满的成就感比玩儿游戏本身高出了不知道会有多少倍. 接下来一段时间我们就python从0开始学习怎么开发 flappy brid 游戏. ...

  7. 学编程c语言高考能加分吗,学好编程,中高考都能加分,还能保送清华北大!...

    原标题:学好编程,中高考都能加分,还能保送清华北大! 前段时间,我跟一位母亲聊起现在的中考.高考,她大是不以为然,为什么?这位母亲跟我诉苦,说她家老大上半年备战中考,每天都早起晚睡地复习,全家都跟着一 ...

  8. 做软件学c易语言可以吗,怎么样做一个易语言程序:

    呵呵,楼主和我当初一样的迷惑. 我当初啃C语言的时候,也是想用C语言做界面出来,走了很多冤枉路,这里希望能给楼主一些提示. 如果你想用"纯"C来做界面的话,那么我会很肯定的告诉你, ...

  9. 孩子学python教程_教孩子学编程 PYTHON语言版 PDF_IT教程网

    资源名称:教导孩子们如何学习PYTHON编程语言版本PDF资源目录:第1章PYTHON Basics-Understanding环境1了解PYTHON 3编写程序在PYTHON中运行PYTHON程序5 ...

最新文章

  1. Xamarin iOS开发实战上册-----2.2 添加和定制视图
  2. X window的思想和终端的重大意义
  3. 基于nanopi的即时通讯系统
  4. TechEd2007现场侧记:TechEd的变与不变
  5. 测试中如何管理外包质量_【项目管理】资深游戏测试总监详解质量管理工作的9个步骤...
  6. pygame重新开始_Pygame(十八)音乐
  7. 巧用 ExcelFileCleaner 减小excel 文件大小
  8. uitableview有个属性值 separatorStyle 可用来去掉cell间的白线:
  9. 仪表指针样式_PPT标准图表太丑?试试仪表盘图表!
  10. 【springboot】自动整合Tomcat原理
  11. 《自然语言处理实战入门》 第一章: 自然语言处理(NLP)技术简介
  12. 2022年北京购房攻略一 (常识篇)
  13. JS中调用后台方法进行验证返回值后加?的意思在GridView中指定一列为超级链接并有查询字符串的写法...
  14. win10 系统禁用笔记本自带键盘的有效方法
  15. 昆石VOS3000/VOS2009 2.1.6.00 操作指南相关
  16. git安装 苹果笔记本_远程系统重装安装电脑维修笔记本台式xpwin7810苹果mac双系统安装...
  17. Linux的学习记录。
  18. 永中科技剥离台资百慕大是”执政败笔“
  19. leeetcode77 组合
  20. win10任务栏的音量图标变透明且无法点击

热门文章

  1. 最小公倍数 [最小公约数的拓展]
  2. 不借助第三个变量进行两个变量的换位输出
  3. zend studio如何更改字符集
  4. java.io.StreamCorruptedException: invalid stream header: 00000000
  5. 配置交换空间与文件系统的备份
  6. APACHE 403 FORBIDDEN错误的解决办法之一
  7. iOS 中关于 skip install
  8. Silverlight访问Web Service报System.Security.SecurityException: 安全性错误的处理
  9. XX基金 机器学习平台使用情况访谈总结
  10. [VSCode] Ubuntu 自动添加了 vscode 源