目的
1.首先,目的很单纯,只是为了增进个人对c语言的爱好,也有利于个人对c语言的锻炼
思路
1.我们不难在网上玩一个扫雷小游戏,可真当自己写起来,思路却一开始难道了不少人。
(1)我们首先需要生成一个雷阵
(2)其次我们需要将雷阵初始化
(3)在后的就是布置雷
(4) 跟着就是打印雷
(5)更后的就是排除雷了。
过程实现
(1)生成雷阵 以及菜单
别看这小小的雷阵,创建的时候可不是你想象中的那么简单,因为我们在实现排除雷的时候,会有一个边界问题,何为边界呢,也就是说,如果我们玩99的雷阵,就创造一个99的数组的话,那么,在检测边界的雷的时候,这个时候可能会报错,如图为9*9的雷阵图,大家都清楚,在c语言中,0为假,非0则为真,而在此处倘若我选中途中绿标的坐标来排雷,情况是不是就有点复杂?
那如果我选用如下图所示的11*11雷阵呢(也就是两边各多一行/列)![在这里插入图片描述](https://img-blog.csdnimg.cn/9ff1f1c4054d438e9eeabdadaaaaf38f.png)
这时如果需要排雷,则只需要在中间9*9的雷阵内统一对该方块所在的九宫格内进行检测,问题就能大大的简化,解决掉边界问题啦
在正式着手之前,我们需要一系列的前置准备工作也就是头文件的运用,在此不作过多解释
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#define HANG 9
#define LIE 9
#define HANGS HANG+2
#define LIES LIE+2
#define easy 10
void menu();
void game();
void start(char arr[HANGS][LIES], int hangs, int lies, char set);
void display(char arr[HANGS][LIES], int hangs, int lies);
void put (char arr[HANGS][LIES], int hangs, int lies);
void avoid(char arr1[HANGS][LIES], char arr2[HANGS][LIES], int hangs, int lies);
关于如何生成雷阵,我们理应运用二维数组的原理,比如去设置一个11*11的雷阵,那么我们就需要一个数组,这里不妨就命名为show吧。
char show [HANGS][LIES];
但是这只是一个表现,是我们表现给玩家看的一个二维数组,可是真正埋好的雷,需要系统去分析,总不能我们把埋雷的数组展示给玩家看吧,因此我们需要创建第二个数组,不妨命名为ture,意为真正的雷阵
char ture [HANGS][LIES];
至于菜单,那利用函数的功能就能够实现啦
void menu()
{
printf("*********************************\n");
printf("*******===>1.开始游戏************\n");
printf("*******===>0.退出游戏************\n");
printf("*********************************\n");
}
(2)将雷阵初始化
创建完两个数组以及菜单,我们就应该着手去考虑各种麻烦事了,很多同学在这就把它想的多复杂多复杂,但事实并不会很复杂,只要我们能够运用函数的知识,这些问题就迎刃而解了。下面,将全程利用代码片和注释来给大家演示函数的构造:
void start(char arr[HANGS][LIES], int hangs, int lies, char set)
{
int i;
for (i = 0; i < hangs; i++)
{
int j;
for (j = 0; j < lies; j++)
{
arr[i][j] = set;
}
}
}
(3)布置雷
void put(char arr[HANGS][LIES], int hangs, int lies)
{
int count = easy;
while (count)
{
int x = rand() % 9 + 1;
int y = rand() % 9 + 1;
if (arr[x][y] == '0')
{
arr[x][y] = '1';
count--;
}
}
}
(4)打印雷
关于打印雷,我们一开始是像上面 图(1) 一般,直接打印出二维数组,但是结果是一堆的星号,连坐标是什么都不清楚,还得要慢慢数,及其的不方便,于是后来我们决定把行号和列号顺带打印了,这里也花费了不少功夫了,具体如下
void display(char arr[HANGS][LIES], int hangs, int lies)
{int i;
printf("-----扫雷游戏------\n");
int j;
for (j = 0; j <=lies; j++)
{
printf("%d ", j);
}
printf("\n");//打印上坐标
for (i = 1; i <= hangs; i++)
{
printf("%d ", i);//打印下坐标
int j;
for (j = 1; j <=lies; j++)
{
printf("%c ", arr[i][j]);
}
printf("\n");
}
printf("-----扫雷游戏------\n");
}
(5)排除雷
void avoid(char arr1[HANGS][LIES], char arr2[HANGS][LIES], int hangs, int lies)
{
int x, y;
int count = hangs * lies - easy;
do
{
int flag=0;
printf("请输入坐标值:");
do
{
scanf("%d %d", &x, &y);
if (x > HANG || y > LIE)
{
flag = 1;
printf("输入的坐标超出范围,请重新输入");
}
else
flag = 0;
}
while (flag);//判断输入的范围是否错误
if (arr1[x][y] == '1')
{
printf("对不起,你被炸死了\n要再来一次吗?\n");
break;
}
else
{
int l;
l = arr1[x - 1][y - 1] - '0'
+ arr1[x][y - 1] - '0'
+ arr1[x + 1][y - 1] - '0'
+ arr1[x - 1][y] - '0'
+ arr1[x + 1][y] - '0'
+ arr1[x - 1][y + 1] - '0'
+ arr1[x][y + 1] - '0'
+ arr1[x + 1][y + 1] - '0';
arr2[x][y] = '0' + l;
display(arr2, hangs, lies);
count--;
}
if (count == 0)
printf("恭喜你,游戏完成,扫雷成功\n要再来一遍吗?\n");
}
while(count);
}
结果
函数都构造完成啦,接下来不过只是拼图游戏,将游戏主函数构造好,咱们的代码就能够跑起来啦,主函数如下:
int main()
{//菜单
int begin;
srand((unsigned int)time(NULL));
do
{
menu();
scanf("%d", &begin);
switch (begin)
{
case 1:
printf("开始游戏。\n");
game();
break;
case 0:
printf("退出游戏。\n");
break;
default:
printf("输入错误,请重新输入\n");
begin = 1;
}
}
while (begin);
return 0;
}
到这,我们就几乎完成了,至于同学们所说的排雷延申和用鼠标点击排雷,前者需要用到递归的知识,后者则需要用到windows系统的相关知识,这里呢作者就不给大家介绍了(因为作者还是新手,啥也不懂)最后,我们还可以去设置限时游戏时间,这些拓展,就交给屏幕前聪明的你去完成啦,最后,展示效果图~
本篇就到这啦,请大家多多支持~我也会继续努力,来带给大家更多干货的!!!