目录

前言

一、游戏代码

二、代码解析

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语言——生命小游戏相关推荐

  1. c语言小游戏出拳,C语言--拳击小游戏

    原标题:C语言--拳击小游戏 #include //标准输入输出头文件 #include //通用工具库头文件 #include //时间头文件 int main() { //游戏规则:回合制(我方先 ...

  2. c语言 倒计时不清屏_打字游戏超细讲解(C语言基础小游戏)

    首先我们会发现我们网上看到的打字游戏都是上来就敲代码,小白看的一脸懵,所以鑫哥在这给大家送上一份超级详细的打字游戏编写流程及对应的结果展示,希望可以帮到小白进行入门学习. 话不多说,我们先看一下什么叫 ...

  3. c语言经典游戏,C语言——经典小游戏——打砖块

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 C语言--经典小游戏--打砖块 玩法:按A与D控制球拍的移动,按S暂停游戏 百度网盘下载:http://pan.baidu.com/s/1o64ECTc ...

  4. c语言2048代码linux,C语言2048小游戏课设(附源码).doc

    PAGE PAGE 1 C语言2048小游戏课设 项目说明 本系统基于C语言开发,适用于刚入门的C语言新手项目课设,开发软件采用VC++6.0开发,VS,DEV C++等均可运行.(书生) 项目运行截 ...

  5. c语言五子棋学年论文,基于c语言五子棋小游戏生本科论文.doc

    基于c语言五子棋小游戏生本科论文 五子棋小游戏 需求分析 现在有越来越多的人使用电脑,而且五子棋的受众广泛但实体棋操作较为繁琐且平时较难实现,所以电脑版的五子棋游戏应运而生.大家对于这个小游戏的需求如 ...

  6. 用c语言编写的打字母游戏,用C语言编写小游戏——“井字棋”

    原标题:用C语言编写小游戏--"井字棋" 作者:Milo Yip 来源:知乎 原文链接:https://zhuanlan.zhihu.com/p/39581573 在 Milo Y ...

  7. C语言自制小游戏:三子棋(井字棋)智能下棋补充

    目录 一.前期准备 二.逻辑与程序实现 1.连珠 ①横向连珠 ②纵向连珠 ③斜向连珠 ④函数完善 2.堵棋 ①横向堵棋 ②纵向堵棋 ③斜向堵棋 3.整理函数 ①整理AI_Computer函数 ②修改C ...

  8. C语言实现小游戏——模拟微信小游戏《最强飞刀手》

    C语言实现小游戏--模拟微信小游戏<最强飞刀手> 曾经玩过的微信小游戏,想着用C语言实现,只可惜,下图是我的上限. 这个下游戏界面简陋,把旋转的西瓜做成了平的接盘:实现的功能有:接盘的移动 ...

  9. 基于c语言的小游戏,--基于C语言的小游戏设计.doc

    --基于C语言的小游戏设计.doc 级丌 密公 本科生毕业(学位)论文 基于c语言的爪游软设计 李俊佶 (2009061322) TOC \o "1-5" \h \z 指导教师姓名 ...

最新文章

  1. 烂大街的Spring循环依赖该如何回答?
  2. 广州富力再引强援 95后潜力中锋桂宏加盟球队
  3. SAP MB51物料凭证清单程序增强增加四个字段
  4. python 如何将数字字符串转换为数字?
  5. k-core与k-shell的区别
  6. 默认网关及route print
  7. 简单struts,spring,mybatis组合使用
  8. 手把手教你如下在Linux下如何写一个C语言代码,编译并运行
  9. python之FTP程序(支持多用户在线)
  10. 如何才能在jsp文件中使用el表达式
  11. 踢向《英雄王座》的面目全非脚
  12. 菜鸟教程:Js数据类型
  13. 计算机组装所需要的主要配件有哪些,组装电脑需要哪些零件_组装电脑需要哪些配件...
  14. 移动网络怎么修改服务器地址,移动宽带怎么修改wifi密码?
  15. 2022年调味品行业研究报告
  16. Noip 2016 蛋碎一地晚节不保
  17. 【JAVA小游戏】炸飞机
  18. lua知识点-unpack
  19. 手机刷机后丢失照片恢复怎么做到?
  20. 尤里复仇退出界面_红色警戒2、尤里的复仇win10卡死、分辨率太大、黑屏问题多种解决方法(已测)...

热门文章

  1. 库位管理html,仓库日常管理之库位管理篇
  2. Proteus8.9 VSM Studio Keil编译器仿真AT89C51RD2系列019_lcdPG12864
  3. find the longest of the shortest
  4. SQL 索引超详细解析
  5. CAN总线的8种常见故障及解决方法
  6. 快速实现渠道二维码生成与统计
  7. Vue使用Echarts实现数据可视化
  8. 用多线程从Wind拿数据并传到MongoDB上
  9. VMware卸载不干净?
  10. 百度地图显示多点连线+数字标注