首先创立三个文件存放代码。
test.c(游戏的整体逻辑),game.h(声明函数),game.c(函数的实现)。
打印菜单——>初始化棋盘——>布置雷——>打印菜单观察雷的布置情况——>输入坐标排查雷——>排查完毕,游戏结束 || 被炸死,再次选择是否开始游戏。
函数都是在 game.h 中声明,在 game.c 中实现。
用函数来实现是否开始游戏,而且每次游戏前打印出菜单,再进行是否开始游戏的判断
1.打印菜单
#include<stdio.h>
void menu()
{
printf("*********************\n");
printf("****1. 开始游戏 ****\n");
printf("****0. 游戏结束 ****\n");
printf("*********************\n");
}
int main()
{
menu();
return 0;
}
每次游戏结束后再开始游戏,并再次的进行打印菜单,循环语句来实现(用 do.....while()语句较为合适),并且设置选项,来选择是否进入游戏,菜单在游戏开始前就打印。由于输入 1 开始游戏,输入 0 结束游戏,输入其他的重新选择,所以while()中的判断语句应选择输入的值较为合适。
在选择 1 的时候,就要开始游戏的实现了,所以创建一个game()函数,存放在case 1 中,来实现游戏。
2.初始化棋盘
在进行布置雷之前,我们先进行棋盘的初始化,用 InitBoard() 函数来初始化棋盘,再用 DisPlayBoard()函数来进行打印棋盘,观察是否初始化成功,初始化后再进行存放雷。我们用 ‘0’ 来进行棋盘的初始化。并且用 ‘*’ 来挡住棋盘布置的雷。排雷的过程中是以3*3为范围的,在布置时多加两行两列来使最外围的雷可在排查范围内。在 game.h 中用 define 来表示棋盘大小,以及所布置的雷的个数。
在 game.h 中声明函数,在 game.c 中实现函数,在 test.c 中写出函数
test.c中
void game()
{
char arr1[hangs][lanns] = { 0 };
char arr2[hangs][lanns] = { 0 };
InitBoard(arr1, hangs, lanns, '0');//初始化棋盘
InitBoard(arr2, hangs, lanns, '*');
DisPlayBoard(arr1, hang, lann);//打印棋盘
DisPlayBoard(arr2, hang, lann);
}
game.h中
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#define hang 9 //行
#define lann 9 //列
#define hangs hang + 2
#define lanns lann + 2
#define counts 10
//声明函数,初始化棋盘
void InitBoard(char arr[hangs][lanns], int hs, int ls, char set);
//打印棋盘,标明行列号
void DisPlayBoard(char arr[hangs][lanns], int h, int l);
game.c中
#include "game.h"
void InitBoard(char arr[hangs][lanns], int hs, int ls, char set)
{
int i, j;
for (i = 0; i < hs; i++)
{
for (j = 0; j < ls; j++)
{
arr[i][j] = set;
}
}
}
void DisPlayBoard(char arr[hangs][lanns], int h, int l)
{
int i, j;
printf(" -----扫雷游戏-----\n");
for (j = 0; j <= l; j++)
{
printf("%2d ", j);
}
printf("\n");
for (i = 1; i <= h; i++)
{
printf("%2d ", i);
for (j = 1; j <= l; j++)
{
printf("%2c ", arr[i][j]);
}
printf("\n");
}
}
3.布置雷
对初始化的 ‘0’ 进行布置雷,当 ‘0’ 变成 ‘1’ 时,则表示该位置是雷,我们用 Setarr1()函数来进行布置雷。为了使所布置的雷随机,我们使用 srand((unsigned int)time(NULL))(使每次生成的随机数都不同)和 rand()(a+rand()%(b-a+1)可以生成一个a-b之间的随机数)来实现安排雷的坐标随机,再用到 rand()和 srand()时包含对应头文件 #include<time.h> 和 #include<stdlib.h> 。由于我们在小的棋盘布置雷,大的棋盘排雷,所以布置的雷范围是 lang 和 lann 的值。只有在布置成功时,count(雷的个数)才会减 1 ,直到布满十个雷。
test.c 中
void game()
{
char arr1[hangs][lanns] = { 0 };
char arr2[hangs][lanns] = { 0 };
InitBoard(arr1,hangs,lanns,'0');//初始化棋盘
InitBoard(arr2,hangs,lanns,'*');
Setarr1(arr1,hang,lann);//布置雷,存放在arr1数组中
}
game.c 中
void Setarr1(char arr[hangs][lanns], int h, int l)
{
int count = counts;
while(count)
{
int x = rand() % h + 1;
int y = rand() % l + 1;
{
if (arr[x][y] == '0')
{
arr[x][y] = '1';
count--;
}
}
}
}
game.h 中
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#define hang 9 //行
#define lann 9 //列
#define hangs hang + 2
#define lanns lann + 2
#define counts 10
//声明函数,初始化棋盘
void InitBoard(char arr[hangs][lanns], int hs, int ls, char set);
//打印棋盘,标明行列号
void DisPlayBoard(char arr[hangs][lanns], int h, int l);
//布置雷
void Setarr1(char arr[hangs][lanns], int h, int l);
4.打印棋盘布置情况
用 DisPlayBoard()函数来进行打印棋盘,观察是否布雷成功。
5. 排查雷
使用 Findarr1()函数来进行雷的排查,由于需要多次输入,用 while()循环来实现,判断条件为排查完的坐标即 w < h * l - counts 时候,循环继续;当w <==h * l - counts 时,排查完毕,获得胜利。在函数中使用 GetArr1Count()函数来计算周围雷的个数。先在 Findarr1()函数中使用 if()语句判断输入的坐标是否合法,再判断该坐标是否为雷,若为雷,则跳出循环,若不是雷,则用 GetArr1Count()函数统计周围雷的个数。
Findarr1()函数和 GetArr1Count()函数
int GetArr1Count(char arr1[hangs][lanns],int x,int y)// 统计坐标周围雷的个数
{
int count = 0;
for (int i = x - 1; i <= x + 1; i++)
{
for (int j = y - 1; j <= y + 1; j++)
{
count += (arr1[i][j] - '0');
}
}
return count;
}
void Findarr1(char arr1[hangs][lanns], char arr2[hangs][lanns], int h, int l)
{
int x = 0;
int y = 0;
int w = 0;
while(w < h * l - counts)
{
printf("请输入排查的坐标:");
scanf("%d %d", &x, &y);
if (x >= 1 && x <= h && y >=1 && y<= l) //判断坐标的有效性
{
if (arr1[x][y] == '1')//输入坐标是雷
{
printf("很遗憾,你被炸死了\n");
DisPlayBoard(arr1, hang, lann);
break;
}
else
{
int count =GetArr1Count(arr1,x,y);//该坐标不是雷,周围有几个雷。
arr2[x][y] = count + '0';
DisPlayBoard(arr2, hang, lann);// 每次排完显示棋盘
w++;
}
}
else
{
printf("坐标不合适,请重新输入\n");
}
}
if (w == h * l - counts)
{
printf("恭喜你,排雷成功\n");
DisPlayBoard(arr1, hang, lann);
}
}
最后整体代码如下:(所使用头文件包含于 game.h 中,game.c 和 test.c 引用 #include "game.h"即可使用头文件)
game.h 中
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#define hang 9 //行
#define lann 9 //列
#define hangs hang + 2
#define lanns lann + 2
#define counts 10
//声明函数,初始化棋盘
void InitBoard(char arr[hangs][lanns], int hs, int ls, char set);
//打印棋盘,标明行列号
void DisPlayBoard(char arr[hangs][lanns], int h, int l);
//布置雷
void Setarr1(char arr[hangs][lanns], int h, int l);
//排查雷
void Findarr1(char arr1[hangs][lanns], char arr2[hangs][lanns], int h, int l);
game.c 中
#define _CRT_SECURE_NO_WARNINGS
#include "game.h"
void InitBoard(char arr[hangs][lanns], int hs, int ls, char set)
{
int i,j;
for (i = 0; i < hs; i++)
{
for (j = 0; j < ls; j++)
{
arr[i][j] = set;
}
}
}
void DisPlayBoard(char arr[hangs][lanns], int h, int l)
{
int i,j;
printf(" -----扫雷游戏-----\n");
for (j = 0; j <= l; j++)
{
printf("%2d ", j);
}
printf("\n");
for (i = 1; i <= h; i++)
{
printf("%2d ", i);
for (j = 1; j <= l; j++)
{
printf("%2c ",arr[i][j]);
}
printf("\n");
}
}
void Setarr1(char arr[hangs][lanns], int h, int l)
{
int count = counts;
while(count)
{
int x = rand() % h + 1;
int y = rand() % l + 1;
{
if (arr[x][y] == '0')
{
arr[x][y] = '1';
count--;
}
}
}
}
int GetArr1Count(char arr1[hangs][lanns],int x,int y)// 统计坐标周围雷的个数
{
int count = 0;
for (int i = x - 1; i <= x + 1; i++)
{
for (int j = y - 1; j <= y + 1; j++)
{
count += (arr1[i][j] - '0');
}
}
return count;
}
void Findarr1(char arr1[hangs][lanns], char arr2[hangs][lanns], int h, int l)
{
int x = 0;
int y = 0;
int w = 0;
while(w < h * l - counts)
{
printf("请输入排查的坐标:");
scanf("%d %d", &x, &y);
if (x >= 1 && x <= h && y >=1 && y<= l) //判断坐标的有效性
{
if (arr1[x][y] == '1')//输入坐标是雷
{
printf("很遗憾,你被炸死了\n");
DisPlayBoard(arr1, hang, lann);
break;
}
else
{
int count =GetArr1Count(arr1,x,y);//该坐标不是雷,周围有几个雷。
arr2[x][y] = count + '0';
DisPlayBoard(arr2, hang, lann);// 每次排完显示棋盘
w++;
}
}
else
{
printf("坐标不合适,请重新输入\n");
}
}
if (w == h * l - counts)
{
printf("恭喜你,排雷成功\n");
DisPlayBoard(arr1, hang, lann);
}
}
test.c 中
#define _CRT_SECURE_NO_WARNINGS
#include "game.h"
void menu()
{
printf("*********************\n");
printf("****1. 开始游戏 ****\n");
printf("****0. 游戏结束 ****\n");
printf("*********************\n");
}
void game()
{
char arr1[hangs][lanns] = { 0 };
char arr2[hangs][lanns] = { 0 };
InitBoard(arr1,hangs,lanns,'0');//初始化棋盘
InitBoard(arr2,hangs,lanns,'*');
Setarr1(arr1,hang,lann);//布置雷,存放在arr1数组中
DisPlayBoard(arr1, hang, lann);//打印棋盘
DisPlayBoard(arr2, hang, lann);
Findarr1(arr1,arr2,hang,lann);//排查雷
}
int main()
{
srand((unsigned int)time(NULL));
int input = 0;
do
{
menu();
printf("请输入一个数\n");
scanf("%d",&input);
switch (input)
{
case 1:
game();//实现扫雷游戏
break;
case 0:
printf("游戏结束\n");
break;
default:
printf("选择错误,请从新选择\n");
break;
}
} while(input);
return 0;
}
运行结果: