做游戏,学编程(C语言) 5 数组之生命游戏
学完数组的概念后,有一个简单的小游戏特别适合上手---生命游戏,假设有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 数组之生命游戏相关推荐
- 教孩子学编程 python语言版_教孩子学编程 PYTHON语言版 PDF_IT教程网
资源名称:教孩子学编程 PYTHON语言版 PDF 资源目录: 第1章Python基础--认识环境1 1.1认识Python3 1.2用Python编写程序5 1.3运行Python程序5 1.4本章 ...
- python教孩子学编程,教孩子学编程(Python语言版)
教孩子学编程(Python语言版) 第1 章 Python 基础:认识环境 #NiceHexSpiral.py #运行后,挺奇特,整个作画过程,完全呈现. import turtle colors=[ ...
- 但凡原神有二十树脂,我也不会来学编程(c语言)
但凡原神有二十树脂,我也不会来学编程(c语言)<第一天> 编程小白一只,从今天开始,将在本专栏记录本人学习编程的过程与心得~来自甘肃,普通双非,由于地域影响,想要在计算机方面得到好的出路, ...
- 少儿编程python线上课程-少儿编程课堂|python – 用游戏学编程
学习编程是很快乐的事情.当我们自己开发出一套时下流行的游戏时,这满满的成就感比玩儿游戏本身高出了不知道会有多少倍. 接下来一段时间我们就python从0开始学习怎么开发 flappy brid 游戏. ...
- python编程少儿游戏编程_少儿编程课堂|python – 用游戏学编程
学习编程是很快乐的事情.当我们自己开发出一套时下流行的游戏时,这满满的成就感比玩儿游戏本身高出了不知道会有多少倍. 接下来一段时间我们就python从0开始学习怎么开发 flappy brid 游戏. ...
- 优的python少儿编程课_少儿编程课堂|python – 用游戏学编程
学习编程是很快乐的事情.当我们自己开发出一套时下流行的游戏时,这满满的成就感比玩儿游戏本身高出了不知道会有多少倍. 接下来一段时间我们就python从0开始学习怎么开发 flappy brid 游戏. ...
- 学编程c语言高考能加分吗,学好编程,中高考都能加分,还能保送清华北大!...
原标题:学好编程,中高考都能加分,还能保送清华北大! 前段时间,我跟一位母亲聊起现在的中考.高考,她大是不以为然,为什么?这位母亲跟我诉苦,说她家老大上半年备战中考,每天都早起晚睡地复习,全家都跟着一 ...
- 做软件学c易语言可以吗,怎么样做一个易语言程序:
呵呵,楼主和我当初一样的迷惑. 我当初啃C语言的时候,也是想用C语言做界面出来,走了很多冤枉路,这里希望能给楼主一些提示. 如果你想用"纯"C来做界面的话,那么我会很肯定的告诉你, ...
- 孩子学python教程_教孩子学编程 PYTHON语言版 PDF_IT教程网
资源名称:教导孩子们如何学习PYTHON编程语言版本PDF资源目录:第1章PYTHON Basics-Understanding环境1了解PYTHON 3编写程序在PYTHON中运行PYTHON程序5 ...
最新文章
- Xamarin iOS开发实战上册-----2.2 添加和定制视图
- X window的思想和终端的重大意义
- 基于nanopi的即时通讯系统
- TechEd2007现场侧记:TechEd的变与不变
- 测试中如何管理外包质量_【项目管理】资深游戏测试总监详解质量管理工作的9个步骤...
- pygame重新开始_Pygame(十八)音乐
- 巧用 ExcelFileCleaner 减小excel 文件大小
- uitableview有个属性值 separatorStyle 可用来去掉cell间的白线:
- 仪表指针样式_PPT标准图表太丑?试试仪表盘图表!
- 【springboot】自动整合Tomcat原理
- 《自然语言处理实战入门》 第一章: 自然语言处理(NLP)技术简介
- 2022年北京购房攻略一 (常识篇)
- JS中调用后台方法进行验证返回值后加?的意思在GridView中指定一列为超级链接并有查询字符串的写法...
- win10 系统禁用笔记本自带键盘的有效方法
- 昆石VOS3000/VOS2009 2.1.6.00 操作指南相关
- git安装 苹果笔记本_远程系统重装安装电脑维修笔记本台式xpwin7810苹果mac双系统安装...
- Linux的学习记录。
- 永中科技剥离台资百慕大是”执政败笔“
- leeetcode77 组合
- win10任务栏的音量图标变透明且无法点击
热门文章
- 最小公倍数 [最小公约数的拓展]
- 不借助第三个变量进行两个变量的换位输出
- zend studio如何更改字符集
- java.io.StreamCorruptedException: invalid stream header: 00000000
- 配置交换空间与文件系统的备份
- APACHE 403 FORBIDDEN错误的解决办法之一
- iOS 中关于 skip install
- Silverlight访问Web Service报System.Security.SecurityException: 安全性错误的处理
- XX基金 机器学习平台使用情况访谈总结
- [VSCode] Ubuntu 自动添加了 vscode 源