C语言——生命小游戏
目录
前言
一、游戏代码
二、代码解析
1、初始化
2、繁衍或死亡
总结
前言
代码参考了《C语言课程设计与游戏开发实践教程》
游戏介绍:
假设有一个像棋盘一样的方格网,每个方格中放置一个生命细胞,生命细胞只有两种状态:“生”或“死”。游戏规则如下:
1.如果一个细胞周围有3个细胞为生(一个细胞周围共有8个细胞),则该细胞为生,即该细胞若原先为死,则转为生,若原先为生,则保持不变;
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或死0void gotoxy(int x, int y) // 光标移动到(x,y)位置
{HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);COORD pos;pos.X = x;pos.Y = y;SetConsoleCursorPosition(handle, pos);
}void startup() // 数据初始化
{for (int i = 0; i < High; i++) // 初始化for (int j = 0; j < Width; j++){cells[i][j] = 1;}
}void show() // 显示画面
{gotoxy(0, 0); // 光标移动到原点位置,以下重画清屏for (int i = 1; i <= High - 1; i++){for (int 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; // 统计邻居的个数for (int i = 1; i <= High - 1; i++){for (int 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 (int i = 1; i <= High - 1; i++)for (int j = 1; j <= Width - 1; j++)cells[i][j] = NewCells[i][j];
}int main()
{startup(); // 数据初始化while (1) // 游戏循环执行{show(); // 显示画面updateWithoutInput(); // 与用户输入无关的更新}return 0;
}
二、代码解析
1、初始化
假设有 50 * 50 个小格子(用数组来实现)(数组我在前面的博客中写过,这里就不介绍了)。每个格子里面都有生命存活(值为 1)或者死亡(值为 0),将所有有生命的通过图案来显示。代码如下:
#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或死0void 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(); // 与用户输入有关的更新}
}
2、繁衍或死亡
规则:
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或死0void gotoxy(int x, int y) // 光标移动到(x,y)位置
{HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);COORD pos;pos.X = x;pos.Y = y;SetConsoleCursorPosition(handle, pos);
}void startup() // 数据初始化
{for (int i = 0; i < High; i++) // 初始化for (int j = 0; j < Width; j++){cells[i][j] = 1;}
}void show() // 显示画面
{gotoxy(0, 0); // 光标移动到原点位置,以下重画清屏for (int i = 1; i <= High - 1; i++){for (int 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; // 统计邻居的个数for (int i = 1; i <= High - 1; i++){for (int 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 (int i = 1; i <= High - 1; i++)for (int j = 1; j <= Width - 1; j++)cells[i][j] = NewCells[i][j];
}int main()
{startup(); // 数据初始化while (1) // 游戏循环执行{show(); // 显示画面updateWithoutInput(); // 与用户输入无关的更新}return 0;
}
总结
这个小游戏是对之前对数组的知识点的补充,后面可能还会在这个基础上添加一些功能。
C语言——生命小游戏相关推荐
- c语言小游戏出拳,C语言--拳击小游戏
原标题:C语言--拳击小游戏 #include //标准输入输出头文件 #include //通用工具库头文件 #include //时间头文件 int main() { //游戏规则:回合制(我方先 ...
- c语言 倒计时不清屏_打字游戏超细讲解(C语言基础小游戏)
首先我们会发现我们网上看到的打字游戏都是上来就敲代码,小白看的一脸懵,所以鑫哥在这给大家送上一份超级详细的打字游戏编写流程及对应的结果展示,希望可以帮到小白进行入门学习. 话不多说,我们先看一下什么叫 ...
- c语言经典游戏,C语言——经典小游戏——打砖块
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 C语言--经典小游戏--打砖块 玩法:按A与D控制球拍的移动,按S暂停游戏 百度网盘下载:http://pan.baidu.com/s/1o64ECTc ...
- c语言2048代码linux,C语言2048小游戏课设(附源码).doc
PAGE PAGE 1 C语言2048小游戏课设 项目说明 本系统基于C语言开发,适用于刚入门的C语言新手项目课设,开发软件采用VC++6.0开发,VS,DEV C++等均可运行.(书生) 项目运行截 ...
- c语言五子棋学年论文,基于c语言五子棋小游戏生本科论文.doc
基于c语言五子棋小游戏生本科论文 五子棋小游戏 需求分析 现在有越来越多的人使用电脑,而且五子棋的受众广泛但实体棋操作较为繁琐且平时较难实现,所以电脑版的五子棋游戏应运而生.大家对于这个小游戏的需求如 ...
- 用c语言编写的打字母游戏,用C语言编写小游戏——“井字棋”
原标题:用C语言编写小游戏--"井字棋" 作者:Milo Yip 来源:知乎 原文链接:https://zhuanlan.zhihu.com/p/39581573 在 Milo Y ...
- C语言自制小游戏:三子棋(井字棋)智能下棋补充
目录 一.前期准备 二.逻辑与程序实现 1.连珠 ①横向连珠 ②纵向连珠 ③斜向连珠 ④函数完善 2.堵棋 ①横向堵棋 ②纵向堵棋 ③斜向堵棋 3.整理函数 ①整理AI_Computer函数 ②修改C ...
- C语言实现小游戏——模拟微信小游戏《最强飞刀手》
C语言实现小游戏--模拟微信小游戏<最强飞刀手> 曾经玩过的微信小游戏,想着用C语言实现,只可惜,下图是我的上限. 这个下游戏界面简陋,把旋转的西瓜做成了平的接盘:实现的功能有:接盘的移动 ...
- 基于c语言的小游戏,--基于C语言的小游戏设计.doc
--基于C语言的小游戏设计.doc 级丌 密公 本科生毕业(学位)论文 基于c语言的爪游软设计 李俊佶 (2009061322) TOC \o "1-5" \h \z 指导教师姓名 ...
最新文章
- Symbian S60 Carbide.c++ v2.3开发环境搭建
- 人脸变形算法——MLS
- 943. Find the Shortest Superstring
- WPF 使用皮肤影响按钮自定义
- html判断整数小数点后两位小数点,js控制input框只能输入数字和一位小数点且小数点后面只有两位小数...
- Qt文档阅读笔记-隐式共享(Implicit Sharing)深入研究(理论及实例)
- 写入多个表_制作属于自己的教学工作表
- Saruman's Army (POJ 3069)
- c++ 读文件_python中文件的使用
- spring boot缓存excel临时文件后再操作
- 基于Redis实现分布式单号,分布式ID(自定义规则生成)
- spass是Java吗_Java SpassFingerprint类代码示例
- php的ob缓存详解
- 电脑重装系统后如何删除微软商店下载记录
- 计算机组成原理mips汇编大作业报告(冒泡排序、选择排序)
- 明天去不了第三届网志大会
- 宏碁服务器u盘装系统,宏基笔记本用u盘装系统操作流程
- 【转载】刘未鹏的C++学习历程 + 小诗一首
- Android - 集成高德地图API(搜索,地图,定位)
- JAVA代理模式与动态代理模式