这个小游戏由VS使用C语言编译,总计两个源文件(zhuti.c和game.c)和一个头文件(game.h)。
陈列如下,而后附有编译说明,最后附有运行结果。
制作不易,请给个点赞吧,球球你了!!!
有问题可以发在评论区或者与作者私聊。
game.h
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define Hang 9
#define Lie 9
#define Hangd Hang+2
#define Lied Lie+2
#define shuliang 10
//初始化数组
void chushihua(char zu[Hangd][Lied], int hangd, int lied, char chu);
//打印数组,即扫雷的区域
void dayin(char zu[Hangd][Lied], int hang, int lie);
//布置雷
void set(char zu[Hangd][Lied], int hang, int lie);
//排雷
void pai(char zu1[Hangd][Lied],char zu2[Hangd][Lied], int hang, int lie);
如上,将使用库函数所需的头文件和定义的数值以及自定义函数的声明放在头文件(game.h)中,在源文件中直接应用game.h即可。
zhuti.c
#include"game.h"
void shi()
{
printf("*****************************\n");
printf("********是否开始游戏********\n");
printf("********1.开始游戏 ********\n");
printf("********0.退出 *********\n");
printf("*****************************\n");
printf("请选择: ");
}
//构建游戏主体
void game()
{
char buzhi[Hangd][Lied] = { 0 };//布置排雷区域
char zhanshi[Hangd][Lied] = { 0 };//展示排雷区域
//初始化雷区
chushihua(buzhi, Hangd, Lied, '0');
chushihua(zhanshi, Hangd, Lied, '*');
//dayin(buzhi, Hang, Lie);
//dayin(zhanshi, Hang, Lie);
//布置雷
set(buzhi, Hang, Lie);
dayin(buzhi, Hang, Lie);
//dayin(zhanshi, Hang, Lie);
//排雷
pai(buzhi,zhanshi, Hang, Lie);
}
int main()
{
srand((unsigned int)time(NULL));
int a = 0;
do
{
shi();
scanf_s("%d", &a);
switch (a)
{
case 1:
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("输入错误,请重新弄输入\n");
break;
}
}
while (a);
return 0;
}
先确定函数主体,即由“int main()”开始,及以后部分。其上为两个自定义函数,其中"game()"中又包含大量自定义函数,都在game.c中。
而后大量使用自定义函数实现目的。
分析扫雷游戏,使用二维数组代替棋盘,需要两个二维数组,一个用于布置雷,另一个用于展示并排除雷。
如上,使用1来表示雷,0来表示没有雷(第一个数组)。在展示时不能透露信息,所以全部都是“*”。
game.c
#include"game.h"
void chushihua(char zu[Hangd][Lied], int hangd, int lied, char chu)
{
int a, b;
for (a = 0; a < hangd; a++)
{
for (b = 0; b < lied; b++)
{
zu[a][b] = chu;
}
}
}
void dayin(char zu[Hangd][Lied], int hang, int lie)
{
int a, b;
for (a = 0; a <= hang; a++)
{
printf("%d ", a);
}
printf("\n");
for (a = 1; a <= hang; a++)
{
printf("%d ", a);
for (b = 1; b <= lie; b++)
{
printf("%c ", zu[a][b]);
}
printf("\n");
}
}
void set(char zu[Hangd][Lied], int hang, int lie)
{
int x, y;
int z = shuliang;
while (z)
{
x = rand() % hang + 1;
y = rand() % lie + 1;
if (zu[x][y] == '0')
{
zu[x][y] = '1';
z--;
}
}
}
int bian(char zu[Hangd][Lied], int x, int y)
{
int e=0;
e = zu[x - 1][y - 1] + zu[x - 1][y] + zu[x - 1][y + 1] + zu[x][y - 1] + zu[x][y + 1] + zu[x + 1][y - 1] + zu[x + 1][y] + zu[x + 1][y + 1] - 8 * '0';
return e;
}
void pai(char zu1[Hangd][Lied],char zu2[Hangd][Lied], int hang, int lie)
{
int x = 0;
int y = 0;
int z = 0;
int h = Hang * Lie - shuliang;//即没有雷的区域个数
while (h)
{
printf("请输入想排除的坐标:");
scanf_s("%d %d", &x, &y);
if (zu1[x][y] == '1')
{
printf("你被炸死了\n");
break;
}
if(zu1[x][y]=='0')
{
z=bian(zu1,x,y);
zu2[x][y] =z+'0';
dayin(zu2, Hang, Lie);
h--;
}
}
printf("恭喜你,排除了所有的雷\n");
}
chushihua() : 先让数组全为“0”或“*”。
dayin() : 利用循环语句打印出数组(棋盘),包含行号及列号。效果如下:
下为本人分支循环语句解析:CSDNhttps://mp.csdn.net/mp_blog/creation/editor/135820530
set() : 布置雷,应用了分支循环语句。
pai() : 排除雷,需注意"bian()",为自定义用于展现排除区域周边的雷的个数的函数。
然后,雷的个数,区域大小是可以改变的。"game.h"中lshulian之后的数字影响雷的数量,lie和hang之后的数字影响区域大小。
最后,附上运行效果(为了方便,设置了80个雷):