目录

前言

一、总体规划

二、使用步骤

1.特别的

2.游戏的开关

3.游戏的实现

(1).初始化棋盘

(2).打印棋盘

(3).布置雷

(4).排查雷

总结


前言

排雷,非常经典的一个小游戏,最近有幸学到了其相关知识,借于此想把它用c语言实现的步骤说出来提供参考,以便我后续的反思与掌握。

一、总体规划

首先,要制作一个项目,整体的规划是十分重要的,以便我们早早的把问题想清楚,程序的设计做好规划,别到时候编写程序遇到问题在想,因为那个时候在改动程序是十分的麻烦的。

实现简易的扫雷游戏,首先要实现游戏的开关(可别把游戏的登出键扣了(▼ヘ▼#)),然后就要看到游戏的运行里去:你要布置一下棋盘,初始化一下棋盘,要能放地雷,和呈现给玩家的棋盘。所以,这里就需要个棋盘。然后就要把棋盘打印出来,随后就要布置雷,布置雷的话要明确布置几个和随机布置,那就要用到rand()函数了,然后玩家排雷,选中的数组检查是否有雷,有雷游戏结束,没有雷就检查周围是否存在雷,存在几个雷。这个由其重要,因为这种的特殊情况就是涉及到数组越界访问的问题,为了不让我们每次都对数组是否越界,那么我们一开始对这个棋盘进行扩展,是展示只展示一部分,而实际的要大,以便不用判断是否越界和下标对应的好处。随后,将检查到的数存入展示数组中,进行循环,循环直到排雷完或者被雷炸到游戏结束,进行下次游戏是否继续询问即可。

总之就是:游戏的开关,布置棋盘,打印棋盘,布置雷,玩家排雷,检查。

二、使用步骤

1.特别的

创建项目时,为了使其分工更明显更模块化一般分成几个文件进行使用,而定义宏,头文件,函数的声明一般几个文件都要用,所以放入一个文件(.h)中,其他的一个专门放实现功能函数的代码l另一个文件专门用来测试(.c)

比如:game.h          game.c        test.c

一般在边做函数时在上什么和定义头文件和宏,这里为了后续好说明,先上game.h头文件的内容

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<time.h>//定义宏
#define LINE 9                               //真正的行和列
#define COLUMN 9
#define LINES 11                             //用于统计雷的行和列
#define COLUMNS 11
#define MINES 10                             //布置雷的个数
//函数声明//菜单函数
void manu();
//初始化函数 第一个字符数组初始化为0,第二个字符数组初始化为*
void Initialize_the(char(*a)[COLUMNS], char(*b)[COLUMNS], int lines, int columns);
//打印函数
void print(char(*arr)[COLUMNS], int line, int column);                  //注意s和无s的区别
//布置雷
void Arrangement_of_mine(char(*a)[COLUMNS], int line, int column, int mines);
//排雷
void Eliminate_landmines(char(*a)[COLUMNS], char(*b)[COLUMNS], int line, int column);

2.游戏的开关

废话不多说,直接上代码:

static void test()
{int a = 0;//选择1or0按钮srand((unsigned int)time(NULL));                    //一个工程里面设置一个rand随机数产生起点,使其获得系统时间,随时发生变化。可达到随机的效果do {manu();printf("请选择->");scanf("%d", &a);switch (a){case 1:printf("开始游戏\n");game();break;case 0:printf("谢谢游玩,欢迎下次游玩\n");break;default :printf("输入错误请重新输入:\n");break;}} while (a);
}
int main()
{test();return 0;
}

这里所用的manu()菜单函数是在game.c文件里面实现的,其中代码是:

//菜单图像
void manu()
{printf("###############game_Mine_clearance#############\n");printf("###############      1.start      #############\n");printf("###############      0.exit       #############\n");printf("###############################################\n");
}

然后使用了switch来实现我们游戏开关的流程,这里是在test.c文件里面实现的

接下来,就要对game函数进行具体的实现:

3.游戏的实现

先上代码:

void game()
{char a[LINES][COLUMNS] = { 0 };                     //布置雷的棋盘,放置0/1,注意是在我们想要呈现的棋盘|行和列均加了2|char b[LINES][COLUMNS] = { 0 };                     //呈现给玩家的棋盘,放置*/'数字'Initialize_the(a, b, LINES, COLUMNS);               //初始化棋盘 print(b, LINE, COLUMN);                             //打印棋盘Arrangement_of_mine(a, LINE, COLUMN, MINES);        //布置雷,在a字符数组中,MINES代表了几个雷//print(a, LINE, COLUMN);Eliminate_landmines(a, b, LINE, COLUMN);            //玩家开始排雷 a检查是否有雷器,b是给玩家呈现结果器print(a, LINE, COLUMN);                             //退出来了说明失败了或者成功排完了
}

首先就是要得到两个存放棋盘的数组,一个用于放雷,一个用于呈现给玩家,其次就要初始化棋盘,打印棋盘,布置雷,排雷,检查,下面来具体说明每个函数具体实现的功能:ps:这里的每个函数均在game.c文件里面实现

(1).初始化棋盘

//初始化棋盘
void Initialize_the(char(* a)[COLUMNS], char(*b)[COLUMNS], int lines, int columns)
{for (int i = 0; i < lines; i++)for (int j = 0; j < columns; j++){a[i][j] = '0';        //布雷棋盘(相当于透视眼,里面0代表没有雷,1代表有雷)b[i][j] = '*';        //呈现棋盘(给玩家看的)}
}

这里分别对不同的棋盘进行初始化,其中一个为放雷的(1为雷),这里为什么偏要设1为雷呢,这就是长远规划的好处了:以后我们在检查周围存在的雷时,只需要周围的元素相加即可,这样就保证了不用嵌套判断来进行判断了,但是这个函数也可以进行优化,让它变成三个形参,把一个数组指针删掉,一个形参替换为符号来接受,稍作修改可以根据传过来的符号进行对这样的符号进行初始化。

(2).打印棋盘

顾名思义,就是打印到屏幕上给玩家看的,那么,先上代码:

void print(char(*arr)[COLUMNS], int line, int column)
{printf("--------------saolei--%d*%dge-------------------------\n", line, column);for (int i = 0; i <= line; i++) //打印列数,方便数printf("%3d", i);printf("\n");for (int i = 1; i <= line; i++) {printf("%3d", i);           //打印行数,方便数for (int j = 1; j <= column; j++)printf("%3c", arr[i][j]);printf("\n");}printf("--------------saolei--%d*%dge-------------------------\n", line, column);
}

第一行和最后一行是为了美观的(不知道是不是美工做的事,其实我也不知道) ,随后的定义三个空是防止以后出现100以上的棋盘(10*10)

(3).布置雷

比较重点的部分来了,因为现在棋盘都已经初始化好了,现在我们只需对专门弄雷的数组进行放置MINES个雷就好了:

void Arrangement_of_mine(char(*a)[COLUMNS], int line, int column, int mines)
{//使用随机数产生函数,用它来模line或者column然后加一可以实现随机1~line\column的效果int x = 0;//对应lineint y = 0;//对应columnwhile (mines){x = rand() % line + 1;y = rand() % column + 1;if (a[x][y] == '0') {a[x][y] = '1';mines--;}}
}

这里要使用rand函数,所以对应的整个工程在起初要设一个随机数产生起点,接受系统随机变化的值即可:

srand((unsigned int)time(NULL));                    //一个工程里面设置一个rand随机数产生起点,使其获得系统时间,随时发生变化。可达到随机的效果

这个放在test函数里面,对应文件test.c里面,上面的//就可以去掉了。

(4).排查雷

玩家输入坐标,来排除此处的雷(自然是限定范围之内),那么我们首先判断此处是否存在1,存在1就死,因为触发了雷了,如果不是,那么就统计周围有多少雷。上代码:

排查函数:

void Eliminate_landmines(char(*a)[COLUMNS], char(*b)[COLUMNS], int line, int column)
{int x = 0;int y = 0;int sum = 0;//统计排雷的个数while (sum < line*column -MINES) {printf("请输入要排雷的坐标->");scanf("%d %d", &x, &y);if (x < 0 || y < 0 || x > line || y > column) {printf("输入坐标错误,请重新输入\n");continue;}if (a[x][y] == '1') {printf("嘭!排雷失败\n");break;}b[x][y] = statistical(a, x, y) + '0';//统计周围的雷的个数print(b, LINE, COLUMN);printf("排雷成功!\n");sum++;                               //统计除开雷所排出的个数}if (sum == line * column - MINES)printf("恭喜你排完了全部的雷\n");
}

statistical函数就是用于排查周围的雷的,单独写出,函数类型为int

int statistical(char(*a)[COLUMNS], int x, int y)
{return a[x][y - 1] + a[x][y + 1] + a[x + 1][y] + a[x + 1][y - 1] + a[x + 1][y + 1] + a[x - 1][y] + a[x - 1][y - 1] + a[x - 1][y + 1] - 8*'0';
}

 特别注意:这里需要说明的是,数组是字符数组,所以相加是字符相加,既然字符相加的话就应该是ascll值相加,因为我们要返回的是整型,如果不每个减去零字符的ascll码值的话那返回的十个什么数,转化后就不是数字了,所以每个数组元素都有减去‘0’,随后,在接受函数那里因为是用的字符数组储存,所以返回来的数实际上是ascll值,加一个‘0’的ascll码值,理所应当储存进去的就是数字字符啦,而不是什么奇奇怪怪的东西。

总结

最后,这个排雷小游戏就实现啦!首先要对这个游戏的玩法深挖,比如解决问题的方法,想清楚之后,也就是做好规划之后在进行写代码效果越好,代码就越高效。

简易的排雷小游戏(c语言制作)相关推荐

  1. c语言小游戏 精简_C语言开发简易版扫雷小游戏

    C 语言开发简易版扫雷小游戏 本文给大家分享的是一个使用 C 语言开发的命令行下的简易版扫雷小游戏, 本身没有什么太 多的技术含量, 只不过是笔者的处女作, 所以还是推荐给大家, 希望对大家学习 C ...

  2. C语言实现排雷小游戏

    排雷小游戏 用C语言实现一个简单的排雷小游戏 如果不清楚扫雷游戏的规则,可以上网搜一下去玩一下,这里我就不做过多介绍了,只介绍程序的思想和实现. 整个程序分为三个文件 test.c game.h ga ...

  3. C语言可以敲哪些小游戏,C语言可以写哪些小游戏?

    C语言可以写哪些小游戏? C语言可以编手机游戏.你叫他去死不过我这有贪吃蛇的代码,你倒可以看看(用TC编译一定过( #包括 #包括 #包括 #包括 #包括 #定义输入7181 #定义ESC 283 # ...

  4. 自制Unity小游戏TankHero-2D(1)制作主角坦克

    自制Unity小游戏TankHero-2D(1)制作主角坦克 我在做这样一个坦克游戏,是仿照(http://game.kid.qq.com/a/20140221/028931.htm)这个游戏制作的. ...

  5. 【抖音小游戏】 Unity制作抖音小游戏方案 最新完整详细教程来袭【持续更新】

    前言 [抖音小游戏] Unity制作抖音小游戏方案 最新完整详细教程来袭[持续更新] 一.相关准备工作 1.1 用到的相关网址 1.2 注册字节开发者后台账号 二.相关集成工作 2.1 下载需要的集成 ...

  6. 控制台推箱子小游戏C语言

    自己开发的C语言控制台推箱子小游戏,基于二维数组实现,功能不多但是游戏整体较为完整,因为技术有限,所以代码暂未优化且整体显得较为臃肿,整体架构简单,代码全自主设计编写,仅作交流学习,还望大佬多多指点. ...

  7. 用C语言easyx库制作简易Flappy Bird小游戏

    前言 Flappy Bird是一款休闲类小游戏,相信大家都有玩过或者听说过,曾经在中国也是风靡一时的小游戏.今天我要给大家介绍的是用c语言编写这款小游戏,我会讲述一些我自己的思路,有任何不妥之处请浏览 ...

  8. c语言小游戏 精简_一个简易的贪吃蛇小游戏C语言源码

    /* *程序名称:贪吃蛇v2.1 *程序描述:一个简易的贪吃蛇小游戏 *版本信息:v2.1 *v1.1版本更新:1:加入菜单选择项 *v1.2版本更新:1:修复菜单选择bug *v1.3班本更新:1: ...

  9. c#推箱子小游戏代码_推箱子小游戏V1.0制作

    小游戏实践 推箱子简易版 大家好,我是努力学习争取成为优秀的Game Producer的路人猿,今天来一起做一个推箱子的简易版本V1.0!下面跟我一起做吧~ 我们用到的软件如下: 编辑类 Visual ...

最新文章

  1. 在任意的远程桌面的session中运行指定的程序
  2. EKPO-PSTYP
  3. Michael A. Cusumano
  4. 2016及以后的自动化测试趋势 -《测试技术六月刊》
  5. html分类页面,CSS网页设计 把HTML标记分类
  6. VMware Workstation虚拟机窗口小,无法显示内部系统全部桌面
  7. 利用路由器端口映射远程连接
  8. 美国航空航天局(NASA)高度集成WebFOCUS和SharePoint
  9. Android开源项目推荐之「网络请求哪家强」
  10. 能够支持python开发的环境_Windows上使用virtualenv搭建Python+Flask开发环境
  11. cad导出jpg格式什么像素最清晰
  12. 20170330今日头条笔试题
  13. Timestamp日期格式转换
  14. 工业物联网快速解决方案
  15. QQ特殊字符制作方式
  16. GraphPad Prism使用
  17. 北京智源大会 | AI + 医疗的下一个十年:从公共卫生预警到人类基因密码解析 道翰天琼认知智能api机器人接口。
  18. 并发——锁升级(偏向锁,轻量级锁,重量级锁,及常见锁)
  19. docker 清理磁盘
  20. Unity3d:一个简单的画圈圈手势判断

热门文章

  1. 视觉SLAM十四讲(高翔版本),ch4章节部分笔记
  2. 从技术转型项目经理到需求专家的长者分享
  3. JS-实现类似于高考倒计时的倒计时时差
  4. DataGrip 入门操作指南
  5. 一个数的n次幂求法(常规、快速)
  6. Struts2-04登录案例
  7. 记一次,1个月前的瓜子二手车面试经历
  8. android圆球触摸怎么实现,Android利用ViewPager实现带小圆球的图片滑动
  9. 安卓Eclipse如何快速修改工程名及包名
  10. 外贸客户开发系列 必学技 外贸神器之独孤九式让你在领英/Linkedin客户开发上事半功倍、无往不胜