目录
实现扫雷的前提首先要明白扫雷的规则,然后才能使用代码进行实现。其中扫雷的规则如下:
(1)游戏规则:
(2)如何进行统计周围类的个数:
实现的原理
(1)思路分析
(2)分析里面具体有哪些功能
(3)通过函数实现上面需要的功能
(4)具体实现源码
当点击需要选中对应的坐标时,如果当前位置有雷则游戏结束,若当前位置没有雷则会将当前周围有几个雷的信息显示在你选择的位置上。
统计雷的数量一般是在一个3*3的方格中进行统计,如果用1表示为雷,0表示没有雷,如下图所示,中间格子会显示周围共有多少个雷(下面例子中周围有3个雷):
规则讲完,接着就是如何进行实现,首先需要分析是用什么来表示扫雷区域,我们在这里使用二维数组进行实现,那么如果需要一个9*9的扫雷区,则需要有一个11*11的二维数组,是因为当统计二维数组边和角的时候比较方便,例如下图所示,是一个11*11的大小:
当给用户显示,和进行布置雷的区域只需要在下图黄色的区域进行布置:
首先需要创建一个扫雷的区域并且展示给玩家,这里使用二维字符数组进行实现,这里需要创建两个区域,一个是显示给用户的,一个是系统内部进行统计玩家是个否能够胜利和设置雷的数量的
1.需要将两个区域进行初始化
2.创建之前首先要进行显示给用户一个区域
3.需要布置雷的位置
4.需要得到周围雷的数量
5.需要给判断玩家是否胜利
1.初始化
其中字符c是用什么字符来进行初始化,这里我使用*初始化玩家区域,使用0来初始化雷的棋盘
,之后在源码中调用会看到。
void InitBoard(char board[][COLS], int rows, int cols,char c){//初始化雷盘
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < cols;j++)
{
board[i][j] = c;
}
}
}
2.显示给玩家:
其中首先打印的是棋盘的列号,接着打印行号和每行的内容,打印行列号是为了之后方便玩家进行选位置
void ShowBoard(char board[][COLS], int row, int col){//展示雷盘
for (int i = 0; i <= col; i++)
{
printf("%d ",i);//打印棋盘的坐标
}
printf("\n");
for (int i = 1; i <= row; i++)
{
printf("%d ",i);
for (int j = 1; j <= col; j++)
{
printf("%c ",board[i][j]);
}
printf("\n");
}
}
3.设置周围雷的个数
这里使用随机数来进行布置雷
void SetMine(char mine[][COLS], int row, int col){
int count = MINE_COUNT;//雷的总数
while (count)
{
int x = rand ()% 9+1;//[1,9]
int y = rand() % 9 + 1;
if (mine[x][y] == '0')//判断改为是否有雷
{
mine[x][y] = '1';
count--;
}
}
4.得到周围雷的个数
这里使用字符数组进行实现,当字符数字减去字符0结果就是整形数字,所以使用下面方法进行统计
static int GetMine(char mine[][COLS],int rows,int cols,int x,int y){
return mine[x - 1][y - 1] + mine[x - 1][y] + mine[x - 1][y + 1]
+ mine[x][y - 1] + mine[x][y + 1] + mine[x + 1][y - 1]
+ mine[x + 1][y] + mine[x + 1][y + 1] - 8 * '0';
}
5.判断玩家是否胜利
如果玩家坐标合法,进行下一步
这里使用step来判断玩家走了多少步,若是所以步都没有雷,则会退出循环,显示玩家获胜;否则踩雷,失败
void play(char userboard[][COLS],char mineboard[][COLS],int row,int col){
int step = row*col-MINE_COUNT;
int x, y;
while (step)
{
printf("请输入坐标x,y:\n");//坐标输入时要用分号隔开,否则会出现错误
scanf("%d,%d", &x, &y);
if (x >= 1 && x <= 9 && y >= 1 && y <= 9)//符合
{
if (mineboard[x][y] == '1')//是雷
{
printf("踩到雷,游戏结束\n");
ShowBoard(mineboard,row,col);
break;
}
else//非雷
{
int count = GetMine(mineboard, row, col, x, y);//雷的数量
userboard[x][y] = count+'0';//将用户点的位置设置为周围雷的个数
ShowBoard(userboard,row,col);
step--;
}
}
else
{
printf("输入坐标有误,重新输入");
}
}
if (step == 0)
{
printf("恭喜你,游戏胜利\n");
}
}
请访问下面链接进行查看和下载:
董祥/learn - Gitee.com